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

lll*_*lll 4 linux linker compilation strip symbol-table

测试平台为32位Linux。

我编译ac程序时没有去除符号信息,并使用objdump反汇编elf可执行文件。

这是结果的一部分。

804831c:  e8 8c fe ff ff     call 8048360 <printf@plt>
Run Code Online (Sandbox Code Playgroud)

如果我使用:

strip binary 
Run Code Online (Sandbox Code Playgroud)

删除符号信息并使用 objdump 再次反汇编 elf 可执行文件,我仍然可以看到如下结果:

804831c:  e8 8c fe ff ff     call 8048360 <printf@plt>
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:

在我剥离了所有符号信息后,像 objdump 这样的反汇编工具如何知道某些库函数的名称?

谢谢你!

tri*_*tan 5

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

你可以尝试

strip -R .dynsym your_binary

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