【问题标题】:linux: ranlib doesn't seem to add any new information into an archive file?linux:ranlib 似乎没有将任何新信息添加到存档文件中?
【发布时间】:2016-10-03 12:43:31
【问题描述】:

ranlib 的手册页说:

描述 ranlib 生成档案内容的索引并将其存储在档案中。该索引列出了由可重定位目标文件的存档成员定义的每个符号。

好吧,我尝试编译如下存档文件:

$ cat o.c
#include<stdio.h>
int f(){
  printf("hello\n");
  return 2;
}

gcc -o o.o -c o.c
ar rc libmyobject.a o.o
cp libmyobject.a libmyobject.a.keep
ranlib libmyobject.a

我尝试比较ranlib之前和之后的库文件大小,我得到:

-rw-rw-r-- 1 a a   1626 Oct  3 12:03 libmyobject.a.keep
-rw-rw-r-- 1 a a   1626 Oct  3 12:06 libmyobject.a

它们的大小相同。这出乎我的意料。我希望 runlib 将一些额外的信息存储到 .a 文件中。但实际上,文件大小还是一样的。

那么,ranlib 到底做了什么工作,我如何检查 ranlib 做了什么工作呢? 谢谢。

【问题讨论】:

  • 您为什么希望在这种情况下有所改变?在这两种情况下,索引都是相同的——命令的确定性输出是可取的(我相信你遇到了 binutils 的 --enable-deterministic-archives 配置选项)

标签: linux gcc indexing archive


【解决方案1】:

如果 binutils 使用 --enable-deterministic-archives 编译,则默认情况下,在同一输入源上多次运行 ranlib 将生成相同的输出文件,因为它会将时间戳、uid 和 gid 值归零。

您可以通过传递-U 标志来强制它是非确定性的,这将导致时间戳、uid 和 gid 值的存储,并且因为时间戳会改变文件会有所不同:

$ ranlib -U libmyobject.a
$ diff libm*
Binary files libmyobject.a and libmyobject.a.keep differ

不过,文件 size 将保持不变。

$ ls -l libm*
-rw-r--r-- 1 xx xx 1618 Oct  3 13:58 libmyobject.a
-rw-r--r-- 1 xx xx 1618 Oct  3 13:58 libmyobject.a.keep

请记住,此类工具中的确定性实际上是非常可取的,因为它允许 Reproducible Builds 等功能工作,而无需在构建过程中添加卷积。

【讨论】:

    【解决方案2】:

    使用现代 GNU 工具,我不知道是否真的可以创建没有索引的存档。 ar 默认创建索引,我没有看到不创建索引的选项,也没有看到任何删除它的命令。

    在创建存档后在存档上运行ranlib 是为了让您的构建过程在旧的、更古怪的 UNIX 系统上运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-11
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 2012-07-08
      相关资源
      最近更新 更多