测试平台是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这样的反汇编工具如何知道某些库函数的名称..?
谢谢!
答案 0 :(得分:4)
ELF文件有2个符号表:.symtab和.dynsym。后者用于动态链接(重定位)所需的动态符号。 在你的情况下,printf在.dynsym中,它也可能出现在.symtab中;默认情况下,strip会删除.symtab,但不会删除重定位所需的.dynsym。
您可以尝试
strip -R .dynsym your_binary
手动删除dynsym部分,你会发现由于重新分配失败而无法运行。
答案 1 :(得分:2)
导入的调用将始终具有名称,需要在运行时链接。如果您删除了导入名称,您的应用程序将如何知道要调用的内容?每次执行应用程序时,外部库中的方法可能(通常都是)具有不同的地址。
另一方面,即使没有符号信息,有时也可以识别和命名内联或静态链接的方法。许多反汇编程序会查找与某些标准库函数相关的常见模式。例如memcpy()
,即使没有符号信息,也可以通过启发式识别和标记。