linux:ranlib似乎没有将任何新信息添加到存档文件中?

时间:2016-10-03 12:43:31

标签: linux gcc indexing archive

ranlib的手册页说:

说明        ranlib生成归档内容的索引并将其存储在归档中。索引列出了作为可重定位目标文件的存档成员定义的每个符号。

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

Image/Content/Uploaded

我试图在ranlib之后比较库文件beforand的大小,我得到了:

$ 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

他们的大小相同。这超出了我的预期。我希望runlib会将一些额外的信息存储到.a文件中。但实际上,文件大小仍然相同。

那么ranlib实际上做了什么工作,我怎样才能检查ranlib做了什么工作? 感谢。

2 个答案:

答案 0 :(得分:1)

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

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

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

然而,尺寸文件将保持不变。

$ 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之类的功能无需在构建过程中添加卷积即可工作。

答案 1 :(得分:0)

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

创建存档后,在存档上运行ranlib是为了使构建过程在较旧的,较为曲折的UNIX系统上运行。