Compiler construction 使用相同的源代码、编译器和库版本进行编译会产生完全相同的二进制文件吗

Compiler construction 使用相同的源代码、编译器和库版本进行编译会产生完全相同的二进制文件吗,compiler-construction,build,build-process,Compiler Construction,Build,Build Process,我想知道如果我使用以下方法编译,是否会得到完全相同的二进制结果: 相同的源代码 相同的编译器、版本、命令 同一个图书馆 或者是否存在其他可能导致不同二进制文件的约束,例如: 编译源代码的时间 系统,内核版本 其他构建工具 谢谢大家! 不能保证仅仅通过修复代码、库和编译器就能获得相同的输出。正如您所确定的,运行编译器的环境可能会产生影响: 它不仅仅是一个编译器,而是一个保持静态的完整工具链(链接器、汇编程序等) 工具链是否使用可能随时间更新的动态库 环境变量呢 您是否以同一用户的身份运行?拥

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

  • 相同的源代码
  • 相同的编译器、版本、命令
  • 同一个图书馆
  • 或者是否存在其他可能导致不同二进制文件的约束,例如:

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

    谢谢大家!

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

    • 它不仅仅是一个编译器,而是一个保持静态的完整工具链(链接器、汇编程序等)
    • 工具链是否使用可能随时间更新的动态库
    • 环境变量呢
    • 您是否以同一用户的身份运行?拥有同样的特权
    即使您可以找到并控制所有这些特性,编译也可能不是确定性的。以下是一个具体的例子(注意,在最近的版本中,措辞发生了变化):

    -fno猜测分支概率

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

    在硬实时系统中,人们不希望不同的编译器运行产生具有不同行为的代码;最大限度地减少不确定性至关重要。这种切换允许用户减少不确定性,可能以牺牲低级优化为代价


    不可以。编译器可能会在文件中写入时间/日期戳。通过使用基于随机化的优化,它还可能产生与代码生成不同的结果。可以构建确定性编译器;只是不要期望你必须是那样的人。