假设我们有一个名为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的结果?
谢谢
发布于 2012-04-01 10:55:38
为什么nm对条带libtest.so没有给出结果
原始libtest.so中有两个符号表:一个“常规”符号表(在.symtab和.strtab部分中)和一个动态符号表(在.dynsym和.dynstr部分中)。
如果strip删除了这两个符号表,您的库将完全无用:动态加载器无法解析其中的任何符号。所以strip做了唯一有意义的事情:删除“常规”符号表,保持动态符号表不变。
可以使用nm -D或readelf -s在动态符号表中查看符号。
“常规”符号表仅对调试有用(例如,它包含静态函数的条目,这些静态函数不是由库导出的,也不会显示在动态符号表中)。
但是动态加载器从不查看“常规”符号表(其格式不适合快速符号查找);只查看动态符号表。因此,正确的程序操作不需要“常规”符号表,而需要动态符号表。
https://stackoverflow.com/questions/9961473
复制相似问题