将使用相同的源,编译器和库版本编译完全相同的二进制文件

时间:2013-03-06 06:25:25

标签: compiler-construction build build-process

我想知道如果我用以下代码编译,我是否得到完全相同的二进制结果:

  1. 相同的源代码
  2. 相同的编译器,版本,命令
  3. 相同的图书馆
  4. 或者是否存在可能导致不同二进制文件的其他约束:

    • 编译源代码的时间
    • system,kernel version
    • 其他构建工具

    谢谢!

1 个答案:

答案 0 :(得分:1)

无法保证仅通过修复代码,库和编译器就可以获得相同的输出。正如您所确定的那样,运行编译器的环境可能会产生影响:

  • 它不仅仅是一个编译器,而是一个需要保持静态的整个工具链(链接器,汇编器等)。
  • 工具链是否使用可能随时间更新的动态库?
  • 环境变量怎么样?
  • 您是否以同一个用户身份运行?拥有相同的特权。

即使您可以找到并控制所有这些功能,编译也可能不具有确定性。以下是GCC 3.3 documentation的具体示例(请注意最近版本中的措辞已更改):

  

-fno猜测分支概率

     

不要使用随机模型猜测分支概率。   有时gcc会选择使用随机模型来猜测分支概率,当分析反馈(-fprofile-arcs)或__builtin_expect都没有。这意味着在同一程序上不同的编译器运行可能会产生不同的目标代码。

     

在硬实时系统中,人们不希望编译器的不同运行产生具有不同行为的代码;最大限度地减少非决定论是至关重要的。该开关允许用户减少非确定性,可能以较差的优化为代价。