为什么nm libc.so报告没有符号?

19

我已经做了一个像这样简单的程序:

g++ application.cpp -o application.exe

然后执行了这个命令;

ldd application.exe
...
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 
...

我想列出libc库的所有符号:

nm /lib/x86_64-linux-gnu/libc.so.6
nm: /lib/x86_64-linux-gnu/libc.so.6: no symbols

nm --defined-only /lib/x86_64-linux-gnu/libc.so.6
nm: /lib/x86_64-linux-gnu/libc.so.6: no symbols

为什么nm报告没有符号?如果libc.so.6不是库而是对实际库的某种链接,那我怎么才能找到实际的库呢?


/lib/x86_64-linux-gnu/libc.so.6 是否被剥离?file /lib/x86_64-linux-gnu/libc.so.6 的输出是什么? - ks1322
你可以尝试使用 readelf -s libc.so.6 命令,也可以参考 为什么 nm 不显示 /lib/i386-linux-gnu/libc.so.6 的符号? - Rick
1个回答

34

默认情况下,nm 读取 ELF 对象中的 .symtab 段,在非可重定位对象中是可选的。使用 -D/--dynamic 选项,您可以指示 nm 读取动态符号表(这些符号实际上是在运行时使用的符号)。您可能还想使用 --with-symbol-versions,因为 glibc 广泛使用符号版本。

或者,您可以使用 eu-readelf --symbols=.dynsymobjdump -Tw。(readelf -sDW 不包括符号版本信息。)


1
谢谢!为什么--dynamic不是默认选项呢? - Alexey
“nm” 命令非常古老,当时并不存在动态链接(有些 binutils 目标仍不支持它)。根据对象类型更改数据源可能会太令人困惑。 - Florian Weimer
好的,也许存在更现代和方便的工具来分析库符号吗? - Alexey
1
@FlorianWeimer:有趣的是,我记得1998年的评论已经将nm不默认列出从剥离的.so文件导出的符号视为错误。 - Joshua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接