测试平台为32位Linux。
我编译了一个c程序,没有去掉符号信息,用objdump来 反汇编 elf 可执行文件。
这是部分结果。
804831c: e8 8c fe ff ff call 8048360 <printf@plt>
如果我使用:
strip binary
去掉符号信息,再次使用objdump反汇编elf可执行文件,仍然可以看到如下结果:
804831c: e8 8c fe ff ff call 8048360 <printf@plt>
所以我的问题是:
像objdump这样的反汇编工具,我把符号信息都去掉了,怎么知道某些库函数的名字呢?
谢谢!
最佳答案
ELF 文件有 2 个符号表:.symtab 和 .dynsym。后者用于动态链接(重定位)所需的动态符号。 在您的情况下,printf 在 .dynsym 中,它也可能存在于 .symtab 中;默认情况下,strip 会删除 .symtab 但不会删除重定位所需的 .dynsym。
你可以试试
strip -R .dynsym your_binary
手动删除dynsym部分,你会发现由于重定位失败而无法运行。
关于linux - 为什么一个剥离的二进制文件在反汇编文件中仍然可以有库调用信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21127308/