Разделение исходного кода сборки NASM на библиотеки - PullRequest
1 голос
/ 25 апреля 2020

Я хотел бы разбить свой код назм на несколько файлов, чтобы я мог работать над разными частями кода отдельно. Однако единственный способ, который я нашел, это использовать макрос nasm %include. Например. Файл main.asm выглядит примерно так:

; ---- main.asm ----
%include "./header.asm"

section .text
    global _start
_start:

    call dummy_func

    mov rax, 0x3c
    mov rdx, 0x0
    syscall

, в то время как header.asm содержит только

section .text
dummy_func:
        ret

Я слышал о способе сделать это во время компоновки. Я очень заинтересовался этим, но не смог найти ничего подходящего. Это действительно возможно? Если это так, можно ли это сделать с помощью ld? Какие еще есть способы включить библиотеку stati c? (возможно, еще несколько макросов. Однако я не уверен, что слово «макросы» здесь подходит)

1 Ответ

2 голосов
/ 26 апреля 2020

Нет необходимости в stati c библиотеках - вы можете объявить функцию как внешнюю. В вашем случае main.asm будет выглядеть следующим образом:

; ---- main.asm ----
section .text
    global _start
    extern dummy_func
_start:

    call dummy_func

    mov rax, 0x3c
    mov rdx, 0x0
    syscall

Затем скомпилируйте ваши исходные файлы в объектные файлы:

nasm main.asm -o main.o
nasm header.asm -o header.o

Затем вы, наконец, сможете использовать ld для связи двух объектных файлов в один исполняемый файл:

ld -o [desired executable name] main.o header.o

Ключевое слово extern в основном означает, что функция dummy_func находится в другом объектном файле, и что объектный файл, содержащий dummy_func, ДОЛЖЕН быть связан с исполняемым файлом в конец. Это гораздо лучший способ, чем использовать %include.

...