nm vs“readelf -s”

时间:2012-04-01 02:36:58

标签: 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 GLOBAL DEFAULT 12 _Z3foov

...

我们也可以使用命令字符串来检查它:

$strings libtest.so

...

_Z3foov

...

这是我的问题,为什么nm没有为条带化libtest.so提供结果?

由于

1 个答案:

答案 0 :(得分:58)

  

为什么nm没有为条带化libtest.so提供结果

原始libtest.so中有两个符号表:“常规”符号表(在.symtab.strtab部分中)和动态符号表(在.dynsym.dynstr部分。

如果strip删除了两个符号表,那么您的库将完全无用:动态加载程序无法解析其中的任何符号。所以strip做唯一有意义的事情:删除“常规”符号表,保持动态符号表不变。

您可以在动态符号表中看到包含nm -Dreadelf -s的符号。

“常规”符号表仅用于调试(例如,它包含静态函数的条目,这些条目不由库导出,并且不会显示在动态符号表中)。

但是动态加载器从不查看“常规”符号表(其格式不适合快速符号查找);只有在动态的。因此正确的程序操作不需要“常规”符号表,但动态的符号表是。