assembly - 如何将 .a 库与 .asm 文件链接?

标签 assembly x86-64 nasm static-libraries ld

正如问题提到的,我正在尝试将 .a 库与 .asm 文件链接。我使用 Ubuntu、nasm 和 gcc 通过以下 MRE 和命令来执行此操作:

nasm -f elf64 -o use.o use.asm
nasm -f elf64 -o strlen.o strlen.asm

ar rc libstring.a strlen.o
ranlib libstring.a

ld -static -nostdlib -build-id=none -L. -lstring -o use.bin use.o

使用的文件如下所示: strlen.asm:

BITS 64
GLOBAL strlen

;-------------------------------------------------------------------------------
; @func strlen
;
; @params String str
;
; @returns uint_32 length
;-------------------------------------------------------------------------------

strlen:
push rcx
push rsi

xor eax, eax
xor ecx, ecx
mov rsi, [rsp + 0x10]

jmp .foreach

.inc_i:
inc ecx

.foreach:
lodsb
or al, al
jnz .inc_i

.return:
mov eax, ecx
pop rsi
pop rcx
ret

使用.asm:

BITS 64

GLOBAL _start
EXTERN strlen

_start:
push str
call strlen
cli
hlt

str: DB "String!", 0x00

我不期望他们做任何事情,他们应该只是编译。目前链接器给出了这个错误:

ld: use.o: in function `_start':
use.asm:(.text+0x6): undefined reference to `strlen'

由于错误没有提到找不到文件,我猜 .a 文件的命名约定是正确的。但为什么找不到方法呢?

最佳答案

为了解决这个问题,必须以某种方式对 -L 和 -l 标志进行排序,将它们放置在需要它们的文件之后。当在不同位置使用多个库时,必须确保重新定位不会错误地放置 -L 标志,这也可能会导致一些问题。

因此,在此 MRE 中,ld 命令应如下所示:
ld -static -nostdlib -build-id=none use.o -L . -l string -o use.bin

另外别忘了sudo chmod +x make.sh当使用 bash 脚本进行编译时,这可能会让您头疼 5 分钟^^

关于assembly - 如何将 .a 库与 .asm 文件链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68470134/

相关文章:

assembly - 8086 assembly 相关问题

assembly - 将我的解决方案从十进制转换为十六进制

linux-kernel - x86-64 位处理器中的 PAE - Linux 内核

c - 反编译汇编代码(真的)有多难?

c - 如何在 x86 实模式非操作系统程序集中打印字符串

c - 注册为线程局部变量

linux - objdump 如何发出 intel 语法

c - 从 C 执行二进制机器代码

linux - malloc 和免费的 x86 NASM + 编译

assembly - NASM:%include 文件中操作码和操作数的组合无效,报告的行号超出末尾?