如何将* .o对象文件链接到内核二进制文件中

时间:2014-08-22 23:48:47

标签: gcc linker kernel

我一直在研究内核开发。要开发我的内核二进制文件,我使用以下命令。但是,在包含最后一个C文件(paging.o)之前一切正常。虽然我多次检查paging.c C代码,但它会抛出异常(无效的操作码中断6)。我怀疑我的编译脚本可能存在一些错误。请帮忙。我使用MinGW和Bochs在Windows 7机器上工作。

nasm bootsec.asm -f bin -o bootsec.bin
nasm kernel_entry.asm -f elf -o kernel_entry.o
nasm empty.asm -f bin -o empty.bin
gcc -ffreestanding -c main.c -o main.o
gcc -ffreestanding -c port_in_out.c -o port_in_out.o
gcc -ffreestanding -c mem.c -o mem.o
gcc -ffreestanding -c screen.c -o screen.o
gcc -ffreestanding -c isr.c -o isr.o
gcc -ffreestanding -c timer.c -o timer.o
gcc -ffreestanding -c paging.c -o paging.o
ld -T NUL -o kernel.tmp -Ttext 0x1000 kernel_entry.o main.o mem.o port_in_out.o screen.o isr.o timer.o paging.o
objcopy -O binary -j .text kernel.tmp kernel.bin
copy /b bootsec.bin+kernel.bin+empty.bin os-image.img 

2 个答案:

答案 0 :(得分:0)

显然,你的问题中缺少信息。您应该为您的代码和您的" NUL"提供源代码。链接器脚本。

我建议您使用" objdump -D out.elf"检查最终的精灵文件,并确保内容在那里是理智的。

编译脚本中唯一显而易见的事情似乎是奇怪的是" -j .text"你正在传递给objcopy。这告诉objcopy只复制" .text"来自目标文件的部分。你确定要为" .c"做到这一点吗?文件? 大多数" .c"文件将使用" .data"," .text"和" .bss"编译到目标文件;除非你在你的" .c"中非常小心。文件。

您应该通过链接描述文件控制哪些部分应该被丢弃以及最终的elf文件中应该保留哪些部分而不是通过objcopy!

如果你确定你的paging.c例如不需要" .data"和" .bss"部分然后:

您确定paging.c中的代码是否正确?我猜这个文件控制着MMU,你很有可能在这个文件中启用MMU。如果您启用了MMU,CPU将立即看到完全不同的内存视图(实际执行几条指令后,取决于您的管道深度)。如果发生这种情况,您需要确保执行CPU的位置包含有效代码(通常通过映射内核两次)。如果你没有这样做,你的CPU可能会开始执行垃圾,从而开始执行你正在看到的无效操作。

答案 1 :(得分:0)

代码或编译脚本没有问题。问题在于我。我的bootsec.bin错误地只将15个内核条目段加载到内存中。但是当我添加paging.o时,我的内核条目变成了29个扇区。