assembly - 如何将 .a 库与 .asm 文件链接?
问题描述
正如问题所提到的,我正在尝试将 .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 分钟 ^^
推荐阅读
- corda - 当在 corda 中使用帐户和 oracle 时,谓词返回 false
- python - 构建自定义 keras 层,我遇到 InvalidArgumentError: Input 'pred' pass float expected bool while building
- node.js - 使用 Node.js 在 MognoDB 中查询
- windows - 退出 VSCode 中的“输入命令号”
- javascript - 获取vue cart list l中的模型关系
- laravel - 为什么在我从中删除许可时角色也被删除了?
- javascript - 出于审美原因,我如何将 .then 表示法重写为异步函数
- python - 如何在Python中读取目录和所有文件
- asp.net-core - 在同一解决方案中的多个项目之间共享 web.config 转换
- google-bigquery - 如何连接到 VPC 项目