首页 > 解决方案 > “向存档文件添加索引”是什么意思?

问题描述

我的 C 教科书使用 -s 命令行选项创建存档,该选项将索引添加到以下存档文件。

ar -rcs libfile.a file1.o file2.o

但是,我不明白索引是什么或它的目的?

标签: cstatic-librariesunix-ar

解决方案


将评论转换为答案。

该计划有一段漫长而复杂的历史ranlib。基本上,为了使链接器能够有效地扫描库,某些程序(无论是ar自身还是ranlib)添加了一个特殊的“索引”文件,该文件标识库中定义的符号以及定义每个符号的存档中的目标文件。ar如果任何保存的文件是目标文件,许多版本会自动添加。似乎有些人需要使用该-s选项进行刺激。其他人根本不添加索引文件并依赖于ranlib完成工作。

armacOS 上的文档:

-s— 将目标文件索引写入存档,或更新现有索引,即使没有对存档进行其他更改。您可以将此修饰符标志与任何操作一起使用,也可以单独使用。在存档上运行ar s等同于在其上运行ranlib

很长一段时间以来,我都不需要在 macOS 上明确使用这个选项(我也没有运行过ranlib)——我认为在千禧年的第一个十年中的某个时候,情况发生了变化。

目标文件不是已经带有符号表了吗?在存档文件的开头添加另一个符号表似乎不是多余的吗?

每个对象文件都包含有关该对象文件中内容的信息(以及有关引用对象和已定义对象的信息);存档索引包含关于存档中的多个目标文件中的哪个定义了每个符号的更简单的信息,因此链接器不必单独扫描存档中的每个目标文件。

那么,是否可以说存档开头的索引只是一个巨大的符号表,它替换了每个目标文件中的各个符号表,以便链接器更轻松地工作?

不是取代——增加。它允许链接器识别将哪些目标文件拉入链接的可执行文件。然后,链接器像处理任何其他目标文件一样处理目标文件,检查定义和引用,将新定义的引用标记为满意,并识别尚未定义的先前未使用的引用。但是链接器不必读取档案中的每个文件来确定文件定义了哪些符号——它从索引文件中知道定义了哪些符号。

为了澄清索引,允许链接器找到定义符号的特定目标文件,而不必扫描每个目标文件来解析符号?

是的,这是正确的。


推荐阅读