我的C教科书使用-s命令行选项创建了一个档案,该选项将索引添加到以下档案文件中。
ar -rcs libfile.a file1.o file2.o
但是,我不明白什么是索引或索引的目的?
答案 0 :(得分:3)
将评论转换为答案。
有一段漫长而复杂的历史,部分与ranlib
程序捆绑在一起。基本上,为了使链接程序能够有效地扫描库,某些程序(ar
本身或ranlib
)会添加一个特殊的“索引”文件,该文件标识在库和目标文件中定义的符号在定义每个符号的档案中。 ar
的许多版本会在任何已保存文件是目标文件的情况下自动添加。似乎有些要求使用-s
选项进行探测。其他人根本不添加索引文件,而是依靠ranlib
来完成这项工作。
macOS文档上的ar
:
-s
—将目标文件索引写入存档,或更新现有索引,即使未对存档进行其他更改。您可以通过任何操作或单独使用此修饰符标志。在存档上运行ar s
等同于在存档上运行ranlib
。
很长时间以来,我并不需要在macOS上显式使用此选项(我也没有运行ranlib
)-我认为情况在千年的前十年中的某个时候有所改变。
目标文件是否已经随附符号表?在存档文件的开头添加另一个符号表似乎不是多余的吗?
每个对象文件都包含有关该对象文件中内容的信息(以及有关引用对象和已定义对象的信息);存档索引包含有关存档中许多对象文件中的哪个定义了每个符号的简单得多的信息,因此链接程序不必分别扫描存档中的每个对象文件。
因此,可以说存档开始处的索引只是一个巨大的符号表,它取代了每个目标文件中的各个符号表,这样链接器就可以轻松完成工作了吗?
不替代-增强。它允许链接程序标识将哪些目标文件拖入链接的可执行文件中。链接器然后像处理其他任何目标文件一样处理目标文件,检查定义和引用,将新定义的引用标记为满意,并标识尚未定义的先前未使用的引用。但是链接器不必读取存档中的每个文件即可确定文件定义了哪些符号-它可以从索引文件中知道定义了哪些符号。
为弄清楚索引,链接器可以查找定义符号的特定目标文件,而不必扫描每个目标文件来解析符号?
是的,没错。