Я создал свой загрузчик за 2 года до того, как был установлен Debian сжатый/стабильный с gcc
4.5. Теперь в debian wheezy/sid нельзя скомпилировать с 4.6 и 4.7, потому что из них создаются более крупные разделы, и я рассчитываю создать окончательный двоичный файл вручную. Это не проблема для меня сейчас, так как в debian wheezy/sid все еще есть gcc
4.5, но я хотел бы сделать возможным компиляцию с gcc
4.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
.
Я видел, что при компиляции с gcc
4.6 и 4.7 компоновщик добавляет несколько байтов (250 -300 )в начало bootloader.bin
.
Я использую ld
из binutils
2.22 и готовлю по своим собственным рецептам процесса сборки.
Мои актуальные вопросы:
Каковы различия между этими версиями компилятора gcc
и они производят более крупные разделы или инструктируют компоновщику через объектные файлы elf добавлять эти байты в начало файла bootloader.bin
?
Есть ли какой-либо аргумент командной строки для gcc
4.6 и/или 4.7, который отключит функцию, которая может создавать более крупные разделы, чем gcc
4.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)
}
после утверждений.