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