本资源的原文使用英文撰写。 为方便起见,TI 提供了译文;由于翻译过程中可能使用了自动化工具,TI 不保证译文的准确性。 为确认准确性,请务必访问 ti.com 参考最新的英文版本(控制文档)。
本文档是德州仪器 (TI) 的 MSP430 系列处理器的基于 ELF 的嵌入式应用二进制接口 (EABI) 规范。EABI 是宽泛的标准,定义了程序、程序组件和执行环境(如果存在操作系统,还包括操作系统)之间的低级别接口。EABI 的组件包括调用约定、数据布局和寻址约定、和目标文件格式。
本规范旨在使 MSP430 的工具提供商、软件提供商和用户能够构建彼此可互操作的工具和程序。
在 TI 的 MSP430 编译器工具 4.0 版本发布之前,MSP430 的唯一 ABI 是基于 COFF 的原始 ABI。它严格上来说是一个裸机 ABI;没有执行级别的组件。
TI 编译器工具的 4.0 版本引入了一种名为 MSP430 EABI 的新 ABI。它基于 ELF 目标文件格式。它源自业界标准模型,包括 IA-64 C++ ABI 和用于 ELF 和动态链接的 System V ABI。ABI 的处理器特定方面(例如数据布局和调用约定)与 COFF ABI 相比基本没有变化,尽管存在一些差异。毋庸置疑,COFF ABI 和 EABI 是不兼容的;也就是说,给定系统中的所有代码都必须遵循相同的 ABI。TI 的编译器工具支持新的 EABI 和旧的 COFF ABI,但我们鼓励迁移到新的 ABI,因为未来可能会停止支持 COFF ABI。
平台 是程序运行所在的软件环境。ABI 具有特定于平台的方面,尤其是在与执行环境相关的约定领域,例如程序段的数量和使用、寻址约定、可见性约定、抢占、程序加载和初始化。目前裸机是唯一受支持的平台。裸机 一词表示不存在任何特定环境。这并不是说不能有操作系统,而是说没有特定于操作系统的 ABI 规范。换句话说,裸机 ABI 未涵盖程序的加载和运行方式以及它如何与系统的其他部分进行交互。
裸机 ABI 允许在许多具体方面存在很大的可变性。例如,实现可能提供位置独立性 (PIC),但如果给定系统不要求位置独立性,则这些约定不适用。由于这种可变性,程序可能仍然符合 ABI,但不兼容;例如,如果一个程序使用 PIC,但另一个程序不使用,则它们无法互操作。工具链应努力强制执行此类不兼容性。
图 1-1 显示了 ABI 的组成部分及其关系。我们将从下到上简要描述图中的这些组成部分,并提供在此 ABI 规范中参考的相应章节。
底部区域的组成部分与目标级互操作性有关。
C 语言 ABI(Chapter2、Chapter3、Chapter4、Chapter5、Chapter6和Chapter7)规定了函数调用约定、数据类型表示、寻址约定和 C 运行时库的接口。
C++ ABI(Chapter8)规定了如何实现 C++ 语言;这包括有关虚拟函数表、名称改编、如何调用构造函数以及异常处理机制(Chapter9)的详细信息。MSP430 C++ ABI 基于流行的 IA-64 (Itanium) C++ ABI。
DWARF 组成部分(Chapter10)规定了目标级调试信息的表示。基本标准是 DWARF3 标准。此规范详细说明了处理器特定的扩展。
ELF 组成部分(Chapter11)规定了目标文件的表示。该规范为系统 V ABI 规范扩充了处理器特定的信息。
构建属性(Chapter13)是指一种将影响对象间兼容性的各种形参(如目标设备假设、内存模型或 ABI 变体)编码到目标文件中的方法。工具链可以使用构建属性来防止组合或加载不兼容的目标文件。
图中间区域的组成部分与执行时互操作性有关。
图 1-1 顶部的组成部分为 ABI 扩充了平台特定的约定,后者可以定义使可执行文件与执行环境兼容的要求,如程序段的数量和使用、寻址约定、可见性约定、抢占、程序加载和初始化。裸机是指缺失任何具体环境。
最后,有一组规范不是 ABI 的正式组成部分,但本文档进行了介绍以供参考,同时供其他工具链选择实现。
初始化(Chapter14)是指初始化变量赖以获取其初始值的机制。名义上,这些变量驻留在 .data 段中,在加载 .data 段时会直接将它们初始化,不需要工具额外参与。然而,TI 工具链支持一种机制,通过该机制,.data 段能够以压缩形式编码到目标文件中,并在启动时解压缩。这是一种通用机制的特殊用法,该机制以编程方式将压缩后的代码或数据从离线存储(例如 ROM)复制到其执行地址。我们将该过程称为复制表。虽然不是 ABI 的一部分,但本文档介绍了初始化和复制表机制,以便在需要时通过其他工具链使用。
如前所述,ABI 并未定义所有情况下的具体行为,而是一套允许平台或系统特定变化的原则规范。ABI 中存在可以使用或不使用的模型变体。ABI 在使用此类变体的情况下对实现进行了标准化。有些变体彼此不兼容。如果任何对象使用特定的模型,则所有对象都必须使用。在这种情况下,工具链应使用构建属性来防止组合不兼容的对象。