将 NASM 汇编源代码拆分为库

Splitting NASM assembly source code into libraries

我想将我的 nasm 代码拆分成几个文件,这样我就可以分别处理不同的代码片段。但是,我发现的唯一方法是使用 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可以吗?还有什么其他方法可以包含静态库? (可能还有一些宏。但是我不确定 "macros" 在这里是正确的词)

不需要静态库 - 您可以将函数声明为外部函数。在你的例子中,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 将 2 个目标文件 link 合并为一个可执行文件:

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

extern 关键字基本上意味着函数 dummy_func 位于不同的目标文件中,并且包含 dummy_func 的目标文件必须 linked 到最后可执行。这是比使用 %include.

更好的做事方式