Yagarto (GCC, Win32) по-разному компилирует один и тот же код на разных ПК

Я использую набор инструментов Yagarto для Windows, чтобы скомпилировать кодовую базу из примерно 100 тысяч строк кода.

У нас есть два ПК для разработки. Тем не менее, каждый из них создает немного разные двоичные файлы, несмотря на то, что у них одинаковый набор инструментов и один и тот же исходный код.

Используя MD5, я проверил, что у нас одинаковые двоичные файлы компилятора, одни и те же системные заголовки, и мы компилируем один и тот же исходный код, с одной и той же командной строкой, передаваемой в GCC, но есть небольшие различия.

Из 81 объектного файла в нашей кодовой базе 77 компилируются точно так же; и четыре имеют незначительные различия. Функциональной разницы нет, но, поскольку мы собираемся поддерживать скомпилированные двоичные файлы, я бы хотел разобраться с этой проблемой.

"Arm-elf-gcc.exe" датирован 16 июля 2006 года. Вывод "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 байта больше в одной версии, а также переменные в другом порядке в кадр стека, есть пара инструкций, которые отличаются.

Один ПК представляет собой Intel Core 2 Duo под управлением Windows 2000, а другой - AMD X4 под управлением Windows 7. Каждый ПК надежно воспроизводит одну и ту же сборку, но сборка одного ПК отличается от других.

Возможно ли, что GCC будет оптимизировать по-разному в зависимости от того, какой процессор фактически используется для сборки? (не целевой процессор). Или что еще может вызвать это несоответствие?

0 ответов

Другие вопросы по тегам