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做了什么工作? 感谢。
答案 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系统上运行。