将 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
.
更好的做事方式
我想将我的 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
.