首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >两个目标文件中md5sums的差异

两个目标文件中md5sums的差异
EN

Stack Overflow用户
提问于 2014-01-20 19:54:44
回答 3查看 228关注 0票数 3

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

1) cpcidskephemerissegment.o: file format elf64-x86-64

代码语言:javascript
复制
Disassembly of section .text:

0000000000000000 <_ZN68_GLOBAL__N_sdk_segment_cpcidskephemerissegment.cpp_00000000_B8B9E66611MinFunctionEii>:

2) cpcidskephemerissegment.o: file format elf64-x86-64

代码语言:javascript
复制
Disassembly of section .text:

0000000000000000 <_ZN68_GLOBAL__N_sdk_segment_cpcidskephemerissegment.cpp_00000000_8B65537811MinFunctionEii>:

可能的原因是什么?谢谢!

EN

回答 3

Stack Overflow用户

发布于 2014-01-20 20:07:08

原因可能有很多:

使用宏,如Linux和__TIME__

  • Embedding计数器,这些计数器在每次构建时都会递增( __DATE__内核执行.comments

  • 部分中嵌入的this)

  • Timestamps (或类似的变量))。执行此操作的编译器的一个示例是由于环境变量中的名称损坏(例如C++)

  • 更改而导致的AIX.

  • Different名称上的xlC编译器,这些更改正在影响build process.

  • Compiler错误(无论多么不可能)

要生成稍微相同的构建,可以使用GCC的-frandom-seed参数。在GCC 4.3之前的一些情况下,它可能会破坏东西,但现在GCC将匿名命名空间中定义的函数转换为静态符号。但是,如果使用不同的-frandom-seed值编译每个文件,则始终是安全的,最简单的方法是使用文件名本身作为种子。

票数 2
EN

Stack Overflow用户

发布于 2014-01-23 00:56:56

我猜,编译器不知道如何命名这个命名空间,而是使用源文件的路径加上一些随机数。

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

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

票数 2
EN

Stack Overflow用户

发布于 2014-01-21 18:35:39

我终于找到了答案!

c++filt命令给出了函数的原始名称:

{unnamed namespace}: MinFunction(int, int)

在源代码中是:

代码语言:javascript
复制
namespace
{
MinFunction(int a, int b) { ... }
}

我命名了命名空间,并得到了稳定的目标文件校验和!正如我猜测的那样,编译器不知道如何命名这个名称空间,而是使用源文件的路径加上一些随机数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21233386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档