Yagarto(GCC,Win32)在不同的PC上以不同的方式编译相同的代码

时间:2014-01-20 02:34:20

标签: c gcc binary-reproducibility yagarto

我在Windows上使用Yagarto工具链来编译大约100K行代码的代码库。

我们有两台开发PC。但是,尽管具有相同的工具链并构建相同的源代码,但它们各自构建略有不同的二进制文件。

我已经使用MD5检查过我们有相同的编译器二进制文件,相同的系统头文件,我们正在编译相同的源代码,同一命令行被传递给GCC,但是存在细微差别。

在我们的代码库中的81个目标文件中,77个编译完全相同;四个有微小的差异。没有功能差异,但由于我们将支持已编译的二进制文件,因此我想深入研究这个问题。

“arm-elf-gcc.exe”日期为2006年7月16日。 “arm-elf-gcc -v”的输出是:

Using built-in specs.
Target: arm-elf
Configured with: ../gcc-4.1.1/configure --target=arm-elf --prefix=/home/yagarto/yagarto --disable-nls --disable-shared --disable-threads --with-gcc --with-gnu-ld --with-gnu-as --with-stabs --enable-languages=c,c++ --enable-interwork --enable-multilib --with-newlib --disable-libssp --disable-libstdcxx-pch --disable-libmudflap --enable-win32-registry=yagarto -v
Thread model: single
gcc version 4.1.1

以下是不同生成代码的列表文件中的示例:

.LCB1356:
mov r7, #0
mov r5, #2
str r7, [sp, #16]
str r7, [sp, #20]
str r7, [sp, #24]
str r7, [sp, #28]
str r7, [sp, #40]
.L231:

.LCB1356:
mov r7, #0
mov r5, #2
str r7, [sp, #16]
str r7, [sp, #20]
str r7, [sp, #40]
str r7, [sp, #24]
str r7, [sp, #28]
.L231:

在这两种情况下,只是堆栈框架中变量的顺序是不同的;所有代码都是相同的,除了变量的顺序不同。 (列表文件中的“diff”只显示与#40交换的各种其他行,与#28交换,等等。)

这种变化显然是无害的(虽然我想知道为什么),但是在其他两个目标文件中,文本段的大小实际上在一个版本中大4个字节,并且变量在不同的在堆栈框架上的顺序,有几个不同的指令。

一台PC是运行Windows 2000的英特尔酷睿2双核,另一台是运行Windows 7的AMD X4。每台PC都可以可靠地再现相同版本,但一台PC的版本与其他版本不同。

GCC是否有可能根据实际用于构建的CPU进行不同的优化? (不是目标CPU)。或者还有什么可能导致这种差异?

0 个答案:

没有答案
相关问题