Связывание объектного файла, содержащего функции stdio, с ld, crt0.o не найден - PullRequest
1 голос
/ 10 марта 2020

Недавно я изучал компоновщик и пытался связать простые файлы с помощью ld, но потом мне не удалось это сделать (вероятно, из-за архитектуры x64? ... Я не могу точно сказать). Вот файлы, которые я использовал:

#include<stdio.h>

int fun(int x);

int main(){
    int i = fun(10);
    printf("%d\n",i);
    return 0;
}

и:

int fun(int x){
    return x+10;
}

Я скомпилировал их с помощью команд g cc - c, а затем связал их в один файл с помощью команды :

ld -r -o a.o main.o fun.o

и, наконец, я хотел превратить файл ao в исполняемый файл. Я прочитал /usr/lib/ctr0.o необходимо, но не найдя его, я попытался /x86_64-linux-gnu/crt1.o (и узнал, что это не работает). Чем тогда заменить crt0.o? У меня нет crt0.o в моей системе (я выполнил поиск, но, вероятно, не там, где должен был). Какой другой файл я могу использовать вместо него, чтобы команда:

ld a.o <SOME_FILE> -lc

собирала выводимый исполняемый файл?

1 Ответ

0 голосов
/ 10 марта 2020

пытается связать простые файлы с помощью ld

Вы должны никогда использовать ld непосредственно на UNIX, если только вы не связываете какую-то специальную программу, как ядро ​​или загрузчик.

Для "обычных" программ уровня пользователя всегда используйте соответствующий интерфейс компилятора (gcc для "C", g++ для "C ++").

PS

Если вы хотите узнать, откуда взято crt0.o, попробуйте gcc -v a.o, и gcc покажет вас.

...