【问题标题】:Archive has no index; run ranlib to add one (when linking with a .a containing a MachO64 object file on Linux)存档没有索引;运行 ranlib 以添加一个(在 Linux 上与包含 MachO64 目标文件的 .a 链接时)
【发布时间】: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.o
ar rcs libasm.a ft_strlen.o
ranlib libasm.a
gcc 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


【解决方案1】:

使用nasm -f elf64 ft_strlen.s -o ft_strlen.o为基于 Linux 的操作系统(或者更准确地说是 ELF64 系统)生成目标文件

更多信息nasm -hf查看nasm -f的所有有效输出格式

小提示:不需要ranlib 命令,因为ar s 已经在索引库。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2016-07-20
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多