【发布时间】:2021-09-28 20:48:11
【问题描述】:
正如问题所述,我正在尝试将 .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 文件的命名约定是正确的。但是为什么它没有找到方法呢?
【问题讨论】:
-
您需要将库操作数放在需要它们的目标文件之后。任何语言都一样。
-
另外,你的函数有标签
_strlen,但你用名字strlen来称呼它。那是一个不同的名字。您需要在定义和调用中使用相同的名称。 -
这在代码中很糟糕,我已经在文件中修复了它。现在让我们尝试在旗帜周围移动^^
-
现在工作。布鲁赫。
-
酷!写下您为解决问题所做的工作作为答案,以便其他有相同问题的人可以从中受益!
标签: assembly x86-64 nasm static-libraries ld