Я пытаюсь скомпилировать C-программу под Linux. Однако из любопытства я пытаюсь выполнить несколько шагов вручную: я использую:
- интерфейс gcc для создания кода ассемблера
- затем запустите сборщик GNU для получения объектного файла
- а затем связать его со средой выполнения C, чтобы получить рабочий исполняемый файл.
Теперь я застрял со связующей частью.
Программа - очень простой "Hello world":
#include <stdio.h>
int main() {
printf("Hello\n");
return 0;
}
Я использую следующую команду для создания кода сборки:
gcc hello.c -S -masm=intel
Я говорю gcc, чтобы завершить работу после компиляции и сбросить код сборки с помощью синтаксиса Intel.
Затем я использую ассемблер GNU для создания объектного файла:
as -o hello.o hello.s
Затем я пытаюсь использовать ld для создания окончательного исполняемого файла:
ld hello.o /usr/lib/libc.so /usr/lib/crt1.o -o hello
Но я продолжаю получать следующее сообщение об ошибке:
/usr/lib/crt1.o: In function `_start':
(.text+0xc): undefined reference to `__libc_csu_fini'
/usr/lib/crt1.o: In function `_start':
(.text+0x11): undefined reference to `__libc_csu_init'
Символы __libc_csu_fini/init
кажутся частью glibc, но я не могу их найти нигде! Я попытался связать с libc статически (против /usr/lib/libc.a
) с тем же результатом.
В чем проблема?