связывание файла .obj с alink - PullRequest
0 голосов
/ 08 сентября 2011

я написал программу helloworld для win64 и преобразовал ее в файл .obj, используя nasm ... теперь мне нужно загрузить результирующий файл hello.obj, используя alink, но ошибки обрезаются ...

вЯ использовал команду

   nasm -f win64 -o hello.obj helloworld.asm  

(это успешно выполнено)

, и для загрузки я пишу

alink hello.obj 

, но постоянно отображаемая ошибка

loading file hello.obj 
unknown file type

затем однажды я написал -f win32 вместо -f win64 ... и затем, когда я выполнил тот же код загрузки для alink (т.е. alink hello.obj), на экране было написано

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 здесь

Ответы [ 2 ]

2 голосов
/ 09 сентября 2011

Основная проблема, с которой вы сталкиваетесь с alink, заключается в том, что у него нет 64-битной поддержки, поэтому вам пришлось использовать nasm -fwin32 для генерации 32-битного объектного кода.Вторая проблема заключается в том, что вы не указали точку входа.Разочарование, не правда ли?Я потратил много времени на разные линкеры.

Если вы хотите выполнить сборку win64 с помощью nasm, я предлагаю использовать golink .Требуется легкий, быстрый, без излишеств подход к созданию ссылок.Если вы хотите использовать функции из DLL в своем коде, вам не нужны какие-либо библиотечные файлы - GoLink может выполнять все ссылки, используя только сами DLL-файлы.Это даже вытянет их из системного пути, поэтому вам не нужно помещать что-либо в ту же папку, что и исходный код.

Следующая серьезная проблема, с которой вы столкнулись, заключается в том, что ваш пример кода не 'T подходит для Windows.Вот то, что вы можете использовать, чтобы начать работу, которое не будет зависать при запуске:

; 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, заключается в вызовах API Windows (WriteFile, ExitProcess, GetStdHandle).Аналогично, msvcrt.dll предназначен для стандартных функций библиотеки C (например, printf, malloc и т. Д.).Если вы хотите действительно разобраться в сборке Win64, вы, вероятно, захотите пойти дальше и просто использовать Windows API, оставляя без внимания msvcrt.dll.Вы можете найти документацию по всем функциям Windows API и структурам данных на MSDN .

Наконец, стоит отметить, что многие прототипы и структуры функций, которые они предоставляют в MSDN, предназначены для 32-битного Windows API, поэтому всякий раз, когда вы видите DWORD, вы, вероятно, захотите использовать вместо него QWORD..

Во всяком случае, я надеюсь, что это заставит вас начать в том направлении, куда вы хотите идти.Удачи!

0 голосов
/ 15 декабря 2011

Если вы все еще хотите использовать ALINK, вы можете попробовать это:

  • для сборки программы win32 (написано в коде 32b!):

    nasm -f obj file_name.asm
    
  • для сборки программы win64 (написано в коде 64b!):

    nasm -f win64 file_name.asm
    

Теперь процесс связывания для объекта 32b:

alink -oPE -subsys con -entry Start file_name.obj

Где Start - это точка входа для вашей программы, которую вы объявили глобальной.

Для объекта 64b, попробуйте другой редактор ссылок, такой как goLink, как предложил Джеймс.

Это должносделай это.Надеюсь, это работает и для вас!

...