Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux nm vs;readelf-s";_Linux_Nm_Readelf - Fatal编程技术网

Linux nm vs;readelf-s";

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

假设我们有一个名为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 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之间的区别,因为你告诉我我所理解的是不正确的。请你再详细说明一下好吗?