使用存档文件进行编译:为什么,还有其他选择吗?

时间:2012-03-12 14:45:23

标签: linux compilation kernel archive glibc

在编译过程中,Linux内核创建liba.a,其中包含来自不同目录的许多built-in.o和其他目标文件,并将其用作最终vmlinux链接的主要组件。我在glibc编译中看到了类似的归档文件的使用,现在我想知道为什么这些项目使用归档文件以及它的好处。

据我所知,使用ar生成的存档文件只是包含在其中的单个文件的容器。除了减少每个目标文件的文件搜索时间之外,我没有看到使用它的好处。这是在编译过程中使用存档文件的原因吗?

如果是这样,我会感到惊讶的是,文件名搜索具有重要意义,可以让内核人员关注,我想知道不使用存档文件的成本是多少,以及是否有任何替代类似问题而没有空间.a文件效率低下。

2 个答案:

答案 0 :(得分:2)

Re:除了减少每个目标文件的文件搜索时间外,我没有看到使用它的好处。

您对这种好处的理解并不完全正确。档案可减少解决个别符号的工作量。

如果从多个单独的.o文件中链接程序,链接器必须同时考虑它们。引用可以向任何方向发展。命令行中的最后一个.o可以在第一个.o中调用函数,反之亦然。

归档不是这种情况(默认情况下,至少是这种情况)。对于归档,早期归档中的函数只能引用其定义出现在后面的归档中的符号。 (这也与传统的Unix约定有关,为什么-l链接器选项会在命令行的末尾出现!!!首先是你的.o文件,然后是命令行。)

这意味着一旦出现定义符号的存档,您就可以确定后来的存档不再使用该符号。这意味着您可以从数据结构中删除它。你基本上“完成”链接特定的库;它已经满足了先前的参考文献,剩下的就是满足ITS尚未解决的参考文献。如果你正确地订购链接过程,并且软件分层很好,你可以随时减少未完成的符号数。

Linux已经有20多年的历史了,它的构建系统有着悠久而丰富的历史,就像代码一样。最初没有使用档案;我认为这只是从2.6开始的。此外,依赖关系曾经由GNU awk脚本生成。人们使用4兆内存在25 Mhz 386盒子上构建内核,哈哈。

今天使用档案,因为内核越来越需要它们。这不仅仅是为了它!#/ p>

答案 1 :(得分:0)

我的头脑中有几个原因:

扩展Duck sez:“链接编辑器”(“ld”),又名“链接器”,(“man ld”)获取一堆编译的目标文件(.o文件) )和库(“归档”,如你所说),它们可以是“静态”库(.a文件)或“共享库”(.so文件),并将它们“链接”成“可执行文件”(“程序”) )。通过指定ld选项的多个出现来告诉-l使用哪些库。想象一下,必须指定几千-l个选项,每个组件.o一个,而不是几十个或更少,每个库一个。

与一个功能区域相关的代码可以放入一个库中供其他代码使用和重用。例如,/usr/lib/libcrypt.*提供加密功能,/usr/lib/libssl*提供安全套接字层的支持代码等。

此外,我不知道当他/她说“档案馆最初没有使用......”时,Kaz的意思是什么时候,但是“档案馆”,静态图书馆,已经被用作1983年的“最近”( !)。直到90年代初,我才遇到动态共享库。