Expand description
§Relocation computations
The following notation is used to describe relocation computations specific to x86_64 ELF.
- A: The addend used to compute the value of the relocatable field.
- B: The base address at which a shared object is loaded into memory during execution. Generally, a shared object file is built with a base virtual address of 0. However, the execution address of the shared object is different.
- G: The offset into the global offset table at which the address of the relocation entry’s symbol resides during execution.
- GOT: The address of the global offset table.
- L: The section offset or address of the procedure linkage table entry for a symbol.
- P: The section offset or address of the storage unit being relocated, computed using r_offset.
- S: The value of the symbol whose index resides in the relocation entry.
- Z: The size of the symbol whose index resides in the relocation entry.
Below are some common x86_64 relocation computations you might find useful:
Relocation | Value | Size | Formula |
---|---|---|---|
R_X86_64_NONE | 0 | NONE | NONE |
R_X86_64_64 | 1 | 64 | S + A |
R_X86_64_PC32 | 2 | 32 | S + A - P |
R_X86_64_GOT32 | 3 | 32 | G + A |
R_X86_64_PLT32 | 4 | 32 | L + A - P |
R_X86_64_COPY | 5 | NONE | NONE |
R_X86_64_GLOB_DAT | 6 | 64 | S |
R_X86_64_JUMP_SLOT | 7 | 64 | S |
R_X86_64_RELATIVE | 8 | 64 | B + A |
R_X86_64_GOTPCREL | 9 | 32 | G + GOT + A - P |
R_X86_64_32 | 10 | 32 | S + A |
R_X86_64_32S | 11 | 32 | S + A |
R_X86_64_16 | 12 | 16 | S + A |
R_X86_64_PC16 | 13 | 16 | S + A - P |
R_X86_64_8 | 14 | 8 | S + A |
R_X86_64_PC8 | 15 | 8 | S + A - P |
R_X86_64_DTPMOD64 | 16 | 64 | |
R_X86_64_DTPOFF64 | 17 | 64 | |
R_X86_64_TPOFF64 | 18 | 64 | |
R_X86_64_TLSGD | 19 | 32 | |
R_X86_64_TLSLD | 20 | 32 | |
R_X86_64_DTPOFF32 | 21 | 32 | |
R_X86_64_GOTTPOFF | 22 | 32 | |
R_X86_64_TPOFF32 | 23 | 32 | |
R_X86_64_PC64 | 24 | 64 | S + A - P |
R_X86_64_GOTOFF64 | 25 | 64 | S + A - GOT |
R_X86_64_GOTPC32 | 26 | 32 | GOT + A - P |
R_X86_64_SIZE32 | 32 | 32 | Z + A |
R_X86_64_SIZE64 | 33 | 64 | Z + A |
R_X86_64_GOTPC32_TLSDESC 34 | 32 | ||
R_X86_64_TLSDESC_CALL | 35 | NONE | |
R_X86_64_TLSDESC | 36 | 64 × 2 | |
R_X86_64_IRELATIVE | 37 | 64 | indirect (B + A) |
TLS information is at http://people.redhat.com/aoliva/writeups/TLS/RFC-TLSDESC-x86.txt
R_X86_64_IRELATIVE
is similar to R_X86_64_RELATIVE
except that
the value used in this relocation is the program address returned by the function,
which takes no arguments, at the address of the result of the corresponding
R_X86_64_RELATIVE
relocation.
Read more https://docs.oracle.com/cd/E23824_01/html/819-0690/chapter6-54839.html
Modules§
Structs§
- A unified ELF relocation structure
- An ELF section containing relocations, allowing lazy iteration over symbols.
Constants§
- Direct 32 bit
- Copy symbol at runtime
- Create GOT entry
- 32 bit GOT entry
- Load from 32 bit GOT entry, relaxable
- 32 bit offset to GOT
- 32 bit PC relative offset to GOT
- Adjust indirectly by program base
- Create PLT entry
- No reloc
- Keep this the last entry
- PC relative 32 bit
- 32 bit PLT address
- Adjust by program base
- 32-bit symbol size
- TLS descriptor containing pointer to code and to argument, returning the TLS offset for the symbol
- Marker of call through TLS descriptor for relaxation
- ID of module containing symbol
- Offset in TLS block
- Direct 32 bit for GNU version of general dynamic thread local data
- Direct 32 bit for general dynamic thread local data
- Relocation for call to __tls_get_addr()
- Tag for popl in GD TLS code
- Tag for pushl in GD TLS code
- GOT offset for TLS descriptor.
- GOT entry for static TLS block offset
- Address of GOT entry for static TLS block offset
- GOT entry for negated static TLS block offset
- Direct 32 bit for GNU version of local dynamic thread local data in LE code
- Direct 32 bit for local dynamic thread local data in LE code
- Relocation for call to __tls_get_addr() in LDM code
- Tag for popl in LDM TLS code
- Tag for pushl in LDM TLS code
- Offset relative to TLS block
- Offset relative to static TLS block
- Negated offset relative to static TLS block
- Offset in static TLS block
- Negated offset in static TLS block
- Direct 16-bit
- Direct 32 bit
- Direct 64 bit
- Dir. ADD imm. from bits 11:0
- P-page-rel. GOT off. ADRP 32:12
- PC-rel. ADR imm. from bits 20:0
- Page-rel. ADRP imm. from 32:12
- Likewise; no overflow check
- Likewise for CALL
- PC-rel. cond. br. imm. from 20:2.
- Copy symbol at runtime
- Create GOT entry
- GOT-relative 32-bit
- GOT-relative 64-bit
- PC-rel. GOT off. load imm. 20:2
- STT_GNU_IFUNC relocation
- PC-rel. B imm. from bits 27:2
- Create PLT entry
- GOT-rel. off. LD/ST imm. 14:3
- GOT-page-rel. GOT off. LD/ST 14:3
- Dir. GOT off. LD/ST imm. 11:3
- Likewise for LD/ST; no check.
- Dir. ADD imm. from bits 11:1
- Likewise for bits 11:2
- Likewise for bits 11:3
- Dir. ADD imm. from bits 11:4
- PC-rel. LD imm. from bits 20:2
- GOT-rel. off. MOV{N,Z} imm. 15:0.
- Likewise for MOVK; no check
- GOT-rel. o. MOV{N,Z} imm. 31:16
- GOT-rel. o. MOV{N,Z} imm. 47:32
- GOT-rel. o. MOV{N,Z} imm. 63:48
- Likewise for MOVK; no check
- Likewise for MOVK; no check
- PC-rel. MOV{N,Z} imm. from 15:0
- Likewise for MOVK; no check
- PC-rel. MOV{N,Z} imm. from 31:16.
- PC-rel. MOV{N,Z} imm. from 47:32.
- PC-rel. MOV{N,Z} imm. from 63:48.
- Likewise for MOVK; no check
- Likewise for MOVK; no check
- Dir. MOV{N,Z} imm. from 15:0
- Dir. MOV{N,Z} imm. from 31:16
- Dir. MOV{N,Z} imm. from 47:32
- Dir. MOVZ imm. from bits 15:0
- Likewise for MOVK; no check
- Dir. MOVZ imm. from bits 31:16
- Dir. MOVZ imm. from bits 47:32
- Dir. MOV{K,Z} imm. from 63:48
- Likewise for MOVK; no check
- Likewise for MOVK; no check
- No relocation
- Direct 32 bit
- Copy symbol at runtime
- Create GOT entry
- STT_GNU_IFUNC relocation
- Create PLT entry
- Adjust by program base
- TLS Descriptor
- Module number, 32 bit
- Module-relative offset, 32 bit
- TP-relative offset, 32 bit
- PC-relative 16-bit
- PC-relative 32-bit
- PC-relative 64-bit
- Adjust by program base
- TLS Descriptor
- Relax ADD
- Direct ADD imm. from 11:0
- Page-rel. ADRP imm. 32:12
- PC-rel. ADR immediate 20:0
- Relax BLR
- Direct LD off. from 11:3
- Relax LDR
- PC-rel. load immediate 20:2
- GOT-rel. MOVK imm. 15:0; no ck
- GOT-rel. MOV{N,Z} imm. 31:16
- direct ADD imm. from 11:0
- page-rel. ADRP imm. 32:12
- PC-relative ADR imm. 20:0
- GOT-rel. MOVK imm. 15:0
- GOT-rel. MOV{N,Z} 31:16
- Page-rel. ADRP 32:12
- Direct LD off. 11:3
- PC-rel. load imm. 20:2
- GOT-rel. MOVK 15:0
- GOT-rel. MOV{N,Z} 31:16
- DTP-rel. ADD imm. from 23:12.
- DTP-rel. ADD imm. from 11:0
- Likewise; no ovfl. check
- Like 514; local dynamic model
- Like 513; local dynamic model
- Like 512; local dynamic model
- DTP-rel. LD/ST imm. 11:0
- Likewise; no check
- DTP-rel. LD/ST imm. 11:1
- Likewise; no check
- DTP-rel. LD/ST imm. 11:2
- Likewise; no check
- DTP-rel. LD/ST imm. 11:3
- Likewise; no check
- DTP-rel. LD/ST imm. 11:4.
- Likewise; no check
- TLS PC-rel. load imm. 20:2
- TLS DTP-rel. MOV{N,Z} 15:0
- Likewise; MOVK; no check
- TLS DTP-rel. MOV{N,Z} 31:16
- TLS DTP-rel. MOV{N,Z} 47:32
- Likewise; MOVK; no check
- Like 516; local dynamic model
- Like 515; local dynamic model
- TP-rel. ADD imm. 23:12
- TP-rel. ADD imm. 11:0
- Likewise; no ovfl. check
- TP-rel. LD/ST off. 11:0
- Likewise; no ovfl. check.
- TP-rel. LD/ST off. 11:1
- Likewise; no check
- TP-rel. LD/ST off. 11:2
- Likewise; no check
- TP-rel. LD/ST off. 11:3
- Likewise; no check
- TP-rel. LD/ST off. 11:4
- Likewise; no check
- TLS TP-rel. MOV{N,Z} 15:0
- Likewise; MOVK; no check
- TLS TP-rel. MOV{N,Z} 31:16
- TLS TP-rel. MOV{N,Z} 47:32
- Likewise; MOVK; no check
- Module number, 64 bit
- Module-relative offset, 64 bit
- TP-relative offset, 64 bit
- PC-rel. TBZ/TBNZ imm. from 15:2
- Direct 8 bit
- Direct 12 bit
- Direct 16 bit
- Direct 32 bit
- Direct 32-bit
- Obsolete
- Obsolete
- Obsolete
- PC relative (ADD, SUB)
- PC relative (ADD, SUB)
- PC relative (ADD, SUB)
- PC relative (ADD, SUB)
- PC relative (ADD, SUB)
- Deprecated, prog. base relative
- Deprecated, prog. base relative
- Program base relative (ADD,SUB)
- Program base relative (ADD,SUB)
- Program base relative (ADD,SUB)
- Program base relative (ADD,SUB)
- Program base relative (ADD,SUB)
- Adjust by program base
- PC relative 24 bit (BL, BLX)
- Copy symbol at runtime
- Create GOT entry
- 32 bit GOT entry
- 32 bit offset to GOT
- 12 bit, GOT entry relative to GOT origin (LDR, STR)
- 32 bit PC relative offset to GOT
- GOT entry
- GOT entry relative to GOT origin (LDR)
- PC relative GOT entry
- PC relative 24 bit (B, BL
) - Create PLT entry
- PC relative (LDC, STC)
- PC relative (LDC, STC)
- PC relative (LDC, STC)
- Program base relative (LDC,STC)
- Program base relative (LDC,STC)
- Program base relative (LDC,STC)
- PC relative (STR{D,H},LDR{D,SB,H,SH})
- PC relative (STR{D,H},LDR{D,SB,H,SH})
- PC relative (STR{D,H},LDR{D,SB,H,SH})
- Program base relative (LDR, STR, LDRB, STRB)
- Program base relative (LDR, STR, LDRB, STRB)
- Program base relative (LDR, STR, LDRB, STRB)
- PC relative (LDR,STR,LDRB,STRB)
- PC relative (LDR,STR,LDRB,STRB)
- Deprecated, prog. base relative
- Program base relative (LDR,STR, LDRB, STRB)
- Program base relative (LDR, STR, LDRB, STRB)
- Program base relative (LDR, STR, LDRB, STRB)
- Obsolete
- Direct high 16-bit (MOVT)
- Program base relative high 16 bit (MOVT)
- PC relative (MOVT)
- Direct 16-bit (MOVW)
- Program base relative 16 bit (MOVW)
- Program base relative 16 bit (MOVW)
- PC relative 16-bit (MOVW)
- No reloc
- Keep this the last entry
- Deprecated PC relative 26 bit branch
- Deprecated, 32 bit PLT address
- 32 bit PC relative
- PC relative 32 bit
- PC relative 32-bit
- Adjust by program base
- Program base relative
- Obsolete static relocation
- Direct & 0x7C (LDR, STR)
- PC relative 12 bit (Thumb32 ADR.W)
- GOT entry relative to GOT origin, 12 bit (Thumb32 LDR)
- PC relative X & 0x7E (Thumb16 CBZ, CBNZ)
- PC relative 20 bit (Thumb32 B
.W) - PC relative 24 bit (Thumb32 B.W)
- Direct high 16 bit (Thumb32 MOVT)
- Program base relative high 16 bit (Thumb32 MOVT)
- PC relative high 16 bit (Thumb32 MOVT)
- Direct 16 bit (Thumb32 MOVW)
- Program base relative 16 bit (Thumb32 MOVW)
- Program base relative 16 bit (Thumb32 MOVW)
- PC relative 16 bit (Thumb32 MOVW)
- PC relative & 0x3FC(Thumb16 LDR, ADD, ADR).
- PC relative & 0x1FE (Thumb16 B/B
) - PC relative & 0xFFE (Thumb16 B)
- PC relative 12 bit (Thumb32 LDR{D,SB,H,SH})
- PC relative 24 bit (Thumb32 BL)
- Reserved
- Reserved
- Dynamic relocation
- TLS relaxation
- ID of module containing symbol
- Offset in TLS block
- PC-rel 32 bit for global dynamic thread local data
- PC-rel 32 bit for GOT entry of static TLS block offset
- 12 bit GOT entry relative to GOT origin (LDR)
- PC-rel 32 bit for local dynamic thread local data
- 12 bit relative to TLS block (LDR, STR)
- 32 bit offset relative to TLS block
- 12 bit relative to static TLS block (LDR, STR)
- 32 bit offset relative to static TLS block
- Offset in static TLS block
- Reserved
- Direct 16 bit
- Direct 26 bit shifted
- Direct 32 bit
- 16 bit GOT entry for function
- 16 bit GOT entry
- GP relative 16 bit
- GP relative 32 bit
- High 16 bit
- 16 bit literal entry
- Low 16 bit
- No reloc
- PC relative 16 bit
- PC relative 32 bit
- Module number 32 bit
- Module number 64 bit
- Module-relative offset 32 bit
- Module-relative offset 64 bit
- Module-relative offset, high 16 bits
- Module-relative offset, low 16 bits
- 16 bit GOT offset for GD
- 16 bit GOT offset for IE
- 16 bit GOT offset for LDM
- TP-relative offset, 32 bit6
- TP-relative offset, 64 bit
- TP-relative offset, high 16 bits
- TP-relative offset, low 16 bits
- Runtime relocation: word32 = S + A
- Runtime relocation: word64 = S + A
- 8-bit label addition: word8 = S + A
- 16-bit label addition: word16 = S + A
- 32-bit label addition: word32 = S + A
- 64-bit label addition: word64 = S + A
- Alignment statement
- PC-relative branch (SB-Type)
- PC-relative call: MACRO call,tail (auipc+jalr pair)
- PC-relative call (PLT): MACRO call,tail (auipc+jalr pair) PIC
- Runtime relocation: must be in executable, not allowed in shared library
- GNU C++ vtable member usage
- GNU C++ vtable hierarchy
- PC-relative GOT reference: MACRO la
- GP-relative reference (I-Type)
- GP-relative reference (S-Type)
- Absolute address: %hi(symbol) (U-Type)
- PC-relative jump (UJ-Type)
- Runtime relocation: word32,64 = S; handled by PLT unless LD_BIND_NOW
- Absolute address: %lo(symbol) (I-Type)
- Absolute address: %lo(symbol) (S-Type)
- None
- PC-relative reference: %pcrel_hi(symbol) (U-Type)
- PC-relative reference: %pcrel_lo(symbol) (I-Type)
- PC-relative reference: %pcrel_lo(symbol) (S-Type)
- Runtime relocation: word32,64 = B + A
- Instruction pair can be relaxed
- PC-relative branch offset (CB-Type)
- PC-relative jump offset (CJ-Type)
- Absolute address (CI-Type)
- Local label subtraction
- Local label subtraction
- Local label subtraction
- Local label subtraction
- Local label subtraction
- 8-bit label subtraction: word8 = S - A
- 16-bit label subtraction: word16 = S - A
- 32-bit label subtraction: word32 = S - A
- 64-bit label subtraction: word64 = S - A
- TLS relocation: word32 = S->TLSINDEX
- TLS relocation: word64 = S->TLSINDEX
- TLS relocation: word32 = TLS + S + A - TLS_TP_OFFSET
- TLS relocation: word64 = TLS + S + A - TLS_TP_OFFSET
- PC-relative TLS GD reference: MACRO la.tls.gd
- PC-relative TLS IE GOT offset: MACRO la.tls.ie
- TLS relocation: word32 = TLS + S + A + S_TLS_OFFSET - TLS_DTV_OFFSET
- TLS relocation: word64 = TLS + S + A + S_TLS_OFFSET - TLS_DTV_OFFSET
- TLS LE thread usage: %tprel_add(symbol)
- TLS LE thread offset: %tprel_hi(symbol) (U-Type)
- TP-relative TLS LE load (I-Type)
- TLS LE thread offset: %tprel_lo(symbol) (I-Type)
- TLS LE thread offset: %tprel_lo(symbol) (S-Type)
- TP-relative TLS LE store (S-Type)
- Direct 8 bit sign extended.
- Direct 16 bit zero extended.
- Direct 32 bit zero extended.
- Direct 64 bit.
- Direct 32 bit sign extended.
- Copy symbol at runtime.
- ID of module containing symbol.
- Offset in TLS block.
- Offset in module’s TLS block.
- Create GOT entry.
- 32 bit GOT entry.
- 64-bit GOT entry offset.
- 64 bit offset to GOT.
- 32 bit signed pc relative offset to GOT.
- 64-bit PC relative offset to GOT.
- GOT offset for TLS descriptor..
- 32 bit signed PC relative offset to GOT.
- 64-bit PC relative offset to GOT entry.
- Load from 32 bit signed pc relative offset to GOT entry without REX prefix, relaxable.
- like GOT64, says PLT entry needed.
- 32 bit signed PC relative offset to GOT entry for IE symbol.
- Adjust indirectly by program base.
- Create PLT entry.
- No reloc.
- 8 bit sign extended pc relative.
- 16 bit sign extended pc relative.
- PC relative 32 bit signed.
- PC relative 64 bit.
- 32 bit PLT address.
- 64-bit GOT relative offset to PLT entry.
- Adjust by program base.
- 64-bit adjust by program base.
- Load from 32 bit signed pc relative offset to GOT entry with REX prefix, relaxable.
- Size of symbol plus 32-bit addend.
- Size of symbol plus 64-bit addend.
- TLS descriptor..
- Marker for call through TLS descriptor..
- 32 bit signed PC relative offset to two GOT entries for GD symbol.
- 32 bit signed PC relative offset to two GOT entries for LD symbol.
- Offset in initial TLS block.
- Offset in initial TLS block.