Linker 使用ld链接包含stdio函数的对象文件,未找到crt0.o

Linker 使用ld链接包含stdio函数的对象文件,未找到crt0.o,linker,ld,crt,Linker,Ld,Crt,最近我一直在学习linker并尝试使用ld链接简单的文件,但后来我失败了(可能是因为架构x64?…我真的不知道)。以下是我使用的文件: #include<stdio.h> int fun(int x); int main(){ int i = fun(10); printf("%d\n",i); return 0; } 我使用gcc-c命令编译它们,然后使用命令将它们链接到单个文件中: ld -r -o a.o main.o fun.o 最后,我想把a

最近我一直在学习linker并尝试使用ld链接简单的文件,但后来我失败了(可能是因为架构x64?…我真的不知道)。以下是我使用的文件:

#include<stdio.h>

int fun(int x);

int main(){
    int i = fun(10);
    printf("%d\n",i);
    return 0;
}
我使用gcc-c命令编译它们,然后使用命令将它们链接到单个文件中:

ld -r -o a.o main.o fun.o
最后,我想把a.o文件变成一个可执行文件。我已经阅读了/usr/lib/ctr0.o,但是没有找到它,我尝试了/x86_64-linux-gnu/crt1.o(并且知道它不起作用)。那么什么是crt0.o的替代品呢?我的系统中没有crt0.o(我进行了搜索,但可能没有我应该搜索的地方)。我可以在其位置使用其他什么文件,以便命令:

ld a.o <SOME_FILE> -lc
ld a.o-lc
是否将生成可执行输出

尝试使用ld链接简单文件

永远不要在UNIX上直接使用
ld
,除非您链接了一些特殊的程序,比如内核或引导加载程序

对于“常规”用户级程序,请始终使用适当的编译器前端(“C”使用“
gcc
”,而“C++使用“
g++
”)

附言


如果您想知道
crt0.o
来自哪里,请尝试
gcc-v a.o
gcc
将向您展示。

我知道我不应该在“正常”项目中使用ld,但我正在学习它是如何工作的。是的,我确实尝试过冗长,但没有crt0.o,有“没有crt0.o”--是的,有。它只是被称为
crt1.o
,或者可能是
Scrt1.o
。关键是,确切的名称和位置取决于许多事情,而编译器驱动程序知道这些事情,而您不知道。“学习如何……”——这很好,但你应该在你的问题中提到这一点。
ld a.o <SOME_FILE> -lc