【问题标题】:undefined reference to `WinMain` while compiling my own kernel编译我自己的内核时对“WinMain”的未定义引用
【发布时间】:2020-03-23 19:18:43
【问题描述】:

我已经开始编写自己的内核并在 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 编译器,出现同样的错误

【问题讨论】:

  • 除了链接器错误(您可以使用-nostdlib 修复)之外,您正在尝试执行的操作在此表单中将不起作用。引导扇区需要是 16 位实模式代码,然后切换到 64 位长模式才能运行 64 位 C 内核。此外,您需要确保将您的 asm 内容放在二进制文件的开头,并且必须在运行时加载内核,因为 BIOS 只加载第一个扇区。
  • @Jester 谢谢你提醒我
  • 哦,您的输出可能是 PE 可执行文件,而不是平面二进制文件。

标签: windows gcc linker freestanding


【解决方案1】:

我错过了链接器上的-nostdlib 标志。这似乎解决了问题。

【讨论】:

    猜你喜欢
    • 2012-02-20
    • 2019-05-29
    • 2021-01-14
    • 1970-01-01
    • 2012-12-09
    • 2021-11-18
    • 2013-01-15
    相关资源
    最近更新 更多