MinGW 32“未定义引用`ExitProcess @ 4'”

时间:2016-11-18 17:31:03

标签: assembly linker nasm mingw32 portable-executable

出于学习目的,我写了一个小的汇编程序( 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

现在我尝试将其链接到“可移植可执行文件”( Windows 10 32位):

ld test.obj

但我总是收到此错误消息:

undefined reference to `ExitProcess@4'

据我所知,这个消息意味着我的程序没有链接到“Kernel32.dll”。 但我认为“ ld ”会自动与“ Kernel32.dll ”相关联,因此我不必为此添加一些标记。 此外,如果我添加此标志:

ld test.obj -lkernel32

我收到以下错误消息:

cannot find -lkernel32

我确信我犯了一个愚蠢的错误,所以也许有人可以告诉我什么是错的。

修改

如果我使用“ gcc ”而不是它的工作原理:

gcc main.obj -nostdlib -lkernel32

所以现在我想知道为什么“ gcc ”知道“ -lkernel32 ”和“ ld ”没有。

1 个答案:

答案 0 :(得分:1)

正如您已经想到的那样,使用ld,您需要指定查找正确库的路径。

但有一条建议,如果你想在学习过程中让生活更轻松,那么就存在一个名为golink的轻量级链接器,其中链接这些类型的片段就像​​这样简单:

> 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

它允许您链接到必要的dll,而且几乎不需要弄乱搜索路径。