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

tkclm6bt  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(270)

我想在我的mac pro上使用i386-elf-gcc学习操作系统。Os版本是Sierra。我使用Macports通过在bash中输入sudo port install i386-elf-gcc来安装编译环境。但是当我编译helloworld程序时,它出错了。

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

字符串
然后我使用sudo find / -name "crt0.o",但在我的mac上只有crt1.o,crt3.o等。我使用-nostdlib和-nostartfiles它仍然出错:

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

cgyqldqp

cgyqldqp1#

假设:如果你正在学习操作系统,我假设你正在尝试编写某种可引导代码,这就是你尝试通过-nostdlib-nostartfiles的原因。
我的回答是基于这个假设。
第二个输出(-nostdlib -nostartfiles命令)中的一个问题是,你试图使用一个libc函数puts(),但可能还没有实现它,所以链接器找不到它的字节码来生成最终的可执行文件。
虽然我不能用现有的信息来解释第一条消息,但我可以推测你的libc缺少了什么或有问题。它要么不匹配你的编译器,要么不存在,或者类似的东西。
此外,如果你正在编写可引导代码,你可能需要一个链接器脚本。你的固件对程序的入口点将被加载到内存中的哪个位置以及它需要从哪里开始执行有特定的标准,你需要你的链接器脚本根据这个布局来组织最终的二进制文件。

相关问题