首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用alink链接.obj文件

使用alink链接.obj文件
EN

Stack Overflow用户
提问于 2011-09-08 22:03:43
回答 2查看 5.8K关注 0票数 0

我为win64编写了一个helloworld程序,并使用nasm...now将其转换为.obj文件。我必须使用alink加载生成的hello.obj文件,但错误正在裁剪...

为了进行汇编,我使用了以下命令

代码语言:javascript
复制
   nasm -f win64 -o hello.obj helloworld.asm  

(这已成功执行)

为了加载,我正在写

代码语言:javascript
复制
alink hello.obj 

但是不断显示的错误是

代码语言:javascript
复制
loading file hello.obj 
unknown file type

然后一旦我写了-f win32而不是-f win64...然后,当我为alink执行相同的加载代码(即alink hello.obj)时,屏幕上写道

代码语言:javascript
复制
loading file hello.obj 
matched externs
matched comdefs
warning,no entry point specified
warning-no stack
error:target address out of frame
base=00000010, target=00000000

helloworld.asm文件为here

EN

回答 2

Stack Overflow用户

发布于 2011-09-09 06:17:29

使用alink的主要问题是它没有任何64位支持,这就是为什么你必须使用nasm -fwin32来生成32位目标代码。第二个问题是您没有指定入口点。令人沮丧,不是吗?我自己在不同的链接器上浪费了很多时间。

如果你想用nasm进行win64组装,我建议你使用golink。它采用轻量级、快速、无废话的方式进行链接。如果想在代码中使用动态链接库中的函数,则不需要任何库文件-- GoLink只需使用动态链接库文件本身即可完成所有链接。它甚至会将它们从系统路径中拉出,因此您不需要将任何内容放在与源代码相同的文件夹中。

您遇到的下一个主要问题是您的示例代码不适合Windows。这里有一个你可以用来开始的,当你运行它时不会崩溃:

代码语言:javascript
复制
; example64.s
; nasm -fwin64 example64.s
; golink /console example64.obj kernel32.dll msvcrt.dll

    bits 64
    default rel

    extern  GetStdHandle
    extern  WriteFile
    extern  ExitProcess
    extern  printf

section .data 
message db  'Hello, World!',10,0
msglen equ $-message
written dq      1

section .text
    global Start ; GoLink will use Start as the default entry point
Start:
    ; Use the C library to print our message
    mov rcx, message
    call    printf

    ; Now try using the Windows API
    mov rcx, -11
    call    GetStdHandle

    ; Use WriteFile to print our message again.
    ; Notice the calling convention for 64-bit Windows uses
    ; rcx, rdx, r8, and r9 for the first 4 non-floating point arguments
    ; and then the rest are pushed onto the stack.
    mov rcx, rax    ; HANDLE hFile
    mov rdx, message    ; LPCVOID lpBuffer
    mov r8, msglen  ; DWORD nNumberOfBytesToWrite
    mov r9, written ; LPDWORD lpNumberOfBytesWritten
    push    qword 0     ; LPOVERLAPPED lpOverlapped
    call    WriteFile

    mov rcx, 0
    call    ExitProcess

假设它另存为example64.s,您可以像这样组装和链接它:

nasm -fwin64 example64.s

golink /console example64.obj kernel32.dll msvcrt.dll

请注意,我们包含kernel32.dll的原因是针对Windows API调用(WriteFile、ExitProcess、GetStdHandle)。同样,msvcrt.dll用于标准C库函数(如printf、malloc等)。如果你想真正开始使用Win64程序集,你可能会想继续使用Windows API,去掉msvcrt.dll。您可以找到所有Windows API函数和数据结构on MSDN的文档。

最后,值得注意的是,他们在MSDN上提供的许多函数原型和结构都是针对32位Windows API的,因此每当您看到DWORD时,您可能都会希望使用QWORD。

无论如何,我希望这能让你开始朝着你想要的方向前进。祝好运!

票数 2
EN

Stack Overflow用户

发布于 2011-12-15 19:49:50

如果你仍然想使用ALINK,你可以尝试这样做:

  • 汇编一个win32程序(用32b代码编写!):

nasm file_name.asm

  • to obj -f汇编一个win64程序(用64b代码编写!):

nasm -f win64 file_name.asm

现在,32b对象的链接过程:

代码语言:javascript
复制
alink -oPE -subsys con -entry Start file_name.obj

其中Start是您的程序的入口点,即您声明为全局的入口点。

对于64b对象,按照詹姆斯的建议,尝试使用另一个链接编辑器,比如goLink。

这个应该可以了。希望它也能为你工作!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7349308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档