【发布时间】:2019-08-25 17:08:05
【问题描述】:
我的 C 教科书使用 -s 命令行选项创建存档,该选项将索引添加到以下存档文件。
ar -rcs libfile.a file1.o file2.o
但是,我不明白索引是什么或它的用途?
【问题讨论】:
-
ranlib程序有一段漫长而复杂的历史。基本上,为了使链接器能够有效地扫描库,某些程序(ar本身或ranlib)添加了一个特殊的“索引”文件,该文件标识库中定义的符号和存档中定义的目标文件那个符号。如果任何保存的文件是目标文件,许多版本的ar会自动添加。有些似乎需要使用-s选项进行刺激。其他人根本不添加索引文件,而是依靠ranlib来完成这项工作。 -
macOS 文档上的
ar:-s— 将对象文件索引写入存档,或更新现有索引,即使存档没有其他更改。您可以将此修饰符标志与任何操作一起使用,也可以单独使用。在存档上运行ar s等同于在其上运行ranlib。 很长时间以来,我都不需要在 macOS 上显式使用此选项(也没有运行ranlib)——我想事情在千禧年头十年中期的某个时候发生了变化。 -
对象文件包含有关一个对象文件中的内容的信息(以及有关引用对象和已定义对象的信息);存档索引包含关于存档中的多个目标文件中的哪个定义了每个符号的更简单的信息,因此链接器不必单独扫描存档中的每个目标文件。
-
不替代——增强。它允许链接器识别将哪些目标文件拉入链接的可执行文件。然后,链接器像处理任何其他目标文件一样处理目标文件,检查定义和引用,将新定义的引用标记为满意,并识别以前未使用的未定义引用。但是链接器不必读取存档中的每个文件来确定定义了哪些符号——它从索引文件中知道定义了哪些符号。
-
是的,没错。
标签: c static-libraries unix-ar