3

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

我们有两台开发电脑。然而,尽管具有相同的工具链和构建相同的源代码,它们各自构建的二进制文件略有不同。

我使用 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 的 Intel Core 2 Duo,另一台是运行 Windows 7 的 AMD X4。每台 PC 都能可靠地复制相同的构建,但其中一台 PC 的构建与其他 PC 不同。

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

4

0 回答 0