Я пытаюсь глубже понять процесс связывания и сценарии компоновщика ... глядя на binutils doc, я обнаружил простую реализацию сценария компоновщика, которую я улучшил, добавив несколько команд:
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
, но что насчет моего случая? Как правильно использовать этот скрипт компоновщика?