如何查看动态链接库(.so)中的文件及目标文件列表?
查看动态链接库(.so)中目标文件相关信息的方法
好问题!先得掰扯清楚静态库和动态链接库的本质区别:静态库(.a)说白了就是一堆目标文件(.o)的打包归档,所以ar -t能直接列出里面的.o文件;但动态链接库(.so)是经过链接器处理后的ELF格式共享二进制文件,它已经把所有输入的.o文件的代码、数据段都合并到一起了,并没有保留单独的.o文件条目。不过我们还是有办法追踪到动态库中来自原始.o文件的信息,具体如下:
借助调试信息查看原始编译单元(对应.o文件)
如果编译动态库时加上了-g参数保留调试符号,那么可以用objdump工具提取调试信息,找到每个原始.o对应的编译单元:objdump --dwarf=info libexample.so | grep -A5 -B5 "DW_TAG_compile_unit"输出结果里的
DW_AT_name字段会显示生成该.o文件的源文件名(比如foo.c),间接对应原始的.o文件。通过符号表追踪.o文件归属
如果没有保留调试信息,但链接时没有去掉符号表(默认编译一般会保留),可以用readelf查看符号,部分符号会携带原始.o文件的信息:readelf -s libexample.so | grep ".o"这种方法的效果取决于编译选项,不一定能覆盖所有.o文件,但能找到一些线索。
如果只是想查看动态库的符号(而非.o文件)
要是你其实只是想确认动态库包含哪些函数/符号,而非原始.o文件列表,那用nm或readelf更直接:# 显示动态符号表 nm -D libexample.so # 或者用readelf readelf -sD libexample.so
总结一下:没有和ar -t完全等价的命令能直接列出.so中的.o文件(因为.so的结构和静态库完全不同),但通过上述工具,我们可以追踪到动态库对应的原始.o文件信息。
内容的提问来源于stack exchange,提问作者Harish Tadikamalla
相关产品推荐
相关产品推荐

