提问人:wind2412 提问时间:1/14/2017 最后编辑:Tomerikoowind2412 更新时间:4/21/2023 访问量:11039
找不到 crt0.o:没有这样的文件或目录
cannot find crt0.o: No such file or directory
问:
我正在尝试在我的 mac pro 上使用 i386-elf-gcc 学习操作系统。操作系统版本是 Sierra。我使用 Macports 通过键入 bash 来安装编译环境。但是当我编译一个helloworld程序时,它出错了。sudo port install i386-elf-gcc
gcc hello.c
/opt/local/lib/gcc/i386-elf/4.7.2/../../../../i386-elf/bin/ld: cannot find crt0.o: No such file or directory
collect2: error: ld returned 1 exit status
然后我使用 ,但在我的 mac 中只有 crt1.o、crt3.o 等。我使用 -nostdlib 和 -nostartfiles 它仍然出错:sudo find / -name "crt0.o"
gcc -nostdlib -nostartfiles hello.c
/opt/local/lib/gcc/i386-elf/4.7.2/../../../../i386-elf/bin/ld: warning: cannot find entry symbol _start; defaulting to 0000000008048054
/var/folders/wc/0c_zn09x12s_y90ccmvjb6900000gn/T//cc384VWr.o: In function `main':
hello.c:(.text+0x11): undefined reference to `puts'
collect2: error: ld returned 1 exit status
答:
0赞
Ágatha
12/14/2023
#1
假设:如果你正在学习操作系统,我假设你正在尝试编写某种可启动代码,这就是你试图通过和 .-nostdlib
-nostartfiles
我的答案就是基于这个假设。
第二个输出(命令)中的问题之一是您正在尝试使用 libc 函数,并且可能尚未实现它。因此,链接器无法找到其字节码来生成最终的可执行文件。-nostdlib -nostartfiles
puts()
虽然我无法用可用信息为第一条消息提供解释,但我可以推测您的 libc 缺少某些东西或有问题。它要么以某种方式与您的编译器不匹配,要么不存在,或者类似的东西。
此外,如果你正在编写可启动代码,你可能需要一个链接器脚本。固件对程序的入口点在内存中的哪个位置加载以及需要开始执行的位置有特定的标准,并且需要链接器脚本根据此布局组织最终二进制文件。
评论
1赞
Joshua
12/14/2023
似乎是一个狡猾的假设。在我看来,他有一个混乱的编译器,不知道如何解决这个问题。可惜我也没有。这也是 2017 年的一个问题,被一些东西唤醒了。OP 可能不是来澄清的。
0赞
Ágatha
12/14/2023
@Joshua,我不这么认为。OP 从字面上看是以“我正在尝试学习操作系统”开始帖子,并试图使用该标志。我可能是错的,但我想不出其他可能性来解释这两个事实。-nostdlib
0赞
Joshua
12/14/2023
您通常通过在用户空间中编写低级多线程 C 代码来开始学习操作系统。您也不要一开始尝试在没有选项的情况下进行编译,然后在收到有关缺少启动文件的错误后进行添加。-nostdlib -nostartfiles
0赞
Joshua
12/14/2023
无论如何,OP非常混乱。
0赞
Ágatha
12/14/2023
嗯,这很大程度上取决于你的识字水平和获得信息/教育的机会。当我没有机会接受正规教育,也没有适当的语言材料时,我在自己的旅程中走了很多奇怪的路。我并不是说这是OP的情况,但我完全看到自己在那些早已逝去的时代,完全迷失了方向,并试图完全靠自己做这样的事情。
评论
crt0.o
_start
-nostdlib
-nostartfiles
Mach-O 64-bit object x86_64
Mach-O object i386