zuuuuk, там в принципе ничего сложного нет. Сам писал такой небольшой конфиг:
OUTPUT_FORMAT ("binary")
/*OUTPUT_FORMAT ("a.out-i386-linux")*/
OUTPUT_ARCH (i386)
ENTRY (_start)
SECTIONS
{
/* абсолютный адрес загрузки файла */
. = 0x0500 ;
/* секция кода */
__text = .;
.text : { kernel.o (.text) *(.text) } = 0x90
__etext = .;
/* данные только для чтения */
.rodata : { *(.rodata) *(.rodata.*) }
/* секция данных */
. = ALIGN(4);
.data : { *(.data) } = 0x00
__edata = .;
/*
* Секция данных инициализированных нулями.
* Не занимает место в объектном файле.
*/
. = ALIGN(4);
__bss = .;
.bss :
{
*(.bss)
*(COMMON)
. = ALIGN(4096);
*(.bss.page_dir)
. = ALIGN(4096);
*(.bss.page_tab)
}
__ebss = .;
/* все остальное удалим */
/DISCARD/ : { *(*) }
}
Повторюсь еще раз, тема довольно узкоспециализированная. Читай документацию и смотри примеры скриптов линкера для GCC ('/usr/lib/ldscripts'), а так же можешь посмотреть пример для ядра Linux (./arch/x86/kernel).
Кстати
zuuuuk, была такая тема
Сборка программы в формате "a.out", там тоже про это немного есть.