【发布时间】:2019-12-07 23:56:26
【问题描述】:
很长一段时间我都没有使用 C 和汇编程序进行编程(大约 2 年)。现在我决定重新开始,但我想做一些更复杂的事情。我想过创建一个简单的内核。现在我在网上找到了这个源代码:
boot.asm:
global loader
extern kernel_main
MAGIC equ 0xbad
FLAGS equ 0x3
CHECKSUM equ -(MAGIC+FLAGS)
section .text
align 4
dd MAGIC
dd FLAGS
dd CHECKSUM
loader:
call kernel_main
cli
quit:
hlt
jmp quit
kernel.c:
void print(char *text) {
char *memory = (char*)0xb8000;
while(*text) {
*memory++ = *text++;
*memory++ = 0x3;
}
}
void kernel_main() {
print("My cat sometimes smells like cafe. I love it.");
}
linker.ld:
ENTRY(loader)
SECTIONS {
. = 0x100000;
.text : { *(.text) }
}
注意:我用“GCC”编译了 C 文件,用“NASM”编译了 Assembler 文件。
如果我尝试这个命令:
ld -T linker.ld -elf_i386 -o final.bin boot.o kernel.o
它说:“boot.asm:(.text+0xd): undefined reference to `kernel_main'”。 我怎样才能解决这个问题? 我在 Windows 上工作,不想用 Linux 或任何东西运行 VM。提前致谢!
编辑: 这是我的 GCC 命令:
gcc -m32 -o kernel.o srckernel.c -nostdlib -nostartfiles -nodefaultlibs
这是我的 NASM 命令:
nasm -f elf32 -o boot.o boot.asm
【问题讨论】:
-
-elf_i386应该是-melf_i386如果有的话。还显示gcc和nasm命令行。请注意,mingw gcc 可能会在符号前添加前导下划线,因此您可能需要extern _kernel_main和call _kernel_main。
标签: gcc assembly x86 nasm osdev