ZHCADC4A September 2011 – March 2014
图 1-1 显示了 ABI 的组成部分及其关系。我们将从下到上简要描述图中的这些组成部分,并提供在此 ABI 规范中参考的相应章节。
底部区域的组成部分与目标级互操作性有关。
C 语言 ABI(Chapter2、Chapter3、Chapter4、Chapter5、Chapter8和Chapter9)规定了函数调用约定、数据类型表示、寻址约定和 C 运行时库的接口。
C++ ABI(Chapter10)规定了如何实现 C++ 语言;这包括有关虚拟函数表、名称改编、如何调用构造函数以及异常处理机制(Chapter11)的详细信息。C6000 C++ ABI 基于流行的 IA-64 (Itanium) C++ ABI。
DWARF 组成部分(Chapter12)规定了目标级调试信息的表示。基本标准是 DWARF3 标准。此规范详细说明了处理器特定的扩展。
ELF 组成部分(Chapter13)规定了目标文件的表示。该规范为系统 V ABI 规范扩充了处理器特定的信息。
构建属性(Chapter17)是指一种将影响对象间兼容性的各种形参(如目标设备假设、内存模型或 ABI 变体)编码到目标文件中的方法。工具链可以使用构建属性来防止组合或加载不兼容的目标文件。
图中间区域的组成部分与执行时互操作性有关。动态链接组成部分(Chapter6和节 14.3)规定了各单独链接的模块可以用来互操作的机制,包括共享它们的代码。数据寻址方法属于动态链接机制的一部分,这样,单独链接的模块便可以在不进行重定位的情况下,对彼此的数据进行寻址。
线程局部存储(Chapter7)支持创建静态存储持续时间的线程特定变量。本文档描述了线程局部变量的规范、表示和访问。
符号版本控制(Chapter16)是一种机制,通过该机制,符号引用可以包含最低版本,这样就可以使用至少具有该版本的定义来动态解析它们,以便防止运行时不兼容问题。本 ABI 采用标准 GCC/Linux 模型,不做任何更改。
图 1-1 顶部的组成部分为 ABI 扩充了平台特定的约定,后者可以定义使可执行文件与执行环境兼容的要求,如程序段的数量和使用、寻址约定、可见性约定、抢占、程序加载和初始化。裸机是指缺失任何具体环境。ABI 目前涵盖的唯一其他环境是 Linux 平台(Chapter15)。
最后,有一组规范不是 ABI 的正式组成部分,但本文档进行了介绍以供参考,同时供其他工具链选择实现。
初始化(Chapter18)是指初始化变量赖以获取其初始值的机制。名义上,这些变量驻留在 .data 段中,在加载 .data 段时会直接将它们初始化,不需要工具额外参与。然而,TI 工具链支持一种机制,通过该机制,.data 段能够以压缩形式编码到目标文件中,并在启动时解压缩。这是一种通用机制的特殊用法,该机制以编程方式将压缩后的代码或数据从离线存储(例如 ROM)复制到其执行地址。我们将该过程称为复制表。虽然不是 ABI 的一部分,但本文档介绍了初始化和复制表机制,以便在需要时通过其他工具链使用。
程序标头属性(Chapter19)是由 TI 工具链实现的 ELF 扩展,用于表示 ELF 段在基本 ELF 标准指定属性之外的各种其他属性。TI 工具使用这类属性对内存连接/延迟要求、保护、高速缓存行为和其他系统特定属性进行编码。这类属性具有灵活性和可扩展性。同样,本文档对其进行了介绍,以便在需要时使用其他工具更改这些属性。