我决定编写一个简单的asm bootloader和一个c ++内核。我阅读了很多教程,但是我无法编译汇编文件,如下所示:
[BITS 32]
[global start]
[extern _k_main]
start:
call _k_main
cli
hlt
(我想从c文件中调用k_main函数)
编译/汇编/链接错误:
nasm -f bin -o kernelstart.asm -o kernelstart.bin:
error: bin file cannot contain external references
好的,然后我尝试创建一个.o文件:
nasm -f aout -o kernelstart.asm -o kernelstart.o (That's right)
ld -i -e _main -Ttext 0x1000 kernel.o kernelstart.o main.o
error: File format not recognized
有人给我一个工作示例或者说如何编译。 :/ (我正在浏览教程并在2天前提供帮助,但找不到合适的答案)
答案 0 :(得分:3)
我没有直接回答您的错误来自哪里。但是,我确实看到很多事情都出错了,所以我会在这里写下这些:
<强> NASM 强>
nasm -f aout -o kernelstart.asm -o kernelstart
这甚至有用吗?这应该是
nasm -f aout -o kernelstart kernelstart.asm
<强> LD 强>
ld -i -e _main -Ttext 0x1000 kernel.o kernelstart.o main.o
既然你说你想制作一个bootloader和一个内核,我假设你的目标是让ld
输出一些可以放在MBR中的东西。如果是这种情况,请记住以下几点:
--oformat=binary
添加到命令行选项。这样可以确保生成平面二进制文件。_main
。我不确定该符号的定义位置,但我想您希望您的入口点为start
,因为这就是您调用内核的位置。text
部分。如果要将图像放入要由BIOS加载的MBR中,则应将其链接到0x7c00。我希望这些要点可以帮助您解决问题。
此外,您会找到许多有用的信息OSDev。 Here是一个关于编写仅使用MBR的实模式“内核”的教程。本教程包含工作代码。