我怎么名单的符号中的一个。这样的文件
-
09-06-2019 - |
题
我怎么名单的符号正在出口的一个。这样的文件?如果可能的话,我也想知道他们的来源(例如如果他们是拉在从一个静态的图书馆)。
我使用的海湾合作委员会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海湾合作委员会的能见度 似乎没有任何影响,因为所有的符号,总是可见 纳米 -直到我发现这个职位,指出我 利用readelf 和 objdump, ,这让我意识到,似乎有可实际上 两个 符号表:
- 一个你可以列表 纳米
- 一个你可以列表 利用readelf 和 objdump
我认为前者包含调试的符号可能被剥夺与 条 或者-s开关,你可以给接头或 安装 命令。而且,即使纳米并没有列出任何东西了,你的口号仍然是出口,因为他们是在精灵"动态的符号表",这是后者。
尝试加入-我的纳米标志,以便获得来源的每一个符号。如果库编制与调试的信息(海湾合作委员会-g)这应该是源文件和行的数量。因为康拉德说,目文件/静态的图书馆可能是未知的,在这一点上。
对于安卓 .so
文件中,本工具链配备所需工具中提到的其他答案: readelf
, objdump
和 nm
.
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)
你可以使用 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