Linux nm vs;readelf-s";
假设我们有一个名为libtest.so的共享库,其中有一个函数“foo” 使用条带放弃libtest.so中的所有符号Linux nm vs;readelf-s";,linux,nm,readelf,Linux,Nm,Readelf,假设我们有一个名为libtest.so的共享库,其中有一个函数“foo” 使用条带放弃libtest.so中的所有符号 $strip libtest.so 那么,现在如果我们使用: $nm libtest.so 它将打印出: nm:libtest.so:无符号 但如果我们使用: $readelf -s libtest.so foo函数仍然可以从其结果中看出: 10:000005dc 5 FUNC全局默认值12_Z3foov 我们还可以使用命令字符串进行检查: $strings lib
$strip libtest.so
那么,现在如果我们使用:
$nm libtest.so
它将打印出:
nm:libtest.so:无符号
但如果我们使用:
$readelf -s libtest.so
foo函数仍然可以从其结果中看出:
10:000005dc 5 FUNC全局默认值12_Z3foov
我们还可以使用命令字符串进行检查:
$strings libtest.so
_Z3foov
这是我的问题,为什么nm没有给出带条libtest.so的结果
谢谢
为什么nm没有给出条纹libtest.so的结果
$strip libtest.so
原始的libtest.so
中有两个符号表:一个“常规”符号表(在.symtab
和.strtab
部分中)和一个动态符号表(在.dynsym
和.dynstr
部分中)
如果strip
删除了两个符号表,则库将完全无用:动态加载程序无法解析其中的任何符号。因此,strip
做了唯一有意义的事情:删除“常规”符号表,保留动态符号表
您可以使用nm-D
或readelf-s
在动态符号表中查看符号
“常规”符号表仅在调试时有用(例如,它包含静态函数的项,这些项不是由库导出的,也不会显示在动态符号表中)
但动态加载程序从不查看“常规”符号表(该表的格式不适合快速符号查找);只有在动态的一个。因此,正确的程序操作不需要“常规”符号表,而需要动态符号表。您的用户名太棒了。所以,基本上,如果我在编译时将一个静态库与一个二进制文件链接,库的符号将显示为nm,但是如果我进行动态链接,符号将显示为readelf-s和nm-D,对吗?@AlejandroCárdenas我不相信你的理解是完全正确的。另外,
readelf-s
和readelf-s
之间也存在差异。也许最好单独问一个问题。是的,对不起,我是说readelf-s。好吧,核心问题仍然是,我不理解nm和readelf-s之间的区别,因为你告诉我我所理解的是不正确的。请你再详细说明一下好吗?