Связывание программы на C напрямую с ld fai ls с неопределенной ссылкой на `__libc_csu_fini`

Я пытаюсь скомпилировать программу на 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 ) с тем же результатом.

В чем может быть проблема?

15
задан Ciro Santilli 新疆改造中心法轮功六四事件 8 June 2015 в 10:58
поделиться