我编译两次相同的.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.