3
我想知道如果我得到完全相同的二进制结果,如果我与编译:将具有相同的源,编译器和库版本结果编制完全相同的二进制
- 相同的源代码
- 相同的编译器,版本,指挥
- 相同的库
还是有也可能导致不同的二进制文件像其他限制:
- 当源编译
- 系统时间,内核版本
- 其他的构建工具
谢谢!
我想知道如果我得到完全相同的二进制结果,如果我与编译:将具有相同的源,编译器和库版本结果编制完全相同的二进制
还是有也可能导致不同的二进制文件像其他限制:
谢谢!
无法保证仅通过修复代码,库和编译器即可获得相同的输出。正如你已经确定,在编译器运行环境可能产生影响:
即使您可以找到并控制所有这些功能,编译也可能不是确定性的。下面是来自GCC 3.3 documentation一个具体的例子(注意措辞最新版本已经改变):
-fno猜测分支概率
使用随机模型不要猜测分支概率。 有时,gcc会选择使用随机模型来猜测分支概率,当分析反馈(-fprofile-arcs)或__builtin_expect中没有可用的分支概率时。这意味着同一程序中不同的编译器运行可能产生不同的目标代码。
在硬实时系统中,人们不希望编译器的不同运行产生具有不同行为的代码;最小化非决定论是最重要的。这个开关允许用户减少非确定性,可能以牺牲较差的优化为代价。
编号您的编译器可能会在文件中写入时间/日期标记。它也可能通过使用基于随机化的优化来产生代码生成的不同结果。可以构建一个确定性的编译器;只是不要指望你必须那样。 – 2013-03-06 06:32:00