出于学习目的,我写了一个小的汇编程序( 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 ”没有。
答案 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,而且几乎不需要弄乱搜索路径。