2013-03-06 47 views
3

我想知道如果我得到完全相同的二进制结果,如果我与编译:将具有相同的源,编译器和库版本结果编制完全相同的二进制

  1. 相同的源代码
  2. 相同的编译器,版本,指挥
  3. 相同的库

还是有也可能导致不同的二进制文件像其他限制:

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

谢谢!

+2

编号您的编译器可能会在文件中写入时间/日期标记。它也可能通过使用基于随机化的优化来产生代码生成的不同结果。可以构建一个确定性的编译器;只是不要指望你必须那样。 – 2013-03-06 06:32:00

回答

1

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

  • 这不只是一个编译器,但你必须保持静态(接头,装配等)的整体工具链。
  • 工具链是否使用可能随时间而更新的动态库?
  • 环境变量呢?
  • 你是以同一用户身份运行吗?具有相同的特权。

即使您可以找到并控制所有这些功能,编译也可能不是确定性的。下面是来自GCC 3.3 documentation一个具体的例子(注意措辞最新版本已经改变):

-fno猜测分支概率

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

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

相关问题