Я пытаюсь понять более глубокий процесс связывания и скрипты компоновщика... глядя на binutils doc, я нашел простую компоновку компоновщика script, которую я улучшил, добавив несколько команд:
OUTPUT_FORMAT("elf32-i386", "elf32-i386",
"elf32-i386")
OUTPUT_ARCH(i386)
ENTRY(mymain)
SECTIONS
{
. = 0x10000;
.text : { *(.text) }
. = 0x8000000;
.data : { *(.data) }
.bss : { *(.bss) }
}
Моя программа - очень простая программа:
void mymain(void)
{
int a;
a++;
}
Теперь я попытался создать исполняемый файл:
gcc -c main.c
ld -o prog -T my_script.lds main.o
Но если я пытаюсь запустить prog
, он получает SIGKILL
во время запуска. Я знаю, что когда программа скомпилирована и связана с командой:
gcc prog.c -o prog
конечный исполняемый файл является также продуктом других объектных файлов, таких как crt1.o
, crti.o
и crtn.o
, но как насчет моего дела? Каков правильный способ использования сценариев компоновщика?