linux - 为什么一个剥离的二进制文件在反汇编文件中仍然可以有库调用信息?

标签 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这样的反汇编工具,我把符号信息都去掉了,怎么知道某些库函数的名字呢?

谢谢!

最佳答案

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

你可以试试

strip -R .dynsym your_binary

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

关于linux - 为什么一个剥离的二进制文件在反汇编文件中仍然可以有库调用信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21127308/

相关文章:

linux - Linux内核中的IS_ALIGNED宏是做什么的?

swift - Linux 上的 GCD 内存膨胀 Swift

qt - 如何使最近的 MSVC 链接器将导入数据与 .rdata 部分合并?

linux - 在执行之前制作 CMake 打印命令

python - PyGTK隐藏光标

c - ‘(’ token 之前的预期标识符或 ‘/’

c++ - 函数定义在 cpp 文件中时出现链接器错误

linux - AS 汇编程序 ARM Raspberry PI 3 与 C 库链接?

c++ - 尝试运行/编译我的 C++ 程序

compilation - 特征 `core::ops::Index<i32>` 未实现