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做了哪些工作? 谢谢。
答
如果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系统上工作。
为什么你会期望在这种情况下的变化?在这两种情况下,索引都是相同的 - 命令的确定性输出是可取的(我相信你遇到了binutils的'--enable-deterministic-archives'配置选项) – Petesh