为什么在 Windows/MinGW 上与 GCC 链接时 _start 的入口点会导致错误?

Why does entry point of _start results in error when linking with GCC on Windows/MinGW?

Why does entry point of _start results in error when linking with GCC on Windows/MinGW?

使用以下 .asm 文件我 assemble 和 link 在 Windows 10 上使用以下命令使用 MinGW:

nasm -f win32 helloworld.asm
gcc -e_start -o helloworld helloworld.obj

汇编工作正常,但是 linking 产生以下错误:

c:/dev/mingw/bin/../lib/gcc/mingw32/4.9.3/../../../libmingw32.a(main.o):(.text.startup+0xa0): undefined reference to `WinMain@16'

_start 更改为 _main 似乎一切正常。这是为什么?

BITS 32

    global _start
    extern _printf

    section .text
_start:
    push msg
    call _printf
    add esp, 4
    ret
msg:
    db "HelloWorld", 10, 0

因为你 link 和 gcc,而不是 link 和 ld。 Gcc 是许多编译器、预处理器、汇编器和 linker 的包装器。 IE。它有助于自动化很多事情。

例如 link将目标文件与默认 C 启动代码一起使用,而不明确要求它。

init启动代码已经有_start标签,初始化stdlib C环境后会调用main.

因此,如果您 link 使用 stdlib,则必须提供 main,如果您将 -nodefaultlibs 作为 linking 选项,它将 link 只有.o 个明确指定的文件。那么你的 _start 是唯一定义的。