【发布时间】:2020-07-01 07:43:08
【问题描述】:
我尝试创建一个库并对其进行测试,但发生了错误。
错误代码:
./libasm.a: error adding symbols: Archive has no index; run ranlib to add one
collect2: error: ld returned 1 exit status
我是这样编译的。nasm -f macho64 ft_strlen.s -o ft_strlen.oar rcs libasm.a ft_strlen.oranlib libasm.agcc main.c libasm.a
以下是源文件
;ft_strlen.s
segment .text
global ft_strlen
ft_strlen:
mov rax, 0
jmp count
count:
cmp BYTE [rdi + rax], 0
je exit
inc rax
jmp count
exit:
ret
/*main.c*/
#include <stdio.h>
int ft_strlen(char *str);
int main(void)
{
char *str = "hello world";
printf("%d \n", ft_strlen(str));
}
我正在使用安装在 wsl 上的 ubuntu。
我做错了什么?
【问题讨论】:
-
macho64适用于 MacOS。对于 Linux(包括 WSL)使用-f elf64。不确定这是否是您唯一的问题;大多数人不会将他们的.o文件添加到静态库中,他们只是像gcc -fno-pie -no-pie -g main.c ft_strlen.o一样正常链接它们。 -
代码审查:对 GAS 可以组装的文件使用
.s,例如gcc -S输出。将.asm用于 NASM 源(您不能直接在其上运行 GCC)。此外,jmp count毫无意义——如果没有jmp,执行将进入循环。您可以旋转循环以将条件分支放在底部,就像普通的惯用汇编代码一样,然后jmp到该分支条件以在增量之前进行检查以启动循环。或者只是从rax=-1开始,让第一个增量运行以使其成为0。
标签: c linux assembly static-libraries unix-ar