编译自己的内核时未定义对WinMain的引用

时间:2020-03-23 19:18:43

标签: windows gcc linker freestanding

我已经开始编写自己的内核,并且正在Windows 10上进行开发。

我正在使用以下工具:

  • gcc 8.1.0 elf x86_64,用于编译我的C代码和进行链接。
  • nasm 2.14.02,用于编译我的汇编代码。

我正在使用以下命令来构建独立的内核代码:

gcc -c -m64 common/src/kernel.c -o common/build/kernel.o -std=gnu99 -ffreestanding -O2 -Wall -Wextra`

我正在使用以下命令来编译根汇编代码:

nasm -f elf64 targets/x86_64/src/main.asm -o targets/x86_64/build/main.o

最后,我将目标文件链接在一起:

gcc -o dist/x86_64/main.bin -ffreestanding -O2 targets/x86_64/build/main.o common/build/kernel.o -lgcc

我不知道为什么,但是以下错误使链接过程无法正常工作:

... undefined reference to `WinMain'
collect2.exe: error: ld returned 1 exit status

这对我来说没有意义,因为我的编译和链接处于独立模式,并且我不尝试使用任何Windows API。

我该如何解决?


如果有关系,这是我非常简单的代码:

main.asm

EXTERN kernel_main
call kernel_main
jmp $

; padding and magic number
times 510-($-$$) db 0
dw 0xaa55

kernel.c

void kernel_main()
{
  // empty
}

编辑:看来我可能需要x86_64-elf-gcc编译器

编辑2 :我尝试了x86_64-w64-mingw32-gcc编译器,发生了同样的错误

1 个答案:

答案 0 :(得分:0)

我在链接器上缺少-nostdlib标志。这似乎已经解决了问题。