为什么在 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
是唯一定义的。
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
是唯一定义的。