【问题标题】:How to link an .a library with an .asm file?如何将 .a 库与 .asm 文件链接?
【发布时间】: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


【解决方案1】:

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

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

另外,在使用 bash 脚本编译时不要忘记sudo chmod +x make.sh,这可能会让你头疼 5 分钟^^

【讨论】:

  • 请注意,-L 标志的位置无关紧要(尽管通常将其放在任何操作数之前)。只需订购 -l 操作数。并且sudo 永远不需要编译软件。不要使用sudo。您只是在解决更复杂的问题。
猜你喜欢
  • 1970-01-01
  • 2021-07-27
  • 1970-01-01
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多