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

时间:2016-07-31 11:56:00

标签: windows gcc assembly nasm

  

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

使用以下.asm文件,我使用MinGW在Windows 10上使用以下命令进行汇编和链接:

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

组装工作正常,但链接会产生以下错误:

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

1 个答案:

答案 0 :(得分:2)

因为您与gcc链接,而不是链接器ld。 Gcc是许多编译器和预处理器以及汇编器和链接器的包装器。 IE浏览器。它有助于自动化许多事情。

例如,将目标文件与默认C启动代码链接在一起,而不是明确要求它。

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

因此,如果您使用stdlib进行链接,则必须提供main,如果将-nodefaultlibs作为链接选项,则它将仅显式指定的.o文件链接在一起。然后,您的_start是唯一定义的。