关于c ++:如何列出.so文件中的符号

关于c ++:如何列出.so文件中的符号

How do I list the symbols in a .so file

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

我正在使用gcc 4.0.2,如果这有所不同。


列出符号的标准工具是nm,您可以像这样使用它:

1
nm -g yourLib.so

如果要查看C ++库的符号,请添加"-C"选项,该符号对符号进行解码(它的解码性更强)。

1
nm -gC yourLib.so

如果您的.so文件是elf格式,您有两种选择:

objdump(-C对于解压缩C ++也很有用):

1
2
3
4
5
6
7
8
9
$ 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

1
2
3
4
5
6
7
8
$ 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

如果.so文件是elf格式,则可以使用readelf程序从二进制文件中提取符号信息。此命令将为您提供符号表:

1
readelf -Ws /usr/lib/libexample.so

您只应提取在此.so文件中定义的那些文件,而不是在它引用的库中。在这种情况下,第七列应包含数字。您可以使用简单的正则表达式提取它:

1
readelf -Ws /usr/lib/libstdc++.so.6 | grep '^\([[:space:]]\+[^[:space:]]\+\)\{6\}[[:space:]]\+[[:digit:]]\+'

或者,正如Caspin所建议的那样:

1
readelf -Ws /usr/lib/libstdc++.so.6 | awk '{print $8}';


1
objdump -TC /usr/lib/libexample.so

对于共享库libNAME.so,在我的Linux中查看符号需要-D开关

1
nm -D libNAME.so

以及其他人报告的静态库

1
nm -g libNAME.a

我一直想知道为什么-fvisibility = hidden和#pragma GCC可见性似乎没有任何影响,因为所有的符号总是用nm显示 - 直到我发现这篇帖子指向readelf和objdump,这让我意识到那里似乎实际上是两个符号表:

  • 你可以用nm列出的那个
  • 你可以用readelf和objdump列出的那个

我认为前者包含可以使用strip剥离的调试符号或者可以为链接器或install命令提供的-s开关。即使nm不再列出任何内容,导出的符号仍会导出,因为它们位于ELF"动态符号表"中,后者是后者。


对于C ++ .so文件,最终的nm命令是??nm --demangle --dynamic --defined-only --extern-only

1
2
3
4
5
6
7
# nm --demangle --dynamic --defined-only --extern-only /usr/lib64/libqpid-proton-cpp.so | grep work | grep add
0000000000049500 T proton::work_queue::add(proton::internal::v03::work)
0000000000049580 T proton::work_queue::add(proton::void_function0&)
000000000002e7b0 W proton::work_queue::impl::add_void(proton::internal::v03::work)
000000000002b1f0 T proton::container::impl::add_work_queue()
000000000002dc50 T proton::container::impl::container_work_queue::add(proton::internal::v03::work)
000000000002db60 T proton::container::impl::connection_work_queue::add(proton::internal::v03::work)

来源:https://stackoverflow.com/a/43257338


对于Android .so文件,NDK工具链附带了其他答案中提到的必需工具:readelfobjdumpnm


尝试将-l添加到nm标志以获取每个符号的来源。如果使用调试信息(gcc -g)编译库,则应该是源文件和行号。正如Konrad所说,此时对象文件/静态库可能是未知的。


您可以使用binutils工具链中的nm -g工具。但是,它们的来源并不总是随时可用。我甚至不确定是否总能检索到这些信息。也许objcopy揭示了更多信息。

/编辑:工具的名称当然是nm。标志-g用于仅显示导出的符号。


nm -g列出extern变量,这不是必需的导出符号。
任何非静态文件范围变量(在C中)都是外部变量。

nm -D将列出动态表中的符号,您可以通过dlsym找到它的地址。

nm --version

GNU nm 2.17.50.0.6-12.el5 20061020


如果您只想知道是否有符号存在,您可以使用

1
objdump -h /path/to/object

或列出调试信息

1
objdump -g /path/to/object


推荐阅读

    linux改文件权限命令?

    linux改文件权限命令?,系统,工具,档案,权限,文件,信息,命令,目录,选项,用户,

    linux命令联想工具?

    linux命令联想工具?,地址,工作,系统,工具,状态,标准,信息,命令,目录,左下角,L

    linux命令交换文件名?

    linux命令交换文件名?,命令,文件,数据,名称,工具,地址,软件,系统,基础知识,

    linux下替换文件命令?

    linux下替换文件命令?,文件,一致,评论,名称,标的,资料,工作,命令,字符串,内

    linux文件nl命令?

    linux文件nl命令?,地址,工作,信息,系统,情况,标准,实时,对比,百度,命令,linux

    linux寻找文件夹命令?

    linux寻找文件夹命令?,名称,命令,文件,位置,工作,标准,目录,子目录,文件名,

    linux跳到文件尾命令?

    linux跳到文件尾命令?,系统,文件,命令,管理,状态,实时,末尾,光标,内容,编辑,l

    linux把文件复制命令?

    linux把文件复制命令?,名字,文件,软件,系统,位置,目录,命令,源文件,目标,文

    linux文件夹合并命令?

    linux文件夹合并命令?,文件,对比,第一,下来,命令,文件夹,两个,字段,内容,数

    linux下文件创建命令?

    linux下文件创建命令?,名字,名称,首次,命令,文件,系统,密码,文件名,文件夹,

    linux命令行安装文件?

    linux命令行安装文件?,软件,官网,密码,中心,电脑,文件,命令,终端,指令,版本,L

    linux文件解包命令?

    linux文件解包命令?,系统,地址,命令,文件,管理,手机,数据,工具,标准,单位,lin

    列出熟悉的linux命令?

    列出熟悉的linux命令?,工作,系统,地址,信息,命令,网络,工具,标准,管理,目录,L

    linux解压文件命令行?

    linux解压文件命令行?,系统,电脑,命令,文件,平台,名称,软件,管理,标准,目录,

    linux命令编辑文件?

    linux命令编辑文件?,系统,状态,电脑,命令,数据,标准,不了,名称,发行,网络,Lin

    linux文件乱码命令?

    linux文件乱码命令?,系统,环境,乱码,信息,状态,盘中,文件,字符集,中文,文件

    linux的删除文件命令?

    linux的删除文件命令?,名称,不了,系统,文件夹,命令,文件,环境,档案,目录,指

    linux赋值文件命令?

    linux赋值文件命令?,标准,数据,系统,状态,命令,赋值,变量,权限,文件,脚本,lin

    列出常用的linux命令?

    列出常用的linux命令?,工作,地址,系统,信息,管理,目录,命令,标准,文件,功能,L