gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 09:23:03 25 4
gpt4 key购买 nike

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 编译的,那么默认情况下,在相同输入源上多次运行 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 这样的功能。无需在构建过程中添加卷积即可工作。

关于linux: ranlib 似乎没有将任何新信息添加到存档文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39831966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com