Мой загрузчик не может быть скомпилирован с gcc 4.6 и 4.7… только 4.5

Я создал свой загрузчик за 2 года до того, как был установлен Debian сжатый/стабильный с gcc4.5. Теперь в debian wheezy/sid нельзя скомпилировать с 4.6 и 4.7, потому что из них создаются более крупные разделы, и я рассчитываю создать окончательный двоичный файл вручную. Это не проблема для меня сейчас, так как в debian wheezy/sid все еще есть gcc4.5, но я хотел бы сделать возможным компиляцию с gcc4.6 и 4.7.

Я создаю окончательный двоичный файл следующим образом:

исходные файлы скомпилированы с:

gcc-4.5 -Wall -O3 -c -m32 -I. -o assemblybin-objects/vga_pm.S.o vga_pm.S

связан с:

ld -nostdlib -T binary.ld assemblybin-objects/vga_pm.S.o... and other objects here... -o bootloader.bin

содержимое binary.ldэто:

OUTPUT_FORMAT("binary","binary","binary")
OUTPUT_ARCH(i386)

SECTIONS
{
. = 0;
.bootloader : {
   . = 0x600;
    *(.bootstrap);
   . = 0x7fa;
    BYTE(0x11);
    BYTE(0x33);
    BYTE(0x55);
    BYTE(0x77);
    BYTE(0x55);
    BYTE(0xaa);
    _bootstrap_end =.;
   . = 0x800;
    *(.sysinit);
    _sysinit_end =.;
   . = 0x1000;
    *(.pages);
    _pages_end =.;
   . = 0x5000;
    *(.sysconf);
    *(.presystem);
    *(.system);
    *(.library);
    *(.text);
    *(.data);
    *(.bss);
    *(.rodata);
    *(.rodata.*);
   . = 0xeffc;
    BYTE(0x11);
    BYTE(0x33);
    BYTE(0x55);
    BYTE(0x77);
    _system_end =.;
}

. = ASSERT(_bootstrap_end <= 0x800,"Bootstrap section big!");
. = ASSERT(_sysinit_end <= 0x1000,"Sysinit section big!");
. = ASSERT(_pages_end <= 0x5000,"Pages section big!");
. = ASSERT(_system_end <= 0xf000,"System initialization section big!");
}

наконец, создав окончательный двоичный файл с помощью dd.

Я видел, что при компиляции с gcc4.6 и 4.7 компоновщик добавляет несколько байтов (250 -300 )в начало bootloader.bin.

Я использую ldиз binutils2.22 и готовлю по своим собственным рецептам процесса сборки.

Мои актуальные вопросы:

Каковы различия между этими версиями компилятора gccи они производят более крупные разделы или инструктируют компоновщику через объектные файлы elf добавлять эти байты в начало файла bootloader.bin?

Есть ли какой-либо аргумент командной строки для gcc4.6 и/или 4.7, который отключит функцию, которая может создавать более крупные разделы, чем gcc4.5, или удалит инструкции, говорящие компоновщику добавить эти байты в начало bootloader.binфайл?

редактировать 17 -08 -2012 :Я немного занят в эти дни, но скоро я обновлю результаты тестов, которые я сделал.

Ответ @strnk и @Dan Aloni :, когда я увидел эту проблему, первое, что я сделал, это исключить бесполезные разделы, но результаты такие же... я думаю, потому что bootloader.bin- это простой двоичный файл со связанным кодом необходимые разделы в правильном положении, как указано компоновщиком, без имен разделов, информации о перемещении и отладке и символов... Файл bootloader.binне является объектным файлом эльфа.

Пожалуйста, учитывайте изменения актуальных вопросов. Спасибо за все... я скоро вернусь

редактировать 31 -08 -2012 :Хорошо, ребята, спасибо за вашу помощь. Ответ, данный @Dan Aloni и выполненный с помощью ldscript, как показывает @strnk

/DISCARD/ : {
    *(.eh_frame)
    *(.eh_frame_hdr)
}

после утверждений.

10
задан Memos Electron 10 September 2019 в 17:08
поделиться