SPRAB89A September   2011  – March 2014

 

  1. Introduction
    1. 1.1  ABIs for the C6000
    2. 1.2  Scope
    3. 1.3  ABI Variants
    4. 1.4  Toolchains and Interoperability
    5. 1.5  Libraries
    6. 1.6  Types of Object Files
    7. 1.7  Segments
    8. 1.8  C6000 Architecture Overview
    9. 1.9  Reference Documents
    10. 1.10 Code Fragment Notation
  2. Data Representation
    1. 2.1 Basic Types
    2. 2.2 Data in Registers
    3. 2.3 Data in Memory
    4. 2.4 Complex Types
    5. 2.5 Structures and Unions
    6. 2.6 Arrays
    7. 2.7 Bit Fields
      1. 2.7.1 Volatile Bit Fields
    8. 2.8 Enumeration Types
  3. Calling Conventions
    1. 3.1 Call and Return
      1. 3.1.1 Return Address Computation
      2. 3.1.2 Call Instructions
      3. 3.1.3 Return Instruction
      4. 3.1.4 Pipeline Conventions
      5. 3.1.5 Weak Functions
    2. 3.2 Register Conventions
    3. 3.3 Argument Passing
    4. 3.4 Return Values
    5. 3.5 Structures and Unions Passed and Returned by Reference
    6. 3.6 Conventions for Compiler Helper Functions
    7. 3.7 Scratch Registers for Inter-Section Calls
    8. 3.8 Setting Up DP
  4. Data Allocation and Addressing
    1. 4.1 Data Sections and Segments
    2. 4.2 Allocation and Addressing of Static Data
      1. 4.2.1 Addressing Methods for Static Data
        1. 4.2.1.1 Near DP-Relative Addressing
        2. 4.2.1.2 Far DP-Relative Addressing
        3. 4.2.1.3 Absolute Addressing
        4. 4.2.1.4 GOT-Indirect Addressing
        5. 4.2.1.5 PC-Relative Addressing
      2. 4.2.2 Placement Conventions for Static Data
        1. 4.2.2.1 Abstract Conventions for Placement
        2. 4.2.2.2 Abstract Conventions for Addressing
        3. 4.2.2.3 Linker Requirements
      3. 4.2.3 Initialization of Static Data
    3. 4.3 Automatic Variables
    4. 4.4 Frame Layout
      1. 4.4.1 Stack Alignment
      2. 4.4.2 Register Save Order
        1. 4.4.2.1 Big-Endian Pair Swapping
        2. 4.4.2.2 Examples
      3. 4.4.3 DATA_MEM_BANK
      4. 4.4.4 C64x+ Specific Stack Layouts
        1. 4.4.4.1 _ _C6000_push_rts Layout
        2. 4.4.4.2 Compact Frame Layout
    5. 4.5 Heap-Allocated Objects
  5. Code Allocation and Addressing
    1. 5.1 Computing the Address of a Code Label
      1. 5.1.1 Absolute Addressing for Code
      2. 5.1.2 PC-Relative Addressing
      3. 5.1.3 PC-Relative Addressing Within the Same Section
      4. 5.1.4 Short-Offset PC-Relative Addressing (C64x)
      5. 5.1.5 GOT-Based Addressing for Code
    2. 5.2 Branching
    3. 5.3 Calls
      1. 5.3.1 Direct PC-Relative Call
      2. 5.3.2 Far Call Trampoline
      3. 5.3.3 Indirect Calls
    4. 5.4 Addressing Compact Instructions
  6. Addressing Model for Dynamic Linking
    1. 6.1 Terms and Concepts
    2. 6.2 Overview of Dynamic Linking Mechanisms
    3. 6.3 DSOs and DLLs
    4. 6.4 Preemption
    5. 6.5 PLT Entries
      1. 6.5.1 Direct Calls to Imported Functions
      2. 6.5.2 PLT Entry Via Absolute Address
      3. 6.5.3 PLT Entry Via GOT
    6. 6.6 The Global Offset Table
      1. 6.6.1 GOT-Based Reference Using Near DP-Relative Addressing
      2. 6.6.2 GOT-Based Reference Using Far DP-Relative Addressing
    7. 6.7 The DSBT Model
      1. 6.7.1 Entry/Exit Sequence for Exported Functions
      2. 6.7.2 Avoiding DP Loads for Internal Functions
      3. 6.7.3 Function Pointers
      4. 6.7.4 Interrupts
      5. 6.7.5 Compatibility With Non-DSBT Code
    8. 6.8 Performance Implications of Dynamic Linking
  7. Thread-Local Storage Allocation and Addressing
    1. 7.1 About Multi-Threading and Thread-Local Storage
    2. 7.2 Terms and Concepts
    3. 7.3 User Interface
    4. 7.4 ELF Object File Representation
    5. 7.5 TLS Access Models
      1. 7.5.1 C6x Linux TLS Models
        1. 7.5.1.1 General Dynamic TLS Access Model
        2. 7.5.1.2 Local Dynamic TLS Access Model
        3. 7.5.1.3 Initial Exec TLS Access Model
          1. 7.5.1.3.1 Thread Pointer
          2. 7.5.1.3.2 Initial Exec TLS Addressing
        4. 7.5.1.4 Local Exec TLS Access Model
      2. 7.5.2 Static Executable TLS Model
        1. 7.5.2.1 Static Executable Addressing
        2. 7.5.2.2 Static Executable TLS Runtime Architecture
        3. 7.5.2.3 Static Executable TLS Allocation
          1. 7.5.2.3.1 TLS Initialization Image Allocation
          2. 7.5.2.3.2 Main Thread’s TLS Allocation
          3. 7.5.2.3.3 Thread Library’s TLS Region Allocation
        4. 7.5.2.4 Static Executable TLS Initialization
          1. 7.5.2.4.1 Main Thread’s TLS Initialization
          2. 7.5.2.4.2 TLS Initialization by Thread Library
        5. 7.5.2.5 Thread Pointer
      3. 7.5.3 Bare-Metal Dynamic Linking TLS Model
        1. 7.5.3.1 Default TLS Addressing for Bare-Metal Dynamic Linking
        2. 7.5.3.2 TLS Block Creation
    6. 7.6 Thread-Local Symbol Resolution and Weak References
      1. 7.6.1 General and Local Dynamic TLS Weak Reference Addressing
      2. 7.6.2 Initial and Local Executable TLS Weak Reference Addressing
      3. 7.6.3 Static Exec and Bare Metal Dynamic TLS Model Weak References
  8. Helper Function API
    1. 8.1 Floating-Point Behavior
    2. 8.2 C Helper Function API
    3. 8.3 Special Register Conventions for Helper Functions
    4. 8.4 Helper Functions for Complex Types
    5. 8.5 Floating-Point Helper Functions for C99
  9. Standard C Library API
    1. 9.1  Reserved Symbols
    2. 9.2  <assert.h> Implementation
    3. 9.3  <complex.h> Implementation
    4. 9.4  <ctype.h> Implementation
    5. 9.5  <errno.h> Implementation
    6. 9.6  <float.h> Implementation
    7. 9.7  <inttypes.h> Implementation
    8. 9.8  <iso646.h> Implementation
    9. 9.9  <limits.h> Implementation
    10. 9.10 <locale.h> Implementation
    11. 9.11 <math.h> Implementation
    12. 9.12 <setjmp.h> Implementation
    13. 9.13 <signal.h> Implementation
    14. 9.14 <stdarg.h> Implementation
    15. 9.15 <stdbool.h> Implementation
    16. 9.16 <stddef.h> Implementation
    17. 9.17 <stdint.h> Implementation
    18. 9.18 <stdio.h> Implementation
    19. 9.19 <stdlib.h> Implementation
    20. 9.20 <string.h> Implementation
    21. 9.21 <tgmath.h> Implementation
    22. 9.22 <time.h> Implementation
    23. 9.23 <wchar.h> Implementation
    24. 9.24 <wctype.h> Implementation
  10. 10C++ ABI
    1. 10.1  Limits (GC++ABI 1.2)
    2. 10.2  Export Template (GC++ABI 1.4.2)
    3. 10.3  Data Layout (GC++ABI Chapter 2)
    4. 10.4  Initialization Guard Variables (GC++ABI 2.8)
    5. 10.5  Constructor Return Value (GC++ABI 3.1.5)
    6. 10.6  One-Time Construction API (GC++ABI 3.3.2)
    7. 10.7  Controlling Object Construction Order (GC++ ABI 3.3.4)
    8. 10.8  Demangler API (GC++ABI 3.4)
    9. 10.9  Static Data (GC++ ABI 5.2.2)
    10. 10.10 Virtual Tables and the Key function (GC++ABI 5.2.3)
    11. 10.11 Unwind Table Location (GC++ABI 5.3)
  11. 11Exception Handling
    1. 11.1  Overview
    2. 11.2  PREL31 Encoding
    3. 11.3  The Exception Index Table (EXIDX)
      1. 11.3.1 Pointer to Out-of-Line EXTAB Entry
      2. 11.3.2 EXIDX_CANTUNWIND
      3. 11.3.3 Inlined EXTAB Entry
    4. 11.4  The Exception Handling Instruction Table (EXTAB)
      1. 11.4.1 EXTAB Generic Model
      2. 11.4.2 EXTAB Compact Model
      3. 11.4.3 Personality Routines
    5. 11.5  Unwinding Instructions
      1. 11.5.1 Common Sequence
      2. 11.5.2 Byte-Encoded Unwinding Instructions
      3. 11.5.3 24-Bit Unwinding Encoding
    6. 11.6  Descriptors
      1. 11.6.1 Encoding of Type Identifiers
      2. 11.6.2 Scope
      3. 11.6.3 Cleanup Descriptor
      4. 11.6.4 Catch Descriptor
      5. 11.6.5 Function Exception Specification (FESPEC) Descriptor
    7. 11.7  Special Sections
    8. 11.8  Interaction With Non-C++ Code
      1. 11.8.1 Automatic EXIDX Entry Generation
      2. 11.8.2 Hand-Coded Assembly Functions
    9. 11.9  Interaction With System Features
      1. 11.9.1 Shared Libraries
      2. 11.9.2 Overlays
      3. 11.9.3 Interrupts
    10. 11.10 Assembly Language Operators in the TI Toolchain
  12. 12DWARF
    1. 12.1 DWARF Register Names
    2. 12.2 Call Frame Information
    3. 12.3 Vendor Names
    4. 12.4 Vendor Extensions
  13. 13ELF Object Files (Processor Supplement)
    1. 13.1 Registered Vendor Names
    2. 13.2 ELF Header
    3. 13.3 Sections
      1. 13.3.1 Section Indexes
      2. 13.3.2 Section Types
      3. 13.3.3 Extended Section Header Attributes
      4. 13.3.4 Subsections
      5. 13.3.5 Special Sections
      6. 13.3.6 Section Alignment
    4. 13.4 Symbol Table
      1. 13.4.1 Symbol Types
      2. 13.4.2 Common Block Symbols
      3. 13.4.3 Symbol Names
      4. 13.4.4 Reserved Symbol Names
      5. 13.4.5 Mapping Symbols
    5. 13.5 Relocation
      1. 13.5.1 Relocation Types
      2. 13.5.2 Relocation Operations
      3. 13.5.3 Relocation of Unresolved Weak References
  14. 14ELF Program Loading and Dynamic Linking (Processor Supplement)
    1. 14.1 Program Header
      1. 14.1.1 Base Address
      2. 14.1.2 Segment Contents
      3. 14.1.3 Bound and Read-Only Segments
      4. 14.1.4 Thread-Local Storage
    2. 14.2 Program Loading
    3. 14.3 Dynamic Linking
      1. 14.3.1 Program Interpreter
      2. 14.3.2 Dynamic Section
      3. 14.3.3 Shared Object Dependencies
      4. 14.3.4 Global Offset Table
      5. 14.3.5 Procedure Linkage Table
      6. 14.3.6 Preemption
      7. 14.3.7 Initialization and Termination
    4. 14.4 Bare-Metal Dynamic Linking Model
      1. 14.4.1 File Types
      2. 14.4.2 ELF Identification
      3. 14.4.3 Visibility and Binding
      4. 14.4.4 Data Addressing
      5. 14.4.5 Code Addressing
      6. 14.4.6 Dynamic Information
  15. 15Linux ABI
    1. 15.1  File Types
    2. 15.2  ELF Identification
    3. 15.3  Program Headers and Segments
    4. 15.4  Data Addressing
      1. 15.4.1 Data Segment Base Table (DSBT)
      2. 15.4.2 Global Offset Table (GOT)
    5. 15.5  Code Addressing
    6. 15.6  Lazy Binding
    7. 15.7  Visibility
    8. 15.8  Preemption
    9. 15.9  Import-as-Own Preemption
    10. 15.10 Program Loading
    11. 15.11 Dynamic Information
    12. 15.12 Initialization and Termination Functions
    13. 15.13 Summary of the Linux Model
  16. 16Symbol Versioning
    1. 16.1 ELF Symbol Versioning Overview
    2. 16.2 Version Section Identification
  17. 17Build Attributes
    1. 17.1 C6000 ABI Build Attribute Subsection
    2. 17.2 C6000 Build Attribute Tags
  18. 18Copy Tables and Variable Initialization
    1. 18.1 Copy Table Format
    2. 18.2 Compressed Data Formats
      1. 18.2.1 RLE
      2. 18.2.2 LZSS Format
    3. 18.3 Variable Initialization
  19. 19Extended Program Header Attributes
    1. 19.1 Encoding
    2. 19.2 Attribute Tag Definitions
    3. 19.3 Extended Program Header Attributes Section Format
  20. 20Revision History

Relocation Types

Relocation types are described in two tables. Table 13-5 gives numeric values for the relocation types and summarizes the computation of the relocated value. Following that table is a description of the relocation types and examples of their use. Table 13-6 describes, for each type, the exact computation, including extraction and insertion of the relocation field, overflow checking, and any scaling or other adjustments.

The following notations are used in Table 13-5.

SThe value of the symbol associated with the relocation, specified by the symbol table index contained in the r_info field in the relocation entry.
AThe addend used to compute the value of the relocatable field. For Elf32_rel relocations, A is encoded into the relocatable field according to Table 13-6. For Elf32_Rela relocations, A is given by the r_addend field of the relocation entry.
PCThe address of the container containing the field.
FP(x)The address of the fetch packet containing the instruction at address x; that is: FP(x) := x & 0xFFFFFFE0.
PThe fetch packet address of the instruction being relocated; that is: P := FP(PC).
BThe base address of the data segment for the current load module. This location is marked by the symbol _ _C6000_DSBT_BASE, and is the value of the DP register when the program is executing.
GOT(S)The address of the Global Offset Table (GOT) entry of the symbol (S) associated with the relocation.
TBR(x)The offset of x from the Thread-Local Storage (TLS) Block Base. See Chapter 7 for details about thread-local storage.
TPR(x)The offset of x from the thread-pointer (TP).
TLS(x)The TLS Descriptor for x, which contains the module-id and TBR offset of x.
TLSMOD(x)The TLS module identifier of the module that defines x.
Table 13-5 C6000 Relocation Types
NameValueOperationConstraints
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 + ARela only
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 – BRela only
R_C6000_SBR_H16_H19S + A – BRela only
R_C6000_SBR_H16_W20S + A – BRela only
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 – BRela only
R_C6000_DSBT_INDEX24DSBT Index of this static link unit
R_C6000_PREL3125S + A – PC
R_C6000_COPY26Load-time copy of preempted symbolET_EXEC only
R_C6000_JUMP_SLOT27S + AET_EXEC / ET_DYN
R_C6000_EHTYPE28S + A - B
R_C6000_PCR_H1629S - FP(P - A)Rela only
R_C6000_PCR_L1630S - FP(P - A)Rela only
Reserved31
Reserved32
R_C6000_TBR_U15_B33TBR(S)Static only
R_C6000_TBR_U15_H34TBR(S)Static only
R_C6000_TBR_U15_W35TBR(S)Static only
R_C6000_TBR_U15_D36TBR(S)Static only
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)Dynamic only
R_C6000_TPR_U32_H43TPR(S)Dynamic only
R_C6000_TPR_U32_W44TPR(S)Dynamic only
R_C6000_TPR_U32_D45TPR(S)Dynamic only
R_C6000_SBR_GOT_U15_W_TLSMOD46GOT(TLSMOD(S)) + A – BStatic only
R_C6000_SBR_GOT_U15_W_TBR47GOT(TBR(S)) + A - BStatic only
R_C6000_SBR_GOT_U15_W_TPR_B48GOT(TPR(S))+A-BStatic only
R_C6000_SBR_GOT_U15_W_TPR_H49GOT(TPR(S))+A-BStatic only
R_C6000_SBR_GOT_U15_W_TPR_W50GOT(TPR(S))+A-BStatic only
R_C6000_SBR_GOT_U15_W_TPR_D51GOT(TPR(S))+A-BStatic only
R_C6000_SBR_GOT_L16_W_TLSMOD52GOT(TLSMOD(S)) + A - BStatic only
R_C6000_SBR_GOT_L16_W_TBR53GOT(TBR(S)) + A - BStatic only
R_C6000_SBR_GOT_L16_W_TPR_B54GOT(TPR(S))+A-BStatic only
R_C6000_SBR_GOT_L16_W_TPR_H55GOT(TPR(S))+A-BStatic only
R_C6000_SBR_GOT_L16_W_TPR_W56GOT(TPR(S))+A-BStatic only
R_C6000_SBR_GOT_L16_W_TPR_D57GOT(TPR(S))+A-BStatic only
R_C6000_SBR_GOT_H16_W_TLSMOD58GOT(TLSMOD(S)) + A - BStatic only
R_C6000_SBR_GOT_H16_W_TBR59GOT(TBR(S)) + A - BStatic only
R_C6000_SBR_GOT_H16_W_TPR_B60GOT(TPR(S))+A-BStatic only
R_C6000_SBR_GOT_H16_W_TPR_H61GOT(TPR(S))+A-BStatic only
R_C6000_SBR_GOT_H16_W_TPR_W62GOT(TPR(S))+A-BStatic only
R_C6000_SBR_GOT_H16_W_TPR_D63GOT(TPR(S))+A-BStatic only
R_C6000_TLSMOD64TLSMOD(S)Dynamic only
R_C6000_TBR_U3265TBR(S)Dynamic only
R_C6000_ALIGN253NoneET_REL only
R_C6000_FPHEAD254NoneET_REL only
R_C6000_NOCMP255NoneET_REL only

The R_NONE relocation performs no operation. It is used to create a reference from one section to another, to ensure that if the referring section is linked in, so is the referee.

The R_C6000_ABS8/16/32 relocations directly encode the relocated address of a symbol into 8-, 16-, or 32-bit fields. They are commonly used for initialized data, not for instructions. The signedness of the field is unspecified; that is, they are used for both signed and unsigned values.

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

The PCR relocations encode signed PC-relative branch displacements. They are scaled to 32-bit (word) units. Displacements are computed relative to the fetch packet of the source instruction.

        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

Relocations with L16 in their names encode the lower 16 bits of a 32-bit address or offset. Those containing H16 encode the upper 16 bits, and are always Rela. Relocations with S16 encode a signed 16-bit value (generally not part of an address). Those with U15 encode an unsigned 15-bit DP-relative displacement.

        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]

The PCR_L16 and PCR_H16 relocations encode the lower and upper bits, respectively, of a PC-relative offset between a target address and the fetch packet address of a reference PC (the “base PC”). The offset from the fetch packet of the current instruction to the base PC is encoded in the addend field; that is A := (P-base). The relocation then computes S-FP(P-A), resulting in the offset between S and FP(base). These relocations are used to address objects in different sections using PC-relative addressing, as described in Section 5.2.

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

The SBR_U15 relocations encode 15-bit unsigned DP-relative offsets for near-DP data addressing. They are scaled according to the access width: 32-bit word (_W), 16-bit halfword (_H), or byte (_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

The other SBR relocations are used to encode the high and low parts of 32-bit DP-relative offsets, for far DP-relative addressing. In the examples that follow:

  • $bss represents the data segment base address, corresponding to _ _C6000_DSBT_BASE (the value in DP)
  • $DPR_byte(sym) represents the DP-relative offset in bytes
  • $DPR_hword(sym) represents the DP-relative offset divided by 2
  • $DPR_word(sym) represents the DP-relative offset divided by 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

The SBR_GOT relocations correspond to the same instructions and encodings as the SBR relocations, but refer to the DP-relative GOT address of the referenced symbol instead of the symbol itself. Typically the GOT is accessed with near DP-relative addressing, so R_C6000_DBR_GOT_U15_W is used. When the GOT is far the offset is generated with MVKL/MVKH with the other two relocations (see Section 6.7). In the examples that follow,

  • GOT(sym) is the DP-relative offset of the GOT entry for sym, in bytes
  • $DPR_GOT(sym) is the DP-relative offset of the GOT entry for sym, in words
        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

The R_C6000_DSBT_INDEX encodes the index into the Data Segment Base Table of the current load module. It is present only in files that use the DSBT model for position independence. See Section 6.8.

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

R_C6000_COPY is used to mark a duplicate symbol defined in an executable that preempts a library definition, under the import-as-own convention described in Section 15.10. When the executable is loaded, the dynamic loader must copy any initial value from the library's definition to that of the executable. This relocation type is present only in the dynamic relocation table of an executable file (ET_EXEC).

R_6000_JUMP_SLOT is used to mark GOT entries that refer to imported functions and are referred to only from PLT entries, and are therefore subject to lazy binding as described in Section 15.7. R_C6000_JUMP_SLOT relocations occur only in executables and shared objects, and only in the DT_JMPREL section of the dynamic relocation table.

R_C6000_PREL31 is used to encode code addresses in exception handling tables. R_C6000_EHTYPE is used to encode typeinfo addresses in exception handling tables. See Section 11.3.

Relocations with values from 33 to 65 are for use with Thread-Local Storage (TLS). These relocations include the R_C6000_TBR_*, R_C6000_TPR_*, R_C6000_SBR_GOT_*_W_T*, R_C6000_TLSMOD, and R_C6000_TBR_U32 relocations. See Chapter 7 for details about thread-local storage. Examples that use these TLS relocations are provided in Section 7.6.

R_C6000_ALIGN and R_C6000_FPHEAD are used as markers for the C64+ compressor. They have no effect under the ABI. A downstream tool that combines relocatable files (ET_REL) into other relocatable files, such as partial link, should either preserve them or mark the sections in which they occur with R_C6000_NOCMP.

R_C6000_NOCMP marks a section as being uncompressable.