我正在做操作系统项目,直到现在我的bootloader正在运行。我可以使用bios interuppt加载二进制文件,但我无法从ELF文件格式加载和调用C函数:
这是我想要最终执行的C程序:
//build :: cc -m32 -nostdlib -nostdinc -fno-builtin -fno-stack-protector -c -o kmain.o kmain.c
void kmain(){
int a = 5;
for(;;);
}
这是调用kmain()
的汇编代码; build :: nasm -f elf loader.asm
[BITS 32]
[GLOBAL start]
[EXTERN kmain]
section .text
start:
mov eax, 0
call kmain
这是我的链接描述文件
ENTRY(start)
以及我如何将所有内容链接在一起
ld -m elf_i386 -T link.ld -o kernel loader.o kmain.o
现在从我的bootloader中调用start
,我正在使用elf header中的e_entry
偏移字段(距起始地址24字节):
xor edx, edx
mov edx, 24
add edx, IMAGE_PMODE_BASE
add ebx, dword[edx]
add ebx, IMAGE_PMODE_BASE
call ebx
其中IMAGE_PMODE_BASE
是内存中加载的精灵文件的地址。
我的问题是“这是以ELF文件格式加载和调用C函数的正确方法吗?”。
感谢您的阅读,请帮忙。