3

我想知道如果我编译时是否得到完全相同的二进制结果:

  1. 相同的源代码
  2. 相同的编译器、版本、命令
  3. 同一个图书馆

或者是否还有其他限制可能导致不同的二进制文件,例如:

  • 编译源代码的时间
  • 系统,内核版本
  • 其他构建工具

谢谢!

4

1 回答 1

1

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

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

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

-fno-guess-分支概率

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

在硬实时系统中,人们不希望编译器的不同运行产生具有不同行为的代码;尽量减少非确定性至关重要。此开关允许用户减少不确定性,但可能会以较差的优化为代价。

于 2013-03-06T10:12:06.600 回答