为什么在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
答案 0 :(得分:2)
因为您与gcc
链接,而不是链接器ld
。 Gcc是许多编译器和预处理器以及汇编器和链接器的包装器。 IE浏览器。它有助于自动化许多事情。
例如,将目标文件与默认C启动代码链接在一起,而不是明确要求它。
init启动代码已经有_start
标签,在初始化stdlib C环境后,它将调用main
。
因此,如果您使用stdlib进行链接,则必须提供main
,如果将-nodefaultlibs作为链接选项,则它将仅显式指定的.o
文件链接在一起。然后,您的_start
是唯一定义的。