假设我们有一个名为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提供结果?
由于
答案 0 :(得分:58)
为什么nm没有为条带化libtest.so提供结果
原始libtest.so
中有两个符号表:“常规”符号表(在.symtab
和.strtab
部分中)和动态符号表(在.dynsym
和.dynstr
部分。
如果strip
删除了两个符号表,那么您的库将完全无用:动态加载程序无法解析其中的任何符号。所以strip
做唯一有意义的事情:删除“常规”符号表,保持动态符号表不变。
您可以在动态符号表中看到包含nm -D
或readelf -s
的符号。
“常规”符号表仅用于调试(例如,它包含静态函数的条目,这些条目不由库导出,并且不会显示在动态符号表中)。
但是动态加载器从不查看“常规”符号表(其格式不适合快速符号查找);只有在动态的。因此正确的程序操作不需要“常规”符号表,但动态的符号表是。