我正在尝试在我的 mac pro 上使用 i386-elf-gcc 学习操作系统。操作系统版本是 Sierra。我使用 Macports 通过键入sudo port install i386-elf-gcc
bash来安装编译环境。但是当我编译一个 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
Run Code Online (Sandbox Code Playgroud)
然后我使用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
Run Code Online (Sandbox Code Playgroud)
我的天啊。希望有人救救我。谢谢!!
小智 1
-nostdlib
假设:如果您正在学习操作系统,我假设您正在尝试编写某种可启动代码,这就是您尝试通过和 的原因-nostartfiles
。
我的答案就基于这个假设。
第二个输出(命令)中的问题之一-nostdlib -nostartfiles
是您正在尝试使用 libc 函数puts()
,但可能尚未实现它。因此链接器无法找到其字节码来生成最终的可执行文件。
虽然我无法用可用信息对第一条消息进行解释,但我可以推测您的 libc 缺少某些内容或有问题。它要么与你的编译器不匹配,要么不存在,或者类似的东西。
此外,如果您正在编写可启动代码,您可能需要链接器脚本。您的固件对于程序入口点在内存中的加载位置以及需要开始执行的位置有特定的标准,并且您需要链接器脚本根据此布局组织最终的二进制文件。
归档时间: |
|
查看次数: |
6304 次 |
最近记录: |