使用ld链接包含stdio函数的目标文件时,找不到crt0.o文件。

3

最近我一直在学习链接器,并尝试使用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;
}

我使用gcc -c命令编译它们,然后使用以下命令将它们链接成一个单独的文件:
ld -r -o a.o main.o fun.o

最后,我想把 a.o 文件变成可执行文件。我读到需要 /usr/lib/crt0.o,但是没有找到它,所以我尝试了 /x86_64-linux-gnu/crt1.o (结果失败了)。那么,crt0.o 的替代品是什么呢?我的系统里没有 crt0.o(我做了搜索,但可能不是在该搜索的地方)。我可以用什么其他文件来替代它,这样命令就可以运行:

ld a.o <SOME_FILE> -lc

这会产生可执行输出吗?

1个回答

0
尝试使用ld链接简单文件
在UNIX上,除非您要链接一些特殊的程序(如内核或引导加载程序),否则绝不直接使用ld
对于“常规”用户级程序,始终使用适当的编译器前端(“C”使用gcc,“C ++”使用g ++)。
附言:
如果想知道crt0.o来自何处,请尝试gcc -v a.ogcc显示给您。

我知道在“正常”项目中不应该使用ld,但情况是我正在学习它的工作原理。是的,我尝试了verbose,但那里没有crt0.o。 - Matt_Caner
"没有 crt0.o" -- 是的,有的。它只是被称为 crt1.o,或者也可能是 Scrt1.o关键在于精确的名称和位置取决于许多事情,编译器驱动程序知道,而你不知道。 "学习如何..." -- 这很好,但你应该在问题中提到这一点。 - Employed Russian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接