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