找不到 crt0.o:没有这样的文件或目录

cannot find crt0.o: No such file or directory

提问人:wind2412 提问时间:1/14/2017 最后编辑:Tomerikoowind2412 更新时间:4/21/2023 访问量:11039

问:

我正在尝试在我的 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
C macOS GCC

评论

2赞 Eugene Sh. 1/14/2017
如果你不使用 ,那么你必须提供你自己的启动代码定义(这是第二个问题)。crt0.o_start
1赞 DYZ 1/14/2017
看起来您的 gcc 安装已损坏。您在安装过程中是否看到任何错误消息?并且不要使用 ,除非你有一个很好的理由(这种情况发生在 .000001% 的情况下)。-nostdlib-nostartfiles
0赞 wind2412 1/14/2017
@EugeneSh。然而。。有没有教程告诉我如何写...因为我从我的 Linux 虚拟机移植了一些 crt0.o,但它无法识别并告诉我错误。所以我乞求交叉编译器之间有区别吗?而且我是 gcc 的新手......
0赞 Jonathan Leffler 1/14/2017
在macOS Sierra上使用基于ELF的编译器似乎很奇怪;本机对象文件格式是 或 ,两者都不是不言而喻的 ELF 兼容。你期待会发生什么?Mach-O 64-bit object x86_64Mach-O object i386
2赞 wind2412 4/9/2017
添加最终结果。gcc 仍然是那个问题。我能做的就是使用 Docker 制作一个 ubuntu vm 并在其中安装 gcc。这不是一个好的解决方案,但它有效......也许在macOS上它完全不兼容。

答:

0赞 Ágatha 12/14/2023 #1

假设:如果你正在学习操作系统,我假设你正在尝试编写某种可启动代码,这就是你试图通过和 .-nostdlib-nostartfiles

我的答案就是基于这个假设。

第二个输出(命令)中的问题之一是您正在尝试使用 libc 函数,并且可能尚未实现它。因此,链接器无法找到其字节码来生成最终的可执行文件。-nostdlib -nostartfilesputs()

虽然我无法用可用信息为第一条消息提供解释,但我可以推测您的 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的情况,但我完全看到自己在那些早已逝去的时代,完全迷失了方向,并试图完全靠自己做这样的事情。