我编译了两次相同的.c和.h文件,得到了大小相同但md5sums不同的目标文件。这是与objdump -d的唯一区别
1) cpcidskephemerissegment.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <_ZN68_GLOBAL__N_sdk_segment_cpcidskephemerissegment.cpp_00000000_B8B9E66611MinFunctionEii>:2) cpcidskephemerissegment.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <_ZN68_GLOBAL__N_sdk_segment_cpcidskephemerissegment.cpp_00000000_8B65537811MinFunctionEii>:可能的原因是什么?谢谢!
发布于 2014-01-20 20:07:08
原因可能有很多:
使用宏,如Linux和__TIME__
__DATE__内核执行.comments
要生成稍微相同的构建,可以使用GCC的-frandom-seed参数。在GCC 4.3之前的一些情况下,它可能会破坏东西,但现在GCC将匿名命名空间中定义的函数转换为静态符号。但是,如果使用不同的-frandom-seed值编译每个文件,则始终是安全的,最简单的方法是使用文件名本身作为种子。
发布于 2014-01-23 00:56:56
我猜,编译器不知道如何命名这个命名空间,而是使用源文件的路径加上一些随机数。
编译器必须保证未命名命名空间中的符号不会与程序中的任何其他符号冲突。默认情况下,这是通过获取源文件的完整文件名并向其附加一个随机哈希值来实现的(编译同一个源文件两次(例如,使用不同的宏)并将两个对象链接到一个程序中是合法的,并且未命名的命名空间符号仍然必须是不同的,因此只使用源文件名而不使用种子是不够的)。
如果您知道不会多次链接相同的源文件,并且希望在重新编译时有一个位完全相同的目标文件,那么解决方案是将-frandom-seed="abcd"添加到您的编译行中(将"abcd“替换为您想要的任何内容;通常使用filename作为随机种子的值)。文档here。
发布于 2014-01-21 18:35:39
我终于找到了答案!
c++filt命令给出了函数的原始名称:
{unnamed namespace}: MinFunction(int, int)
在源代码中是:
namespace
{
MinFunction(int a, int b) { ... }
}我命名了命名空间,并得到了稳定的目标文件校验和!正如我猜测的那样,编译器不知道如何命名这个名称空间,而是使用源文件的路径加上一些随机数。
https://stackoverflow.com/questions/21233386
复制相似问题