MinGW 32 "undefined reference to `ExitProcess@4'"
MinGW 32 "undefined reference to `ExitProcess@4'"
出于学习目的,我写了一个小的汇编程序(test.asm):
global _main
extern _ExitProcess@4
section .text
_main:
mov ebx,0
push ebx
call _ExitProcess@4
比我用NASM (test.obj组装的):
nasm -f win32 test.asm
现在我正在尝试 link 它到 "Portable Executable" (Windows 10 32 位 ):
ld test.obj
但我总是收到此错误消息:
undefined reference to `ExitProcess@4'
据我了解,这条消息意味着我的程序未 link 编辑为 "Kernel32.dll"。
但我认为“ld”是 linking 与“Kernel32.dll”自动所以我不必添加一些标志。
此外,如果我添加此标志:
ld test.obj -lkernel32
我收到以下错误消息:
cannot find -lkernel32
我确定我犯了一个愚蠢的错误,所以也许有人可以告诉我哪里出了问题。
编辑:
如果我使用“gcc”,它会起作用:
gcc test.obj -nostdlib -lkernel32
所以现在我想知道为什么“gcc”知道“-lkernel32”和“ld" 不是。
如您所知,使用 ld
您需要指定路径以找到合适的库。
不过有一个建议,如果你想让你的学习过程更轻松,可以使用这个名为 golink 的轻量级 linker,其中 linking 这些类型的片段是就这么简单:
> nasm -f win32 foo.asm && golink foo.obj kernel32.dll
GoLink.Exe Version 1.0.2.3 - Copyright Jeremy Gordon 2002-2016 - JG@JGnet.co.uk
Output file: foo.exe
Format: Win32 Size: 1,536 bytes
它允许您 link 到必要的 dll,这就够了,不需要一直搞乱搜索路径。
您也可以将 kernel32.dll 放在 test.obj 的同一文件夹中。然后你打电话:
- ld -o 测试 test.obj kernel32.dll
出于学习目的,我写了一个小的汇编程序(test.asm):
global _main
extern _ExitProcess@4
section .text
_main:
mov ebx,0
push ebx
call _ExitProcess@4
比我用NASM (test.obj组装的):
nasm -f win32 test.asm
现在我正在尝试 link 它到 "Portable Executable" (Windows 10 32 位 ):
ld test.obj
但我总是收到此错误消息:
undefined reference to `ExitProcess@4'
据我了解,这条消息意味着我的程序未 link 编辑为 "Kernel32.dll"。 但我认为“ld”是 linking 与“Kernel32.dll”自动所以我不必添加一些标志。 此外,如果我添加此标志:
ld test.obj -lkernel32
我收到以下错误消息:
cannot find -lkernel32
我确定我犯了一个愚蠢的错误,所以也许有人可以告诉我哪里出了问题。
编辑:
如果我使用“gcc”,它会起作用:
gcc test.obj -nostdlib -lkernel32
所以现在我想知道为什么“gcc”知道“-lkernel32”和“ld" 不是。
如您所知,使用 ld
您需要指定路径以找到合适的库。
不过有一个建议,如果你想让你的学习过程更轻松,可以使用这个名为 golink 的轻量级 linker,其中 linking 这些类型的片段是就这么简单:
> nasm -f win32 foo.asm && golink foo.obj kernel32.dll
GoLink.Exe Version 1.0.2.3 - Copyright Jeremy Gordon 2002-2016 - JG@JGnet.co.uk
Output file: foo.exe
Format: Win32 Size: 1,536 bytes
它允许您 link 到必要的 dll,这就够了,不需要一直搞乱搜索路径。
您也可以将 kernel32.dll 放在 test.obj 的同一文件夹中。然后你打电话:
- ld -o 测试 test.obj kernel32.dll