Цепочка инструментов Mips и mipsel, предоставляющая различную информацию о стеке для одного и того же исполняемого файла

У меня есть тестовое приложение, которое я сначала скомпилировал с помощью mips-linux-gnu-gcc -EL для создания exec_sigma, а затем с помощью mipsel-linux-uclibc-gcc для создания exec_bcm.

После чтения этих исполняемых файлов я получил много отличий. Меня в основном беспокоит разница в разделе .debug_info

В elf_sigma: это:

[33] .debug_info MIPS_DWARF 00000000 01357b 02fa1e 00 0 0 1

[34] .debug_abbrev MIPS_DWARF 00000000 042f99 0040cd 00 0 0 1

а в elf_bcm: это:

[32] .debug_info MIPS_DWARF 00000000 02329b 0058ba 00 0 0 1

[33] .debug_abbrev MIPS_DWARF 00000000 028b55 000619 00 0 0 1

Эта разница (в размере) вызывает ошибку в моем приложении для трассировки стека. Это работает для mips-linux-gnu-gcc -EL, но не для mipsel-linux-uclibc-gcc. Я хочу знать, почему такая разница в разделах для одного и того же исполняемого файла и это нормально??

Спасибо, что прочитали вопрос..


person deeps8us    schedule 31.05.2012    source источник


Ответы (1)


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

Можно надеяться, что «все, что вам нужно сделать», это перевернуть некоторые адреса и перевернуть все данные байтов и полуслов, но в остальном иметь один и тот же двоичный файл. Вот одна очень простая проблема с этой теорией. Допустим, есть байт, к которому компилятор хочет получить доступ, и он находится по адресу 0x100000 с использованием одного порядка байтов. одна инструкция lui может загрузить этот адрес в регистр для последующего чтения байта. Если по какой-либо причине изменение порядка байтов заставляет этот адрес нуждаться в младших битах, например, 0x100003, теперь требуется две инструкции для загрузки этого адреса в регистр и/или ячейку памяти и однократное чтение этой ячейки памяти. Должна быть возможность сделать компилятор, целью которого является независимость от индии до последнего возможного момента, генерировать код без байтов (загружать все адреса в регистры, используя слово загрузки из .text, не использовать немедленную загрузку), а затем каким-то образом отслеживать все это и патч это в конце. Вы должны спросить, почему кто-то захочет сделать такой компилятор, это такой маленький вариант использования, чтобы не тратить время. Обычно вам нужна производительность вашего компилятора, а не что-то вроде этого.

Возьмите ваши скомпилированные программы, либо дизассемблируйте, либо objcopy в двоичный файл, затем сравните два двоичных файла, вы должны быстро увидеть, где они расходятся, а затем используйте дизассемблирование, описанное выше, вероятно, не конкретный пример, а что-то в этом роде. Как только один компилятор должен добавить один байт, слово или инструкцию, а не другой (при условии, что в остальном компиляторы были идентичными, а они не являются), изменение адресации может и вызовет больше различий в инструкциях, что приведет к тому, что двоичные файлы будут продолжать работать. расходиться.

person old_timer    schedule 02.07.2012