1、如何查看一个静态库中包含那些.o文件:
ar -t lib_libname.a
# cd /usr/lib/gcc/i386-redhat-linux/4.1.2
# mkdir test //建立一个试验目录,试验完后容易删除
# cp libstdc++.a test/libstdc++.a
# cd test
# ls
libstdc++.a
# ar -x libstdc++.a //extract file(s) from the archive
# ls //所有.o文件便是从静态库libstdc++.a中释放出来的
...
atomicity.o eh_call.o istream-inst.o pool_allocator.o
basic_file.o eh_catch.o istream.o pure.o
bitmap_allocator.o eh_exception.o libstdc++.a sstream-inst.o
c++locale.o eh_globals.o limits.o stdexcept.o
codecvt_members.o eh_personality.o list.o streambuf-inst.o
...
ctype.o functexcept.o misc-inst.o tree.o
debug_list.o globals_io.o monetary_members.o valarray-inst.o
debug.o globals_locale.o mt_allocator.o vec.o
del_opnt.o guard.o new_handler.o vterminate.o
...
eh_arm.o ios.o numeric_members.o
我们也可以使用nm命令直接查看tree.o的相关信息。
# nm -A tree.o
tree.o:00000000 T _ZSt18_Rb_tree_decrementPKSt18_Rb_tree_node_base
tree.o:00000000 T _ZSt18_Rb_tree_decrementPSt18_Rb_tree_node_base
tree.o:00000000 T _ZSt18_Rb_tree_incrementPKSt18_Rb_tree_node_base
tree.o:00000000 T _ZSt18_Rb_tree_incrementPSt18_Rb_tree_node_base
tree.o:00000000 T _ZSt20_Rb_tree_black_countPKSt18_Rb_tree_node_baseS1_
tree.o:00000000 T _ZSt20_Rb_tree_rotate_leftPSt18_Rb_tree_node_baseRS0_
tree.o:00000000 T _ZSt21_Rb_tree_rotate_rightPSt18_Rb_tree_node_baseRS0_
tree.o:00000000 T _ZSt28_Rb_tree_rebalance_for_erasePSt18_Rb_tree_node_baseRS_
tree.o:00000000 T _ZSt29_Rb_tree_insert_and_rebalancebPSt18_Rb_tree_node_baseS0_RS_
tree.o: U __gxx_personality_v0
以上符号经demangle后分别与以下命令的结果相对应。
# nm -C tree.o
00000000 T std::_Rb_tree_decrement(std::_Rb_tree_node_base const*)
00000000 T std::_Rb_tree_decrement(std::_Rb_tree_node_base*)
00000000 T std::_Rb_tree_increment(std::_Rb_tree_node_base const*)
00000000 T std::_Rb_tree_increment(std::_Rb_tree_node_base*)
00000000 T std::_Rb_tree_black_count(std::_Rb_tree_node_base const*, std::_Rb_tree_node_base const*)
00000000 T std::_Rb_tree_rotate_left(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*&)
00000000 T std::_Rb_tree_rotate_right(std::_Rb_tree_node_base*, std::_Rb_tree_node_base*&)
00000000 T std::_Rb_tree_rebalance_for_erase(std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)
00000000 T std::_Rb_tree_insert_and_rebalance(bool, std::_Rb_tree_node_base*, std::_Rb_tree_node_base*, std::_Rb_tree_node_base&)
U __gxx_personality_v0