如何列出从.so文件导出的符号?如果可能的话,我也想知道它们的来源(例如,是否从静态库中提取它们)。

我正在使用gcc 4.0.2,如果有区别的话。

最佳答案

列出符号的标准工具是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

10-06 13:50