Сравнение ELF / двоичных файлов, сгенерированных из разных версий инструментальной цепочки

У меня есть два двоичных файла, сгенерированных с помощью objcopy -O binary из соответствующих файлов ELF. Файлы ELF создаются с помощью инструментальных средств arm-none-linux-gnueabi; один из linaro gcc 4.6.2, а другой из кода gcc 4.6.3.

Бинарные файлы загружаю в память через Uboot. В то время как тот, который построен с помощью Linaro, выполняет, как ожидалось, тот, который построен с помощью кода, вылетает (скорее всего, так как), в приглашении Uboot нет ошибки, но программа, похоже, зависает.

Использование 'arm-none-linux-gnueabi-readelf -S' из binutils соответствующих наборов инструментов не показывает большой разницы между файлами, за исключением смещения адресов. Существуют ли какие-либо инструменты / методы, которые могут помочь в такой ситуации, прежде чем я попытаюсь выполнить отладку на целевом объекте.

Спасибо!


person fsheikh    schedule 02.08.2013    source источник
comment
Эти два компилятора очень тесно связаны. У CodeSourcery было несколько патчей, которые Линаро решил не использовать. Наверное, другая конфигурация.   -  person ams    schedule 04.08.2013


Ответы (2)


Отличие оказалось в опции компилятора -munaligned-access. Набор инструментов Code Sourcery включает это по умолчанию для архитектур ARMv6 и более поздних версий. http://gcc.gnu.org/gcc-4.7/changes.html

Хотя это появилось в исходной версии gcc в версии 4.7, Code Sourcery добавила эту поддержку ранее в свою цепочку инструментов.

Чтобы выяснить это, я отследил исключение прерывания данных, а затем скомпилировал файл виновника с параметрами -save-temps. Подсказку дало сравнение промежуточного файла .s.

person fsheikh    schedule 07.08.2013

Я могу вам посоветовать сравнить флаги по умолчанию, с которыми были созданы оба компилятора:

/path/to/cross-compiler/bin/arm-*-*-gcc -Q -v

И определения препроцессора:

/path/to/cross-compiler/bin/arm-*-*-gcc -dM -E - < /dev/null

Причина, по которой ваш код, скомпилированный с использованием Linaro GCC, работает, заключается в том, что некоторые параметры могут быть включены по умолчанию, а в CodeSourcery - нет.

person Piotr Nowak    schedule 04.08.2013