linux - 两个目标文件中 md5sums 的差异

标签 linux elf

我两次编译相同的 .c 和 .h 文件,得到大小相同但 md5sums 不同的目标文件。 这是与 objdump -d 的唯一区别:

1) cpcidskephemerissegment.o: 文件格式elf64-x86-64

Disassembly of section .text:

0000000000000000 <_ZN68_GLOBAL__N_sdk_segment_cpcidskephemerissegment.cpp_00000000_B8B9E66611MinFunctionEii>:

2) cpcidskephemerissegment.o: 文件格式elf64-x86-64

Disassembly of section .text:

0000000000000000 <_ZN68_GLOBAL__N_sdk_segment_cpcidskephemerissegment.cpp_00000000_8B65537811MinFunctionEii>:

可能是什么原因?谢谢!

最佳答案

I guess, the compiler didn't know how to name this namespace and used path to the source file plus some random number.

编译器必须保证未命名命名空间中的符号不​​与程序中的任何其他符号冲突。 默认情况下这是通过获取源文件的完整文件名,并向其附加一个随机哈希值来实现的(编译相同的源文件两次(例如使用不同的宏)并将两个对象链接到一个文件中是合法的)单个程序,并且未命名的命名空间符号必须仍然是不同的,因此仅使用不带种子的源文件名是不够的。

如果你知道你不会多次链接同一个源文件,并且希望在重新编译时有一个完全相同的目标文件,解决方案是添加 -frandom-seed="abcd" 到你的编译行(用你想要的任何东西替换“abcd”;通常使用文件名作为随机种子的值)。文档 here .

关于linux - 两个目标文件中 md5sums 的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21233386/

相关文章:

linux - 运行 make modules_install 时出现段错误

php - 长时间运行的 PHP 脚本在通过 exec() 调用时停止,但在通过 CLI 调用时结束

linux - 访问附加到 ELF 二进制文件的数据

c - 如何从 elf 调用和编译函数到我的二进制文件?

linux - 如何告诉 mex 链接到/usr/lib 中的 libstdc++.so.6 而不是 MATLAB 目录中的那个?

linux - 在循环 bash 中等待

c++ - 使用 C/C++ 在 Linux 中以编程方式更改 IP 设置

linux - 为什么在x86_64 ABI中选择地址0x400000作为文本段的开头?

c++ - 如何在 Linux 架构上即时列出 C 代码中可用的所有函数/符号?

arm - 加载符号后 GDB 自动执行命令