gpt4 book ai didi

linux - 纳米与 "readelf -s"

转载 作者:IT老高 更新时间:2023-10-28 12:39:30 26 4
gpt4 key购买 nike

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

使用 strip 丢弃 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 没有给出 strip 化 libtest.so 的结果?

谢谢

最佳答案

why nm give no result for striped libtest.so

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

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

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

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

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

关于linux - 纳米与 "readelf -s",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9961473/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com