【问题标题】:What does it mean to 'add an index to an archive file'?“向存档文件添加索引”是什么意思?
【发布时间】: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


【解决方案1】:

将 cmets 转换为答案。

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

macOS 文档上的ar

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

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

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

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

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

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

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

是的,没错。

【讨论】:

    猜你喜欢
    • 2014-02-23
    • 2018-03-01
    • 1970-01-01
    • 2019-07-25
    • 2014-09-28
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多