3

测试平台为 32 位 Linux。

我编译ac程序时不剥离符号信息,使用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这样的反汇编工具如何知道某些库函数的名称..?

谢谢!

4

2 回答 2

4

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

你可以试试

剥离 -R .dynsym your_binary

手动删除 dynsym 部分,您会发现它由于重定位失败而无法运行。

于 2014-01-15T02:04:36.720 回答
2

导入的调用将始终具有名称,需要在运行时链接。如果您剥离了导入名称,您的应用程序如何知道要调用什么?每次执行应用程序时,来自外部库的方法可能(并且通常确实)具有不同的地址。

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

于 2014-01-15T02:20:16.520 回答