出于学习目的,我编写了一个小型汇编程序(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“正在与”链接内核32.dll“ 自动,所以我不必为此添加一些标志。
此外,如果我添加这个标志:
ld test.obj -lkernel32
我收到以下错误消息:
cannot find -lkernel32
我确信我犯了一个愚蠢的错误,所以也许有人可以告诉我出了什么问题。
EDIT:
如果我使用“gcc“相反它有效:
gcc test.obj -nostdlib -lkernel32
所以现在我想知道为什么“gcc“ 知道 ”-lkernel32" and "ld" not.
正如您已经想出的那样,ld
您需要指定路径来查找正确的库。
不过,有一个建议,如果您想让学习过程变得更轻松,可以使用这个轻量级链接器,称为golink http://www.godevtool.com/GolinkHelp/GoLink.htm链接这些类型的片段就像这样做一样简单:
> nasm -f win32 foo.asm && golink foo.obj kernel32.dll
GoLink.Exe Version 1.0.2.3 - Copyright Jeremy Gordon 2002-2016 - [email protected] /cdn-cgi/l/email-protection
Output file: foo.exe
Format: Win32 Size: 1,536 bytes
它允许您链接到必要的 dll,这几乎不需要一直搞乱搜索路径。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)