ZHCADC4A September 2011 – March 2014
Tag_ISA (=4), ULEB128
此标签指定可以执行文件中所编码指令的 C6000 ISA。定义的值如下:
0 | ISA 未指定 | |
1 | C62x | |
2 | 保留 | |
3 | C67x | |
4 | C67x+ | |
5 | 保留 | |
6 | C64x | |
7 | C64x+ | |
8 | C6740 | |
9 | Tesla | |
10 | C6600 |
此标签确定对象兼容性,如下所示。在这里,传递关系 A < B 表示 B 与 A 兼容;也就是说,B 可以执行为 A 或 B 生成的代码。组合属性时,应使用可以执行这两个属性的最大 ISA(本例中为 B)。
下列有向图展示了 C6000 ISA 兼容性,其中有向边 A→B 表示兼容性关系 A < B。
Tag_ABI_wchar_t, (=6), ULEB128
0 | 未使用 wchar_t。 | |
1 | wchar_t 的大小为 2 个字节。 | |
2 | wchar_t 的大小为 4 个字节。 |
节 2.1 将 wchar_t 指定为 unsigned int。但是,在某些情况下,TI 工具链将 wchar_t 定义为 unsigned short。利用此标签,可以检测此违规导致的任何不兼容性。
Tag_ABI_stack_align_needed, (=8), ULEB128
0 | 代码要求在函数边界处进行 8 字节栈对齐。 | |
1 | 代码要求在函数边界处进行 16 字节栈对齐。 |
Tag_ABI_stack_align_preserved, (=10), ULEB128
0 | 代码要求在函数边界处进行 8 字节栈对齐。 | |
1 | 代码要求在函数边界处进行 16 字节栈对齐。 |
当前支持的所有 ISA 都使用 8 字节栈对齐。未来的 ISA 预计将采用 16 字节对齐。
需要 16 字节栈对齐的代码与仅保留 8 字节对齐的代码不兼容。合并标签时,结果应反映 TAG_ABI_stack_align_preserved 给出的最小对齐,以及 TAG_ABI_stack_align_needed 给出的最大对齐。
Tag_ABI_DSBT, (=12), ULEB128
0 | 不使用 DSBT 寻址。 | |
1 | 使用 DSBT 寻址。 |
Tag_ABI_PID, (=14), ULEB128
0 | 数据寻址与位置相关。 | |
1 | 数据寻址与位置无关;GOT 通过使用 near DP 寻址来访问。 | |
2 | 数据寻址与位置无关;GOT 通过使用 far DP 寻址来访问。 |
具有非零 Tag_ABI_PID 的目标文件不对数据使用绝对寻址。所有数据均使用 DP 相对 GOT 寻址,或者在只读常量的情况下使用 PC 相对寻址进行寻址。此类对象可以动态分配其 DP 相关数据段的位置,而不需要按照共享对象的要求进行重定位。
值 2 表示对象依赖于基于 far GOT 的寻址(请参阅 节 6.6)。也就是说,GOT 本身较远。
Tag_ABI_PIC, (=16), ULEB128
0 | 寻址约定不适用于共享对象。 | |
1 | 寻址约定适用于共享对象。 |
Tag_ABI_PIC 指示该对象遵循共享对象所需的寻址约定,尤其是对导入变量的所有引用都通过 GOT 寻址。
链接共享库时,链接器应强制构成该库的所有对象上存在此标签。
名称 Tag_ABI_PIC 可能会产生误导。“位置独立性”一词可能意味着多个相关的属性,这些属性可能等于也可能不等于共享对象所需的属性。因此,此属性是根据后者集合定义的。
Tag_ABI_array_object_alignment, (=18), ULEB128
0 | 数组变量在 8 字节边界上对齐。 | |
1 | 数组变量在 4 字节边界上对齐。 | |
2 | 数组变量在 16 字节边界上对齐。 |
Tag_ABI_array_object_align_expected,(=20), ULEB128
0 | 代码假设数组变量采用 8 字节对齐。 | |
1 | 代码假设数组变量采用 4 字节对齐。 | |
2 | 代码假设数组变量采用 16 字节对齐。 |
前两个标签适用于具有外部可见性的数组变量,如 节 2.6中所述。为了实现兼容性,TAB_ABI_array_align_expected 标签表示的对齐值必须小于或等于 TAG_ABI_array_object_alignment 标签表示的对齐值。合并标签时,结果应反映 TAG_ABI_array_object_alignment 给出的最小对齐和 TAG_ABI_array_object_align_expected 给出的最大对齐。
Tag_ABI_compatibility, (=32), ULEB128, char[]
此标签使供应商能够安排超出 ABI 范围的特定兼容性约定。它有两个操作数、一个 ULEB128 标志和一个以 NULL 结尾的字符串。该字符串指定由安排供应商定义的额外 ABI 约定的名称。该标志根据约定描述对象的特征。在以下说明中,“ABI 兼容”一词表示符合此 ABI,并符合本文档中规定的条件,例如其他构建属性标签。标志值为:
0 | 该对象没有特定于工具链的兼容性要求,因此与任何其他 ABI 兼容对象兼容。 | |
1 | 该对象与其他 ABI 兼容对象兼容,前提是该对象由符合命名约定的工具链(例如,如果约定指定了供应商,则是该供应商的工具链)进行处理。 | |
N>1 | 该对象与 ABI 不兼容,但可能与命名约定下的其他对象兼容。在这种情况下,约定对标志的解释作了定义。 |
请注意,该字符串标识额外的 ABI 约定,不一定是生成该文件的工具链。
如果省略了 ABI 兼容性标签,其含义与标志值为 0 的标签相同(无其他兼容性要求)。
Tag_ABI_conformance, (=67), char[]
此标签指定对象符合的 ABI 版本。标签值是以 NULL 结尾且包含 ABI 版本的字符串。此标准中指定的版本为“1.0”。小数点后面的数字仅供参考,不影响兼容性检查。
为了方便消费者识别 while 文件符合 ABI 的常见情况,此标签应该是 C6000 子段中第一个属性矢量的第一个属性。
表 17-1 总结了由 ABI 定义的构建属性标签。
标签 | 标签值 | 形参类型 | 兼容性规则 |
---|---|---|---|
Tag_File | 1 | uint32 | |
Tag_Section | 2 | uint32 | |
Tag_Symbol | 3 | uint32 | |
Tag_ISA | 4 | ULEB128 | 请参阅前面的说明 |
Tag_ABI_wchar_t | 6 | ULEB128 | 如果不为零,则必须完全匹配 |
Tag_ABI_stack_align_needed | 8 | ULEB128 | 必须与 Tag_ABI_stack_align_preserved 兼容。 结合使用最大值。 |
Tag_ABI_stack_align_preserved | 10 | ULEB128 | 必须与 Tag_ABI_stack_align_needed 兼容。 结合使用最小值。 |
Tag_ABI_DSBT | 12 | ULEB128 | 准确 |
Tag_ABI_PID | 14 | ULEB128 | 如果不同,则发出警告;结合使用最小值。 |
Tag_ABI_PIC | 16 | ULEB128 | 构建共享库时如果不存在,则发出警告;结合使用最小值。 |
TAG_ABI_array_object_alignment | 18 | ULEB128 | 必须至少与 TAG_ABI_array_object_align_expected 对齐。 结合使用最大对齐。 |
TAG_ABI_array_object_align_expected | 20 | ULEB128 | 必须 <= TAG_ABI_array_object_alignment 中的对齐。 结合使用最小对齐。 |
Tag_ABI_compatibility | 32 | ULEB128 char[] | 请参阅文本说明。 |
Tag_ABI_conformance | 67 | char[] | 未指定 |