36

假设我们有一个名为 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 的结果?

谢谢

4

1 回答 1

64

为什么 nm 没有给出条带化 libtest.so 的结果

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

如果strip删除两个符号表,您的库将完全没用:动态加载器无法解析其中的任何符号。strip唯一有意义的事情也是如此:删除“常规”符号表,保持动态符号表完好无损。

nm -D您可以使用或来查看动态符号表中的符号readelf -s

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

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

于 2012-04-01T02:55:37.657 回答