ZHCADC4A September   2011  – March 2014

 

  1.   1
  2. 简介
    1. 1.1  ABI - C6000
    2. 1.2  范围
    3. 1.3  ABI 变体
    4. 1.4  工具链和互操作性
    5. 1.5 
    6. 1.6  目标文件的类型
    7. 1.7 
    8. 1.8  C6000 架构概述
    9. 1.9  参考文档
    10. 1.10 代码片段表示法
  3. 数据表示
    1. 2.1 基本类型
    2. 2.2 寄存器中的数据
    3. 2.3 存储器中的数据
    4. 2.4 复数类型
    5. 2.5 结构体和联合体
    6. 2.6 数组
    7. 2.7 位字段
      1. 2.7.1 易失性位字段
    8. 2.8 枚举类型
  4. 调用约定
    1. 3.1 调用和返回
      1. 3.1.1 返回地址计算
      2. 3.1.2 调用指令
      3. 3.1.3 返回指令
      4. 3.1.4 流水线约定
      5. 3.1.5 弱函数
    2. 3.2 寄存器惯例
    3. 3.3 实参传递
    4. 3.4 返回值
    5. 3.5 通过引用传递并返回的结构体和联合体
    6. 3.6 编译器辅助函数的约定
    7. 3.7 段间调用的暂存寄存器
    8. 3.8 设置 DP
  5. 数据分配和寻址
    1. 4.1 数据段和数据区段
    2. 4.2 静态数据的分配和寻址
      1. 4.2.1 静态数据的寻址方法
        1. 4.2.1.1 near DP 相对寻址
        2. 4.2.1.2 Far DP 相对寻址
        3. 4.2.1.3 绝对寻址
        4. 4.2.1.4 GOT 间接寻址
        5. 4.2.1.5 PC 相对寻址
      2. 4.2.2 静态数据的放置约定
        1. 4.2.2.1 放置的抽象约定
        2. 4.2.2.2 寻址的抽象约定
        3. 4.2.2.3 链接器要求
      3. 4.2.3 静态数据的初始化
    3. 4.3 自动变量
    4. 4.4 帧布局
      1. 4.4.1 栈对齐
      2. 4.4.2 寄存器保存顺序
        1. 4.4.2.1 大端字节序对交换
        2. 4.4.2.2 示例
      3. 4.4.3 DATA_MEM_BANK
      4. 4.4.4 C64x+ 特定的堆栈布局
        1. 4.4.4.1 _ _C6000_push_rts 布局
        2. 4.4.4.2 紧凑帧布局
    5. 4.5 堆分配对象
  6. 代码分配和寻址
    1. 5.1 计算代码标签的地址
      1. 5.1.1 代码的绝对寻址
      2. 5.1.2 PC 相对寻址
      3. 5.1.3 同一段内的 PC 相对寻址
      4. 5.1.4 短偏移 PC 相对寻址 (C64x)
      5. 5.1.5 基于 GOT 的代码寻址
    2. 5.2 分支
    3. 5.3 调用
      1. 5.3.1 直接 PC 相对调用
      2. 5.3.2 Far Call Trampoline
      3. 5.3.3 间接调用
    4. 5.4 寻址紧凑指令
  7. 动态链接的寻址模型
    1. 6.1 术语和概念
    2. 6.2 动态链接机制概述
    3. 6.3 DSO 和 DLL
    4. 6.4 抢占
    5. 6.5 PLT 条目
      1. 6.5.1 直接调用导入函数
      2. 6.5.2 通过绝对地址寻址的 PLT 条目
      3. 6.5.3 通过 GOT 寻址的 PLT 条目
    6. 6.6 全局偏移表
      1. 6.6.1 使用 Near DP 相对寻址的基于 GOT 的引用
      2. 6.6.2 使用 Far DP 相对寻址的基于 GOT 的引用
    7. 6.7 DSBT 模型
      1. 6.7.1 导出函数的进入/退出序列
      2. 6.7.2 避免在内部函数中使用 DP 负载
      3. 6.7.3 函数指针
      4. 6.7.4 中断
      5. 6.7.5 与非 DSBT 代码的兼容性
    8. 6.8 动态链接的性能影响
  8. 线程局部存储分配和寻址
    1. 7.1 关于多线程和线程局部存储
    2. 7.2 术语和概念
    3. 7.3 用户界面
    4. 7.4 ELF 目标文件表示
    5. 7.5 TLS 访问模型
      1. 7.5.1 C6x Linux TLS 模型
        1. 7.5.1.1 通用动态 TLS 访问模型
        2. 7.5.1.2 局部动态 TLS 访问模型
        3. 7.5.1.3 初始可执行文件 TLS 访问模型
          1. 7.5.1.3.1 线程指针
          2. 7.5.1.3.2 初始可执行文件 TLS 寻址
        4. 7.5.1.4 局部可执行文件 TLS 访问模型
      2. 7.5.2 静态可执行文件 TLS 模型
        1. 7.5.2.1 静态可执行文件寻址
        2. 7.5.2.2 静态可执行文件 TLS 运行时架构
        3. 7.5.2.3 静态可执行文件 TLS 分配
          1. 7.5.2.3.1 TLS 初始化映像分配
          2. 7.5.2.3.2 主线程的 TLS 分配
          3. 7.5.2.3.3 线程库的 TLS 区域分配
        4. 7.5.2.4 静态可执行文件 TLS 初始化
          1. 7.5.2.4.1 主线程的 TLS 初始化
          2. 7.5.2.4.2 线程库进行 TLS 初始化
        5. 7.5.2.5 线程指针
      3. 7.5.3 裸机动态链接 TLS 模型
        1. 7.5.3.1 用于裸机动态链接的默认 TLS 寻址
        2. 7.5.3.2 TLS 块创建
    6. 7.6 线程局部符号解析和弱引用
      1. 7.6.1 通用和局部动态 TLS 弱引用寻址
      2. 7.6.2 初始和局部可执行文件 TLS 弱引用寻址
      3. 7.6.3 静态可执行文件和裸机动态 TLS 模型弱引用
  9. 辅助函数 API
    1. 8.1 浮点行为
    2. 8.2 C 辅助函数 API
    3. 8.3 辅助函数的特殊寄存器约定
    4. 8.4 复数类型的辅助函数
    5. 8.5 C99 的浮点辅助函数
  10. 标准 C 库 API
    1. 9.1  保留符号
    2. 9.2  <assert.h> 实现
    3. 9.3  <complex.h> 实现
    4. 9.4  <ctype.h> 实现
    5. 9.5  <errno.h> 实现
    6. 9.6  <float.h> 实现
    7. 9.7  <inttypes.h> 实现
    8. 9.8  <iso646.h> 实现
    9. 9.9  <limits.h> 实现
    10. 9.10 <locale.h> 实现
    11. 9.11 <math.h> 实现
    12. 9.12 <setjmp.h> 实现
    13. 9.13 <signal.h> 实现
    14. 9.14 <stdarg.h> 实现
    15. 9.15 <stdbool.h> 实现
    16. 9.16 <stddef.h> 实现
    17. 9.17 <stdint.h> 实现
    18. 9.18 <stdio.h> 实现
    19. 9.19 <stdlib.h> 实现
    20. 9.20 <string.h> 实现
    21. 9.21 <tgmath.h> 实现
    22. 9.22 <time.h> 实现
    23. 9.23 <wchar.h> 实现
    24. 9.24 <wctype.h> 实现
  11. 10C++ ABI
    1. 10.1  限制 (GC++ABI 1.2)
    2. 10.2  导出模板 (GC++ABI 1.4.2)
    3. 10.3  数据布局(GC++ABI 第 2 章)
    4. 10.4  初始化保护变量 (GC++ABI 2.8)
    5. 10.5  构造函数返回值 (GC++ABI 3.1.5)
    6. 10.6  一次性构建 API (GC++ABI 3.3.2)
    7. 10.7  控制对象构造顺序 (GC++ ABI 3.3.4)
    8. 10.8  还原器 API (GC++ABI 3.4)
    9. 10.9  静态数据 (GC++ ABI 5.2.2)
    10. 10.10 虚拟表和键函数 (GC++ABI 5.2.3)
    11. 10.11 回溯表位置 (GC++ABI 5.3)
  12. 11异常处理
    1. 11.1  概述
    2. 11.2  PREL31 编码
    3. 11.3  异常索引表 (EXIDX)
      1. 11.3.1 指向行外 EXTAB 条目的指针
      2. 11.3.2 EXIDX_CANTUNWIND
      3. 11.3.3 内联 EXTAB 条目
    4. 11.4  异常处理指令表 (EXTAB)
      1. 11.4.1 EXTAB 通用模型
      2. 11.4.2 EXTAB 紧凑模型
      3. 11.4.3 个性化例程
    5. 11.5  回溯指令
      1. 11.5.1 通用序列
      2. 11.5.2 字节编码展开指令
      3. 11.5.3 24 位展开编码
    6. 11.6  描述符
      1. 11.6.1 类型标识符编码
      2. 11.6.2 作用域
      3. 11.6.3 Cleanup 描述符
      4. 11.6.4 catch 描述符
      5. 11.6.5 函数异常规范 (FESPEC) 描述符
    7. 11.7  特殊段
    8. 11.8  与非 C++ 代码交互
      1. 11.8.1 EXIDX 条目自动生成
      2. 11.8.2 手工编码的汇编函数
    9. 11.9  与系统功能交互
      1. 11.9.1 共享库
      2. 11.9.2 覆盖块
      3. 11.9.3 中断
    10. 11.10 TI 工具链中的汇编语言运算符
  13. 12DWARF
    1. 12.1 DWARF 寄存器名称
    2. 12.2 调用帧信息
    3. 12.3 供应商名称
    4. 12.4 供应商扩展
  14. 13ELF 目标文件(处理器补充)
    1. 13.1 注册供应商名称
    2. 13.2 ELF 标头
    3. 13.3
      1. 13.3.1 段索引
      2. 13.3.2 段类型
      3. 13.3.3 扩展段标头属性
      4. 13.3.4 子段
      5. 13.3.5 特殊段
      6. 13.3.6 段对齐
    4. 13.4 符号表
      1. 13.4.1 符号类型
      2. 13.4.2 通用块符号
      3. 13.4.3 符号名称
      4. 13.4.4 保留符号名称
      5. 13.4.5 映射符号
    5. 13.5 重定位
      1. 13.5.1 重定位类型
      2. 13.5.2 重定位操作
      3. 13.5.3 未解析的弱引用的重定位
  15. 14ELF 程序加载和动态链接(处理器补充)
    1. 14.1 程序标头
      1. 14.1.1 基址
      2. 14.1.2 段内容
      3. 14.1.3 绑定段和只读段
      4. 14.1.4 线程局部存储
    2. 14.2 程序加载
    3. 14.3 动态链接
      1. 14.3.1 程序解释器
      2. 14.3.2 动态段
      3. 14.3.3 共享对象依赖关系
      4. 14.3.4 全局偏移量表
      5. 14.3.5 过程链接表
      6. 14.3.6 抢占式
      7. 14.3.7 初始化和终止
    4. 14.4 裸机动态链接模型
      1. 14.4.1 文件类型
      2. 14.4.2 ELF 标识
      3. 14.4.3 可见性和绑定
      4. 14.4.4 数据寻址
      5. 14.4.5 代码寻址
      6. 14.4.6 动态信息
  16. 15Linux ABI
    1. 15.1  文件类型
    2. 15.2  ELF 标识
    3. 15.3  程序标头和段
    4. 15.4  数据寻址
      1. 15.4.1 数据区段基表 (DSBT)
      2. 15.4.2 全局偏移量表 (GOT)
    5. 15.5  代码寻址
    6. 15.6  延迟绑定
    7. 15.7  可见性
    8. 15.8  抢占式
    9. 15.9  “作为自有导入”占先
    10. 15.10 程序加载
    11. 15.11 动态信息
    12. 15.12 初始化和终止函数
    13. 15.13 Linux 模型摘要
  17. 16符号版本控制
    1. 16.1 ELF 符号版本控制概述
    2. 16.2 版本段标识
  18. 17构建属性
    1. 17.1 C6000 ABI 构建属性子段
    2. 17.2 C6000 构建属性标签
  19. 18复制表和变量初始化
    1. 18.1 复制表格式
    2. 18.2 压缩的数据格式
      1. 18.2.1 RLE
      2. 18.2.2 LZSS 格式
    3. 18.3 变量初始化
  20. 19扩展程序标头属性
    1. 19.1 编码
    2. 19.2 属性标签定义
    3. 19.3 扩展程序标头属性段格式
  21. 20修订历史记录

重定位类型

重定位类型在两个表中进行了说明。表 13-5 提供了重定位类型的数值,并汇总了重定位值的计算。此表之后描述了重定位类型及其使用示例。表 13-6 描述了每种类型的确切计算,包括重定位字段的提取和插入、溢出检查以及任何缩放或其他调整。

表 13-5 中使用了以下表示法。

S与重定位关联的符号的值,由重定位条目的 r_info 字段中包含的符号表索引指定。
A用于计算可重定位字段的值的加数。对于 ELF32_rel 重定位,A 根据表 13-6 编码到可重定位字段中。对于 Elf32_Rela 重定位,A 由重定位条目的 r_addend 字段提供。
PC包含字段的容器的地址。
FP(x)包含地址 x 处指令的取指数据包的地址;即:FP(x) := x & 0xFFFFFFE0。
P被重定位的指令的取指数据包地址;即:P := FP(PC)。
B当前加载模块的数据段的基址。此位置由符号 _ _C6000_DSBT_BASE 标记,在执行程序时是 DP 寄存器的值。
GOT(S)重定位相关符号 (S) 的全局偏移表 (GOT) 条目的地址。
TBR(x)x 相对于线程局部存储 (TLS) 块基址的偏移量。有关线程局部存储的详细信息,请参阅Chapter7
TPR(x)x 相对于线程指针 (TP) 的偏移量。
TLS(x)x 的 TLS 描述符,其中包含 x 的模块 ID 和 TBR 偏移量。
TLSMOD(x)定义 x 的模块的 TLS 模块标识符。
表 13-5 C6000 重定位类型
名称运算约束条件
R_C6000_NONE0
R_C6000_ABS321S + A
R_C6000_ABS162S + A
R_C6000_ABS83S + A
R_C6000_PCR_S214S + A – P
R_C6000_PCR_S125S + A – P
R_C6000_PCR_S106S + A – P
R_C6000_PCR_S77S + A – P
R_C6000_ABS_S168S + A
R_C6000_ABS_L169S + A
R_C6000_ABS_H1610S + A仅限 Rela
R_C6000_SBR_U15_B11S + A – B
R_C6000_SBR_U15_H12S + A – B
R_C6000_SBR_U15_W13S + A – B
R_C6000_SBR_S1614S + A – B
R_C6000_SBR_L16_B15S + A – B
R_C6000_SBR_L16_H16S + A – B
R_C6000_SBR_L16_W17S + A – B
R_C6000_SBR_H16_B18S + A – B仅限 Rela
R_C6000_SBR_H16_H19S + A – B仅限 Rela
R_C6000_SBR_H16_W20S + A – B仅限 Rela
R_C6000_SBR_GOT_U15_W21GOT(S) + A – B
R_C6000_SBR_GOT_L16_W22GOT(S) + A – B
R_C6000_SBR_GOT_H16_W23GOT(S) + A – B仅限 Rela
R_C6000_DSBT_INDEX24此静态链路单元的 DSBT 索引
R_C6000_PREL3125S + A – PC
R_C6000_COPY26被抢占符号的加载时副本仅限 ET_EXEC
R_C6000_JUMP_SLOT27S + AET_EXEC/ET_DYN
R_C6000_EHTYPE28S + A - B
R_C6000_PCR_H1629S - FP(P - A)仅限 Rela
R_C6000_PCR_L1630S - FP(P - A)仅限 Rela
保留31
保留32
R_C6000_TBR_U15_B33TBR(S)仅限静态
R_C6000_TBR_U15_H34TBR(S)仅限静态
R_C6000_TBR_U15_W35TBR(S)仅限静态
R_C6000_TBR_U15_D36TBR(S)仅限静态
R_C6000_TPR_S1637TBR(S)
R_C6000_TPR_U15_B38TPR(S)
R_C6000_TPR_U15_H39TPR(S)
R_C6000_TPR_U15_W40TPR(S)
R_C6000_TPR_U15_D41TPR(S)
R_C6000_TPR_U32_B42TPR(S)仅限动态
R_C6000_TPR_U32_H43TPR(S)仅限动态
R_C6000_TPR_U32_W44TPR(S)仅限动态
R_C6000_TPR_U32_D45TPR(S)仅限动态
R_C6000_SBR_GOT_U15_W_TLSMOD46GOT(TLSMOD(S)) + A – B仅限静态
R_C6000_SBR_GOT_U15_W_TBR47GOT(TBR(S)) + A - B仅限静态
R_C6000_SBR_GOT_U15_W_TPR_B48GOT(TPR(S))+A-B仅限静态
R_C6000_SBR_GOT_U15_W_TPR_H49GOT(TPR(S))+A-B仅限静态
R_C6000_SBR_GOT_U15_W_TPR_W50GOT(TPR(S))+A-B仅限静态
R_C6000_SBR_GOT_U15_W_TPR_D51GOT(TPR(S))+A-B仅限静态
R_C6000_SBR_GOT_L16_W_TLSMOD52GOT(TLSMOD(S)) + A - B仅限静态
R_C6000_SBR_GOT_L16_W_TBR53GOT(TBR(S)) + A - B仅限静态
R_C6000_SBR_GOT_L16_W_TPR_B54GOT(TPR(S))+A-B仅限静态
R_C6000_SBR_GOT_L16_W_TPR_H55GOT(TPR(S))+A-B仅限静态
R_C6000_SBR_GOT_L16_W_TPR_W56GOT(TPR(S))+A-B仅限静态
R_C6000_SBR_GOT_L16_W_TPR_D57GOT(TPR(S))+A-B仅限静态
R_C6000_SBR_GOT_H16_W_TLSMOD58GOT(TLSMOD(S)) + A - B仅限静态
R_C6000_SBR_GOT_H16_W_TBR59GOT(TBR(S)) + A - B仅限静态
R_C6000_SBR_GOT_H16_W_TPR_B60GOT(TPR(S))+A-B仅限静态
R_C6000_SBR_GOT_H16_W_TPR_H61GOT(TPR(S))+A-B仅限静态
R_C6000_SBR_GOT_H16_W_TPR_W62GOT(TPR(S))+A-B仅限静态
R_C6000_SBR_GOT_H16_W_TPR_D63GOT(TPR(S))+A-B仅限静态
R_C6000_TLSMOD64TLSMOD(S)仅限动态
R_C6000_TBR_U3265TBR(S)仅限动态
R_C6000_ALIGN253仅限 ET_REL
R_C6000_FPHEAD254仅限 ET_REL
R_C6000_NOCMP255仅限 ET_REL

R_none 重定位不执行任何运算。它用于创建一个段对另一段的引用,以确保如果引用段链接进来,被引用的段也会链接进来。

R_C6000_ABS8/16/32 重定位直接将符号的重定位地址编码为 8 位、16 位或 32 位字段,这些字段通常用于初始化数据,而非指令。字段的符号未指定;也就是说,这些字段既可用于有符号值,也可用于无符号值。

        .field X,32         ; R_C6000_ABS32
        .field X,16         ; R_C6000_ABS16
        .field X,8          ; R_C6000_ABS8

PCR 重定位对有符号的 PC 相对分支位移进行编码。这些位移缩放为 32 位(字)单元。位移是相对于源指令的取指数据包计算的。

        B      func         ; R_C6000_PCR_S21
        CALLP  func,B3      ; R_C6000_PCR_S21
        BNOP   func         ; R_C6000_PCR_S12
        BPOS   func,A10     ; R_C6000_PCR_S10
        BDEC   func,A1      ; R_C6000_PCR_S10
        ADDKPC func,B3,4    ; R_C6000_PCR_S7

名称中包含 L16 的重定位对 32 位地址或偏移量的低 16 位进行编码。包含 H16 的重定位对高 16 位进行编码,并且始终为 Rela。包含 S16 的重定位对有符号的 16 位值(通常不是地址的一部分)进行编码。包含 U15 的重定位对无符号的 15 位 DP 相对位移进行编码。

        MVHL   sym,A0       ; R_C6000_ABS_L16
        MVKH   sym,A0       ; R_C6000_ABS_H16
        MVK    const16,A0   ; R_C6000_ABS_S16  sign extend const16 into A0
        MVKLH  const16,A0   ; R_C6000_ABS_L16  move const16 into A0[16:31]

PCR_L16 和 PCR_H16 重定位分别对目标地址与参考 PC(“基础 PC”)的取指数据包地址之间的 PC 相对偏移量的低位和高位进行编码。从当前指令的取指数据包到基础 PC 的偏移量编码到加数字段中;即 A := (P-base)。重定位随后计算 S-FP(P-A),得出 S 与 FP(base) 之间的偏移量。这些重定位用于使用 PC 相对寻址来寻址不同段中的对象,如节 5.1所述。

        MVK    $PCR_OFFSET(sym,base),A0    ; R_C6000_PCR_L16
        MVKH   $PCR_OFFSET(sym,base),A0    ; R_C6000_PCR_H16

SBR_U15 重定位对 15 位无符号 DP 相对偏移量进行编码,以实现 near DP 数据寻址。重定位根据访问宽度进行缩放:32 位字 (_W)、16 位半字 (_H) 或字节 (_B)。

        LDB    *+DP(sym),A1 ; R_C6000_SBR_U15_B
        ADDAB  DP,sym,A2    ; R_C6000_SBR_U15_B
        LDH    *+DP(sym),A1 ; R_C6000_SBR_U15_H
        ADDAH  DP,sym,A2    ; R_C6000_SBR_U15_H
        LDW    *+DP(sym),A1 ; R_C6000_SBR_U15_W
        ADDAW  DP,sym,A2    ; R_C6000_SBR_U15_W

其他 SBR 重定位用于对 32 位 DP 相对偏移量的高位和低位部分进行编码,以实现 far DP 相对寻址。在以下示例中:

  • $bss 表示数据段基址,对应于 _ _C6000_DSBT_BASE(DP 中的值)
  • $DPR_byte(sym) 表示 DP 相对偏移量(以字节为单位)
  • $DPR_hword(sym) 表示 DP 相对偏移量除以 2
  • $DPR_word(sym) 表示 DP 相对偏移量除以 4
        MVK    (sym - $bss),A0     ; R_C6000_SBR_S16
        MVKL   $DPR_byte(sym),A0   ; R_C6000_SBR_L16_B
        MVKH   $DPR_byte(sym),A0   ; R_C6000_SBR_H16_B
        MVKL   $DPR_hword(sym),A0  ; R_C6000_SBR_L16_H
        MVKH   $DPR_hword(sym),A0  ; R_C6000_SBR_H16_H
        MVKL   $DPR_word(sym),A0   ; R_C6000_SBR_L16_W
        MVKH   $DPR_word(sym),A0   ; R_C6000_SBR_H16_W

SBR_GOT 重定位对应于与 SBR 重定位相同的指令和编码,但引用的是被引用符号(而非符号本身)的 DP 相对 GOT 地址。通常,GOT 通过 near DP 相对寻址访问,因此使用 R_C6000_DBR_GOT_U15_W。当 GOT 为 far 时,偏移量通过包含其他两个重定位的 MVKL/MVKH 生成(请参阅节 6.6)。在以下示例中,

  • GOT(sym) 是 sym 的 GOT 条目的 DP 相对偏移量(以字节为单位)
  • $DPR_GOT(sym) 是 sym 的 GOT 条目的 DP 相对偏移量(以字节为单位)
        LDW    *+DP[GOT(sym)],A0   ; R_C6000_SBR_GOT_U15_W
        MVKL   $DPR_GOT(sym), A0   ; R_C6000_SBR_GOT_L16_W
        MVKH   $DPR_GOT(sym), A0   ; R_C6000_SBR_GOT_H16_W

R_C6000_DSBT_INDEX 将索引编码到当前加载模块的数据段基表中。它仅存在于使用 DSBT 模型实现位置无关性的文件中。请参阅节 6.7

        LDW    *+DP($DSBT_INDEX(__C6000_DSBT_BASE)),DP  ; R_C6000_DSBT_INDEX

R_C6000_COPY 用于标记可执行文件中定义的重复符号,该可执行文件抢占库定义,符合节 15.9中所述的“作为自有导入”约定。加载此可执行文件时,动态加载器必须将库定义中的任何初始值复制到可执行文件的初始值。此重定位类型仅存在于可执行文件 (ET_EXEC) 的动态重定位表中。

R_6000_JUMP_SLOT 用于标记引用导入函数且仅从 PLT 条目引用的 GOT 条目,因此应遵循节 15.6所述的延迟绑定。R_C6000_JUMP_SLOT 重定位仅发生在可执行文件和共享对象中,并且仅在动态重定位表的 DT_JMPREL 段中。

R_C6000_PREL31 用于对异常处理表中的代码地址进行编码。R_C6000_EHTYPE 用于对异常处理表中的 typeinfo 地址进行编码。请参阅节 11.2

值为 33 到 65 的重定位用于线程局部存储 (TLS)。这些重定位包括 R_C6000_TBR_*、R_C6000_TPR_*、R_C6000_SBR_GOT_*_W_T*、R_C6000_TLSMOD 和 R_C6000_TBR_U32 重定位。有关线程局部存储的详细信息,请参阅Chapter7节 7.5提供了使用这些 TLS 重定位的示例。

R_C6000_ALIGN 和 R_C6000_FPHEAD 用作 C64+ 压缩器的标记。它们在 ABI 下无效。将可重定位文件 (ET_REL) 组合到其他可重定位文件的下游工具(例如部分链接)应保留这些文件,或使用 R_C6000_NOCMP 标记它们所在的段。

R_C6000_NOCMP 将段标记为不可压缩。