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 这样的反汇编工具如何知道某些库函数的名称?
谢谢你!
ELF 文件有 2 个符号表:.symtab 和 .dynsym。后者用于动态链接(重定位)所需的动态符号。在您的情况下, printf 位于 .dynsym 中,它也可能存在于 .symtab 中;默认情况下,strip 会删除 .symtab,但不会删除重定位所需的 .dynsym。
你可以尝试
strip -R .dynsym your_binary
手动删除dynsym部分,你会发现它由于重定位失败而无法运行。