我如何列出从一个.so文件导出的符号?如果可能的话,我还想知道它们的来源(例如,如果它们是从静态库中提取的)。
我使用的是gcc 4.0.2,如果有区别的话。
我如何列出从一个.so文件导出的符号?如果可能的话,我还想知道它们的来源(例如,如果它们是从静态库中提取的)。
我使用的是gcc 4.0.2,如果有区别的话。
当前回答
objdump -TC /usr/lib/libexample.so
其他回答
列出符号的标准工具是nm,你可以这样简单地使用它:
nm -gD yourLib.so
如果你想看到c++库的符号,添加“-C”选项,它需要这些符号(它的可读性要强得多)。
nm -gDC yourLib.so
如果你的.so文件是elf格式的,你有两个选择:
objdump (-C也可用于调用c++):
$ objdump -TC libz.so
libz.so: file format elf64-x86-64
DYNAMIC SYMBOL TABLE:
0000000000002010 l d .init 0000000000000000 .init
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 free
0000000000000000 DF *UND* 0000000000000000 GLIBC_2.2.5 __errno_location
0000000000000000 w D *UND* 0000000000000000 _ITM_deregisterTMCloneTable
或者使用readelf:
$ readelf -Ws libz.so
Symbol table '.dynsym' contains 112 entries:
Num: Value Size Type Bind Vis Ndx Name
0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND
1: 0000000000002010 0 SECTION LOCAL DEFAULT 10
2: 0000000000000000 0 FUNC GLOBAL DEFAULT UND free@GLIBC_2.2.5 (14)
3: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __errno_location@GLIBC_2.2.5 (14)
4: 0000000000000000 0 NOTYPE WEAK DEFAULT UND _ITM_deregisterTMCloneTable
objdump -TC /usr/lib/libexample.so
对于共享库libNAME。所以-D开关是必要的,以查看符号在我的Linux
nm -D libNAME.so
并为静态库如别人所报道
nm -g libNAME.a
如果你只是想知道是否有符号存在,你可以使用
objdump -h /path/to/object
或者列出调试信息
objdump -g /path/to/object
尝试在nm标志中添加-l,以获得每个符号的源。如果库是用调试信息(gcc -g)编译的,这应该是源文件和行号。正如Konrad所说,在这一点上,对象文件/静态库可能是未知的。