微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何防止 strip 删除 ar 存档的索引? 完整示例

如何解决如何防止 strip 删除 ar 存档的索引? 完整示例

我编写了一个包含 a.cb.c,以及另一个使用该库的程序 c.c。我已使用 ar 存档以进行分发。以下是我使用的命令:

gcc -g -c -o a.o a.c    # Compile a.c
gcc -g -c -o b.o b.c    # Compile b.c
ar r ab.a a.o b.o       # Generate library ab.a

gcc -o c c.c ab.a       # Compile c.c

到目前为止一切正常。但我想去掉 ab.a 中的一些部分(例如调试信息、内部函数),所以我在库上运行 strip --keep-symbol=... ab.a。现在我不能再编译 c.c 了。我得到的错误是:

+ gcc -o c c.c ab.a
/usr/bin/ld: ab.a: error adding symbols: archive has no index; run ranlib to add one
collect2: error: ld returned 1 exit status

如果我在剥离后运行 ranlib ab.a,一切正常。我的问题是:是否可以更改 strip 命令中的参数,以便我不需要运行 ranlib ab.a


完整示例

a.c

int a1()
{
    return 1;
}

int a2()
{
    return 2;
}

b.c

int b1()
{
    return 3;
}

int b2()
{
    return 4;
}

c.c

#include <stdio.h>

int a1();
int a2();
int b1();
int b2();

int main()
{
    printf("%d ",a1());
    printf("%d ",a2());
    printf("%d ",b1());
    printf("%d\n",b2());
}

Bash 脚本到“存档没有索引”错误

gcc -g -c -o a.o a.c
gcc -g -c -o b.o b.c
ar r ab.a a.o b.o
strip --keep-symbol={a1,a2,b1,b2} ab.a
# ranlib ab.a
gcc -o c c.c ab.a
./c

运行 bash 脚本

  • 直接运行bash脚本->查看错误
  • 注释 strip 行 -> 成功(符号未剥离)
  • 取消注释 ranlib 行 -> 成功

我使用的软件版本:

  • gcc (GCC) 10.2.1 20201125(红帽 10.2.1-9)
  • GNU ar 版本 2.35-18.fc33
  • GNU 剥离版本 2.35-18.fc33
  • GNU ranlib 版本 2.35-18.fc33

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。