为什么剥离的二进制文件仍然可以在反汇编文件中包含库调用信息?

时间:2014-01-15 01:10:48

标签: linux compilation linker strip symbol-table

测试平台是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这样的反汇编工具如何知道某些库函数的名称..?

谢谢!

2 个答案:

答案 0 :(得分:4)

ELF文件有2个符号表:.symtab和.dynsym。后者用于动态链接(重定位)所需的动态符号。 在你的情况下,printf在.dynsym中,它也可能出现在.symtab中;默认情况下,strip会删除.symtab,但不会删除重定位所需的.dynsym。

您可以尝试

  

strip -R .dynsym your_binary

手动删除dynsym部分,你会发现由于重新分配失败而无法运行。

答案 1 :(得分:2)

导入的调用将始终具有名称,需要在运行时链接。如果您删除了导入名称,您的应用程序将如何知道要调用的内容?每次执行应用程序时,外部库中的方法可能(通常都是)具有不同的地址。

另一方面,即使没有符号信息,有时也可以识别和命名内联或静态链接的方法。许多反汇编程序会查找与某些标准库函数相关的常见模式。例如memcpy(),即使没有符号信息,也可以通过启发式识别和标记。