c - “向存档文件添加索引”是什么意思?
问题描述
我的 C 教科书使用 -s 命令行选项创建存档,该选项将索引添加到以下存档文件。
ar -rcs libfile.a file1.o file2.o
但是,我不明白索引是什么或它的目的?
解决方案
将评论转换为答案。
该计划有一段漫长而复杂的历史ranlib
。基本上,为了使链接器能够有效地扫描库,某些程序(无论是ar
自身还是ranlib
)添加了一个特殊的“索引”文件,该文件标识库中定义的符号以及定义每个符号的存档中的目标文件。ar
如果任何保存的文件是目标文件,许多版本会自动添加。似乎有些人需要使用该-s
选项进行刺激。其他人根本不添加索引文件并依赖于ranlib
完成工作。
ar
macOS 上的文档:
-s
— 将目标文件索引写入存档,或更新现有索引,即使没有对存档进行其他更改。您可以将此修饰符标志与任何操作一起使用,也可以单独使用。在存档上运行ar s
等同于在其上运行ranlib
。
很长一段时间以来,我都不需要在 macOS 上明确使用这个选项(我也没有运行过ranlib
)——我认为在千禧年的第一个十年中的某个时候,情况发生了变化。
目标文件不是已经带有符号表了吗?在存档文件的开头添加另一个符号表似乎不是多余的吗?
每个对象文件都包含有关该对象文件中内容的信息(以及有关引用对象和已定义对象的信息);存档索引包含关于存档中的多个目标文件中的哪个定义了每个符号的更简单的信息,因此链接器不必单独扫描存档中的每个目标文件。
那么,是否可以说存档开头的索引只是一个巨大的符号表,它替换了每个目标文件中的各个符号表,以便链接器更轻松地工作?
不是取代——增加。它允许链接器识别将哪些目标文件拉入链接的可执行文件。然后,链接器像处理任何其他目标文件一样处理目标文件,检查定义和引用,将新定义的引用标记为满意,并识别尚未定义的先前未使用的引用。但是链接器不必读取档案中的每个文件来确定文件定义了哪些符号——它从索引文件中知道定义了哪些符号。
为了澄清索引,允许链接器找到定义符号的特定目标文件,而不必扫描每个目标文件来解析符号?
是的,这是正确的。
推荐阅读
- asp.net-mvc - ASP.NET Core Capturing POST data
- django - 如何制作具有复杂权限的 Django REST 用户 API
- javascript - 如何使用 html、css、bootstrap 在下拉列表中创建活动元素
- python - Tkinter 交互式和动态 GUI
- android - 当应用程序处于后台/被杀死时,Firebase FCM 不调用服务
- angular - rxjs6 - TypeError:无法读取未定义的属性“管道”
- javascript - React 组件不会重新渲染
- html - 引导程序 3 与引导程序 4
- replace - 用另一个字符串替换字符串
- dart - 如果类型化函数不返回值,Dart 分析器不应该显示警告吗?