如前所述,ABI 并未定义所有情况下的具体行为,而是一套允许平台或系统特定变化的原则规范。例如,ABI 并未指定在所有情况下都使用 PIC(与位置无关的代码)寻址,而是针对使用 PIC 的情况标准化其实现。有些变体彼此不兼容。例如,如果任何对象使用 DBST PIC 模型,则所有对象都必须使用。在这种情况下,工具链应使用构建属性来防止组合不兼容的对象。
本节介绍了一些更常见的用例以及它们与 ABI 的关系。这些情况并不相互排斥,也没有完全涵盖所有可能性。
- 裸机 — 独立:此模型是指一个静态连接的自包含可执行文件。就互操作性而言,它是最简单的形式。ABI 的相关部分是图 1-1 下部的对象级别组件。由于可执行文件是静态链接和绑定(重定位)的,因此通常不需要位置独立性。由于它是自包含的,因此不需要包含动态链接信息、过程链接表 (PLT) 存根或全局偏移量表 (GOT)。
- 裸机 — 动态链接:此模型是指这样一个系统,在该系统中,可执行文件可以动态链接到单独链接的模块,但不在操作系统的受控环境中。寻址可能与位置无关,也可能与位置相关,具体取决于环境。环境可能会对寻址或放置方面施加额外的约定。该模型将使用图 1-1 的动态链接组件。有关裸机动态链接模型具体情况的详细信息,请参阅节 14.4。
- 共享对象:这是指动态链接模型,其中静态链接模块(库)可以在多个单独链接的客户端(可执行文件或其他库)之间共享。根本的问题是每个客户端都必须有自己的库数据副本。ABI 通过使用两个相关结构解决了此问题:位置无关寻址和数据段基表 (DSBT) 机制。
- 位置独立性:这是指不使用地址常量的寻址方式,使得能够在任何地址加载并运行代码和/或数据而无需重定位。PIC 一词通常是指与位置无关的代码,但位置独立性可以指代码、数据或两者。共享库需要与位置无关的数据,以便多个客户端可以拥有私有副本;在共享库的语境中,PIC 一词有时表示这一较狭义的定义。如果在创建 ROM 时未绑定其他对象的地址,则 ROM 中的库可能需要与位置无关的寻址来引用其他对象。与位置无关的数据依赖数据页寄存器 (B14)。当涉及多个模块时(例如,使用动态链接),DSBT(数据段基表)模型是一种机制,可用于在从一个模块调用到另一个模块时复位 DP。
- Linux:为 Linux 环境构建的可执行文件和共享库必须遵循某些约定。它们具有动态链接信息。它们需要使用 DSBT 模型来实现位置独立性。为 Linux 构建的对象在 ELF 标头的 EI_OSABI 字段中具有 ELFOSABI_C6000_LINUX 标志。有关针对 Linux 平台的 ABI 增强的详细信息,请参阅Chapter15。
- ROM 操作:可能需要构建一个驻留在 ROM 中的单独链接的模块。链接后,其地址会被永久绑定。它随后可能会静态或动态链接到其他模块。为此,ABI 定义了一类特殊的 ELF 文件,该类文件提供静态和动态链接视图以及几个段标志,以指示其地址永久绑定的段。ROM 模块通常使用 PIC 寻址,使它们独立于其所引用的其他模块的位置。