如何使用nasm
和alink
的組合鏈接kernel32.lib和user32.lib?如何使用`nasm`和`alink`的組合連接kernel32.lib和user32.lib?
我下面就彙編編程一些教程和導要我執行以下命令:
nasm -fobj hello.asm
alink -oPE hello \lib\kernel32.lib \lib\user32.lib
第一個命令執行不如預期,但第二個命令失敗。
要鏈接的.lib文件,我從
C:\Program Files (x86)\Microsoft SDKs\Windows\v7.1A\Lib
複製他們到我的當前文件夾。
錯誤消息執行第二命令時,我得到的是:
Loading file hello.obj
Loading file Kernel32.lib
2327 symbols
Loaded first linker member
Loading file User32.lib
1385 symbols
Loaded first linker member
matched Externs
matched ComDefs
Unresolved external MessageBoxA
Unresolved external ExitProcess
現在,我有兩個問題:
1)凡KERNEL32.LIB和USER32.LIB在什麼位置?
2)如何正確鏈接這些庫文件?
操作系統是Windows 10(64位)。
更新:
; Coded for NASM ;
; nasm -fobj hello.asm ;
; alink -oPE hello \lib\kernel32.lib \lib\user32.lib ;
;
extern MessageBoxA ; APIs used ;
extern ExitProcess ; in this file ;
;
[SECTION CODE USE32 CLASS=CODE] ; code section ;
..start: ; for the linker ;
;
push byte 0 ; only the buttons 'OK' ;
push dword caption ; caption of the BOX ;
push dword text ; text in the BOX ;
push byte 0 ; handle of the Box ;
call MessageBoxA ; print BOX on screen ;
;
push byte 0 ; ;
call ExitProcess ; EXIT ;
;
caption db "Your first WIN32 programm",0 ;
text db "HELLO",0 ;
;
end ; for the linker
您正在從正確的文件夾中獲取LIB文件,但您確實不應該將它們複製到別處。只要給鏈接器路徑,以便它可以找到它們。否則,我猜你的問題在於ALINK不支持生成64位可執行文件。您需要生成32位目標代碼,或使用不同的鏈接器。 –
你編譯/鏈接32位或64位代碼?以及如何在asm文件中聲明MessageBoxA和ExitProcess? – RbMm
我的意圖是編譯/鏈接32位代碼。我已經添加了上面的完整示例。 – Shuzheng