我怎么名单的符号正在出口的一个。这样的文件?如果可能的话,我也想知道他们的来源(例如如果他们是拉在从一个静态的图书馆)。

我使用的海湾合作委员会4.0.2,如果这有差别。

有帮助吗?

解决方案

标准的工具,用于清单的符号是 nm, 你可以使用它只是这样的:

nm -g yourLib.so

如果你想看到的符号一C++库,添加"C"的选项,它demangle的符号(这是更可读demangled).

nm -gC yourLib.so

如果你的.因此文件是在小精灵格式,你有两个选择:

要么 objdump (-C 也是有用的demangling 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

其他提示

如果你的 .so 文件是在小精灵格式,可以使用利用readelf程序来提取象征信息的二进制的。这个命令给你的符号表:

readelf -Ws /usr/lib/libexample.so

你只应该提取这些定义在这 .so 文件中,而不在库所引用的。第七列应该包含一些在这种情况。你可以提取它通过使用一个简单的regex:

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

或者,如拟议的由 Caspin,:

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

共享库库名称.所以-D开关必要看到的符号在我Linux

nm -D libNAME.so

和静态图书馆报告说通过其他人

nm -g libNAME.a

我一直想知道为什么 -fvisibility=隐藏#pragma海湾合作委员会的能见度 似乎没有任何影响,因为所有的符号,总是可见 纳米 -直到我发现这个职位,指出我 利用readelfobjdump, ,这让我意识到,似乎有可实际上 两个 符号表:

  • 一个你可以列表 纳米
  • 一个你可以列表 利用readelfobjdump

我认为前者包含调试的符号可能被剥夺与 或者-s开关,你可以给接头或 安装 命令。而且,即使纳米并没有列出任何东西了,你的口号仍然是出口,因为他们是在精灵"动态的符号表",这是后者。

尝试加入-我的纳米标志,以便获得来源的每一个符号。如果库编制与调试的信息(海湾合作委员会-g)这应该是源文件和行的数量。因为康拉德说,目文件/静态的图书馆可能是未知的,在这一点上。

对于安卓 .so 文件中,本工具链配备所需工具中提到的其他答案: readelf, objdumpnm.

C++ .so 文件时,最终的 nm 命令 nm --demangle --dynamic --defined-only --extern-only <my.so>

# 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

你可以使用 nm -g 工具,从binutils工具.然而,他们的来源并不总是容易获得。而我实际上不是甚至确保该信息总是可以检索。也许是 objcopy 揭示了进一步的信息。

/编辑:该工具的名称是当然 nm.标志 -g 是用来表明只出口的符号。

纳米-g中列出外部可变的,这是没有必要的出口的符号。任何非静态的文件范围的变量(C)的所有外部可变的。

纳米-D列出的符号中的动态表,你可以找到这地址的dlsym.

纳米--的版本

GNU纳米2.17.50.0.6-12.el5 20061020

如果你只是想知道,如果有的符号 你可以使用

objdump -h /path/to/object

或列出"调试"的信息

objdump -g /path/to/object
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top