首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >nm vs "readelf -s“

nm vs "readelf -s“
EN

Stack Overflow用户
提问于 2012-04-01 10:36:58
回答 1查看 13.7K关注 0票数 36

假设我们有一个名为libtest.so的共享库,其中有一个函数“foo

使用该条带丢弃libtest.so中的所有符号

代码语言:javascript
复制
$strip libtest.so

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

代码语言:javascript
复制
$nm libtest.so

它将打印出来:

nm: libtest.so:无符号

但是如果我们使用:

代码语言:javascript
复制
$readelf -s libtest.so 

从其结果中仍然可以看到foo函数:

..。

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

..。

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

代码语言:javascript
复制
$strings libtest.so

..。

_Z3foov

..。

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

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-01 10:55:38

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

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

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

可以使用nm -Dreadelf -s在动态符号表中查看符号。

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

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

票数 64
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9961473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档