Assembly 使用ld.exe链接到kernel32.dll

Assembly 使用ld.exe链接到kernel32.dll,assembly,gcc,nasm,ld,kernel32,Assembly,Gcc,Nasm,Ld,Kernel32,我已使用以下命令组装了我的汇编程序: nasm-f win64-o test.obj test.asm asm包含一些调用Win32函数的函数,如GetStdHandle、HeapAlloc等 通常,我会像这样链接我的一个装配项目: ld-LC:/Windows/System32-lkernel32-e main-o test.exe test.obj 它会生成一个test.exe文件,正如预期的那样 但是,一旦我开始使用Win32函数利用堆,如HeapAlloc、HeapFree、GetPro

我已使用以下命令组装了我的汇编程序:

nasm-f win64-o test.obj test.asm

asm包含一些调用Win32函数的函数,如GetStdHandle、HeapAlloc等

通常,我会像这样链接我的一个装配项目:

ld-LC:/Windows/System32-lkernel32-e main-o test.exe test.obj

它会生成一个test.exe文件,正如预期的那样

但是,一旦我开始使用Win32函数利用堆,如HeapAlloc、HeapFree、GetProcessHeap,链接时会出现以下错误:

C:\msys64\mingw64\bin\ld.exe:ertr000016.o:.rdata+0x0:对“\u pei386\u runtime\u relocator”的未定义引用

然后我就可以假设这与MinGW的文件被链接在一起有关。所以我试着在没有它们的情况下编译它:

ld-nostlib-nostartfiles-LC:/Windows/System32-lkernel32-e main-o test.exe test.obj

并获取以下错误:

C:\msys64\mingw64\bin\ld.exe:找不到-lkernel32

所以,我的问题是:在不包括startfiles或stdlib的情况下,我应该如何使用ld.exe链接到kernel32,因为无论我尝试什么,我都无法让它工作

谢谢你的帮助

我想要一个答案,不只是告诉我使用GoLink,除非这是唯一可能的解决方案

这肯定是错误的:-lkernel32不会搜索名为kernel32.DLL的DLL文件,而是搜索名为libkernel32.a的库文件

。。。libkernel32.a肯定不在C:/Windows/System32中

如何使用dlltool.exe生成自己的libkernel32.a

对于64位窗口,这比32位窗口容易,因为在32位窗口中,函数在DLL和对象文件中的命名不同

首先,创建一个定义文件.def,如下所示:

LIBRARY KERNEL32.DLL
EXPORTS
    HeapAlloc
    HeapFree
    GetProcessHeap
    CreateFileA
    ReadFile
有一个第三方工具,可以读取.dll文件并生成一个包含dll所有功能的.def文件;但是,您可以手动执行此操作,并且只添加所需的功能

然后运行以下命令行:

dlltool -d kernel32.def -l libkernel32.a
dlltool -d "kernel32.def" -l "libkernel32.a"
不幸的是,我不能告诉你这是否解决了你的问题与_pei386_运行时_重新定位

编辑

SetFilePointer也是在kernel32.dll中定义的函数。是否已将SetFilePointer添加到.def文件


我已经意识到答案现在就在评论中,但我将在这里发布所有步骤,只是为了清楚:

为要使用的DLL创建.def文件。可以这样做: 使用dlltool.exe为.def文件创建存档库文件: 在这个命令中,C是libXXX.a,其中XXX被替换为不同的名称,最好是没有扩展名的原始dll的名称

使用gcc.exe中内置的链接器,而不是使用ld.exe。另外,对于包含libXXX.a存档文件的目录,更改-L之后的目录,并更改libXXX.a中替换的XXX之后的dll名称。在原始问题的背景下,这些步骤将是:
您不应该指定要链接到的导入文件吗?它们通常在MinGW安装目录中,而不是在%SYSTEM32%中。您可以试试C:/Windows/SYSTEM32/kernel32.dll,而不是-LC:/Windows/SYSTEM32-lkernel32。@MargaretBloom我相信是MinGW导入库libkernel32.a导致了问题。@RossRidge在我替换它时,get:C:\msys64\mingw64\bin\ld.exe:ertr000016.o:.rdata+0x0:对“\u pei386\u runtime\u relocator”的未定义引用这意味着错误不是由链接到的MinGW文件引起的,而是因为它们不是。当我链接到生成的libkernel32.a时,我收到一系列错误:C:\msys64\mingw64\bin\ld.exe:test.o:test.asm:.text+0x17f:SetFilePointer的未定义引用,以及其他错误。我正在使用以下命令链接:ld-nostdlib-nostartfiles-L{dir_包含生成的\u libkernel32.a}-lkernel32-e main-o test.exe test。o@Ark:请参阅我的编辑这样做会导致分段错误。我拆开了文件,一切看起来都很正常,至少我认为是这样。我可能做错了什么?让我澄清一下。当我用objdump分解时,它没有显示出任何异常。但是当我用gdb运行程序时,它显示了第一行执行不是它应该是的。我的代码被重新定位了吗?
undefined reference to 'SetFilePointer'
LIBRARY KERNEL32.DLL
EXPORTS
    HeapAlloc
    HeapFree
    GetProcessHeap
    CreateFileA
    ReadFile
    SetFilePointer     <-- HERE?
ld ... -o test.exe test.o -L... -lkernel32
LIBRARY [name of the dll]
EXPORTS
    [required export #1]
    [required export #2]
    [etc.]
dlltool -d "[path to the .def file]" -l "[path to output file C, defined below]"
[Kernel32.def file]

LIBRARY KERNEL32.DLL
EXPORTS
    HeapAlloc
    HeapFree
    [...]
dlltool -d "kernel32.def" -l "libkernel32.a"
gcc -LC:/path/to/this/directory/ -lkernel32 -e main -o test.exe test.obj