编译我自己的内核时对 WinMain 的未定义引用
undefined reference to `WinMain` while compiling my own kernel
我已经开始编写我自己的内核并在 Windows 10.
上开发
我正在使用以下工具:
- gcc 8.1.0 elf x86_64 用于编译我的 C 代码和 linking。
- 我正在使用 this Windows package。
- 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
最后我link把目标文件放在一起:
gcc -o dist/x86_64/main.bin -ffreestanding -O2 targets/x86_64/build/main.o common/build/kernel.o -lgcc
我不知道为什么,但以下错误使 linking 进程停止工作:
... undefined reference to `WinMain'
collect2.exe: error: ld returned 1 exit status
这对我来说没有意义,因为我的编译和 linking 处于独立模式,我没有尝试使用任何 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
编译器,出现同样的错误
我在链接器上缺少 -nostdlib
标志。这似乎已经解决了问题。
我已经开始编写我自己的内核并在 Windows 10.
上开发我正在使用以下工具:
- gcc 8.1.0 elf x86_64 用于编译我的 C 代码和 linking。
- 我正在使用 this Windows package。
- 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
最后我link把目标文件放在一起:
gcc -o dist/x86_64/main.bin -ffreestanding -O2 targets/x86_64/build/main.o common/build/kernel.o -lgcc
我不知道为什么,但以下错误使 linking 进程停止工作:
... undefined reference to `WinMain'
collect2.exe: error: ld returned 1 exit status
这对我来说没有意义,因为我的编译和 linking 处于独立模式,我没有尝试使用任何 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
编译器,出现同样的错误
我在链接器上缺少 -nostdlib
标志。这似乎已经解决了问题。