Я создал свой загрузчик до 2 лет в Debian Squeeze/stable с 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
не является объектным файлом elf.
Пожалуйста, рассмотрите изменения актуальных вопросов. Спасибо за все... я скоро вернусь
редактировать 31-08-2012: Хорошо, ребята, спасибо за вашу помощь. Ответ, данный @Dan Aloni и выполненный с ldscript
, как показывает @strnk
/DISCARD/ : {
*(.eh_frame)
*(.eh_frame_hdr)
}
после утверждений.