2012-04-01 64 views
30

假设我们有libtest.so命名的共享库中,有一个“foo”函数在它纳米与“readelf -s”

使用条从丢弃所有符号libtest.so

$strip libtest.so 

所以,现在如果我们使用:

$nm libtest.so 

它会打印出:

处:libtest.so:无符号

,但是如果我们使用:

$readelf -s libtest.so 

富功能仍然可以从它的结果中可以看出:

...

10:000005dc 5 FUNC全局默认12 _Z3foov

...

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

$strings libtest.so 

...

_Z3foov

...

这里是我的问题,为什么nm的给出了条纹libtest.so没有结果?

感谢

回答

48

nm的原因没有给出结果的条纹libtest.so

2个libtest.so符号表: “常规” 之一(在.symtab.strtab节)和一个动态的(在.dynsym.dynstr部分)。

如果strip取出两个符号表,你的资料库是完全无用的:在它的动态加载器解决不了任何符号。所以strip是唯一有意义的东西:删除“常规”符号表,保持动态完整。

你可以看到在动态符号表中的符号与nm -Dreadelf -s

“常规”符号表是有用的,只有进行调试(例如,它包含静态函数,这是不通过库输出,并且不要在动态符号表中显示的条目)。

但是,动态加载程序从未着眼于“普通”符号表(这是不是在合适的格式快速查找符号);只有在动态的一个。所以正常的程序操作不需要“常规”符号表,但动态的是。

+1

您的用户名太棒了。 因此,基本上,如果我在编译时将静态库链接到二进制文件,库的符号将以nm显示,但如果我进行动态链接,这些符号将显示在readelf -S和nm -D中,是正确的吗? – acib708 2015-02-18 15:33:41

+0

@AlejandroCárdenas我不相信你的理解是完全正确的。另外,'readelf -s'和'readelf -S'有区别。问一个单独的问题可能会更好。 – 2015-02-18 17:12:00

+0

是的,对不起,我的意思是readelf -s。那么,核心问题仍然存在,我不明白nm和readelf -s之间的区别,因为你告诉我我理解的是不正确的。你愿意详细说明一下吗? – acib708 2015-02-18 21:37:52