我正在尝试使用 NASM 创建一个与 Microsoft Visual Studio 2012 生成的目标文件尽可能接近的目标文件。我已经非常接近了,但我正在努力处理导入和重定位。
具体来说,当我使用 and 创建一个目标文件时cl.exe
,dumpbin /all binary.obj
我得到以下感兴趣的行:
Offset Type Applied To Symbol Index Symbol Name
-------- ------- ---------- ------------ -----------
00000007 DIR32 00000000 B __imp__GetModuleHandleA@4
但是当我这样做时dumpbin /all nasmobj.obj
,我会得到一条类似但略有不同的行:
Offset Type Applied To Symbol Index Symbol Name
-------- ------- ---------- ------------ -----------
00000007 REL32 00000000 7 __imp__GetModuleHandleA@4
所以不同之处在于 MSVC 产生的重定位是“直接”重定位,而我的 NASM 代码产生“相对”重定位。我怎样才能解决这个问题?
我正在编译我的 NASM 代码:
nasm -f win32 nasmtst.s
感兴趣的 NASM 代码是:
SECTION .text
EXTERN __imp__GetModuleHandleA@4
%define GetModuleHandleA (__imp__GetModuleHandleA@4)
; code happens
...
call GetModuleHandleA
...
; more code happens