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

问题描述:

ranlib的手册页上说:linux: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 

我试图beforand 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做了哪些工作? 谢谢。

+0

为什么你会期望在这种情况下的变化?在这两种情况下,索引都是相同的 - 命令的确定性输出是可取的(我相信你遇到了binutils的'--enable-deterministic-archives'配置选项) – Petesh

如果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 

但是文件大小将保持不变。

$ 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功能,而无需回旋添加到构建过程工作。

对于现代的GNU工具,我不知道是否真的有可能创建没有索引的归档。 ar默认情况下创建索引,我没有看到一个选项不创建一个,我看不到任何命令将其删除。

创建后在档案上运行ranlib是为了让您的构建过程能够在旧式的UNIX系统上工作。