kit

kit
git clone https://git.ryansepassi.com/git/kit.git
Log | Files | Refs | README

commit 78a82037e8216feafcc01711a22b21322ac64164
parent f86498e87167a077fa87b390ad814e52e43b4f21
Author: Ryan Sepassi <rsepassi@gmail.com>
Date:   Sun, 10 May 2026 11:31:01 -0700

obj: ELF x64 — TLS and GOT-relax reloc coverage

Adds the x86_64 reloc kinds clang emits at -O0 for TLS local-exec and
modern GOT-load relaxation (TPOFF32/64, GOTTPOFF, DTPOFF32/MOD64,
TLSGD/TLSLD, GOTPCRELX, REX_GOTPCRELX, GOTPC32, GOTOFF64), plus the
matching RelocKind enum values and objdump labels.

CFREE_TEST_ARCH=x64 test/elf now passes 36/36 (was 34/2 with 06_tls
and 14_got_pic failing on TPOFF32 / REX_GOTPCRELX).

Diffstat:
Msrc/api/pipeline.c | 24++++++++++++++++++++++++
Msrc/obj/elf.h | 12++++++++++++
Msrc/obj/elf_reloc_x86_64.c | 48++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/obj/obj.h | 12++++++++++++
4 files changed, 96 insertions(+), 0 deletions(-)

diff --git a/src/api/pipeline.c b/src/api/pipeline.c @@ -1046,6 +1046,30 @@ static const char* reloc_kind_name(u16 kind) { return "R_X86_64_PLT32"; case R_X64_GOTPCREL: return "R_X86_64_GOTPCREL"; + case R_X64_GOTPCRELX: + return "R_X86_64_GOTPCRELX"; + case R_X64_REX_GOTPCRELX: + return "R_X86_64_REX_GOTPCRELX"; + case R_X64_GOTPC32: + return "R_X86_64_GOTPC32"; + case R_X64_GOTOFF64: + return "R_X86_64_GOTOFF64"; + case R_X64_TPOFF32: + return "R_X86_64_TPOFF32"; + case R_X64_TPOFF64: + return "R_X86_64_TPOFF64"; + case R_X64_DTPOFF32: + return "R_X86_64_DTPOFF32"; + case R_X64_DTPMOD64: + return "R_X86_64_DTPMOD64"; + case R_X64_DTPOFF64: + return "R_X86_64_DTPOFF64"; + case R_X64_TLSGD: + return "R_X86_64_TLSGD"; + case R_X64_TLSLD: + return "R_X86_64_TLSLD"; + case R_X64_GOTTPOFF: + return "R_X86_64_GOTTPOFF"; case R_X64_GLOB_DAT: return "R_X86_64_GLOB_DAT"; case R_X64_JUMP_SLOT: diff --git a/src/obj/elf.h b/src/obj/elf.h @@ -269,7 +269,19 @@ u32 elf_aarch64_reloc_from(u32 elf_type); #define ELF_R_X86_64_PC16 13 #define ELF_R_X86_64_8 14 #define ELF_R_X86_64_PC8 15 +#define ELF_R_X86_64_DTPMOD64 16 +#define ELF_R_X86_64_DTPOFF64 17 +#define ELF_R_X86_64_TPOFF64 18 +#define ELF_R_X86_64_TLSGD 19 +#define ELF_R_X86_64_TLSLD 20 +#define ELF_R_X86_64_DTPOFF32 21 +#define ELF_R_X86_64_GOTTPOFF 22 +#define ELF_R_X86_64_TPOFF32 23 #define ELF_R_X86_64_PC64 24 +#define ELF_R_X86_64_GOTOFF64 25 +#define ELF_R_X86_64_GOTPC32 26 +#define ELF_R_X86_64_GOTPCRELX 41 +#define ELF_R_X86_64_REX_GOTPCRELX 42 u32 elf_x86_64_reloc_to(u32 kind /* RelocKind */); u32 elf_x86_64_reloc_from(u32 elf_type); diff --git a/src/obj/elf_reloc_x86_64.c b/src/obj/elf_reloc_x86_64.c @@ -35,6 +35,30 @@ u32 elf_x86_64_reloc_to(u32 kind /* RelocKind */) { return ELF_R_X86_64_GOT32; case R_X64_GOTPCREL: return ELF_R_X86_64_GOTPCREL; + case R_X64_GOTPCRELX: + return ELF_R_X86_64_GOTPCRELX; + case R_X64_REX_GOTPCRELX: + return ELF_R_X86_64_REX_GOTPCRELX; + case R_X64_GOTPC32: + return ELF_R_X86_64_GOTPC32; + case R_X64_GOTOFF64: + return ELF_R_X86_64_GOTOFF64; + case R_X64_TPOFF32: + return ELF_R_X86_64_TPOFF32; + case R_X64_TPOFF64: + return ELF_R_X86_64_TPOFF64; + case R_X64_DTPOFF32: + return ELF_R_X86_64_DTPOFF32; + case R_X64_DTPMOD64: + return ELF_R_X86_64_DTPMOD64; + case R_X64_DTPOFF64: + return ELF_R_X86_64_DTPOFF64; + case R_X64_TLSGD: + return ELF_R_X86_64_TLSGD; + case R_X64_TLSLD: + return ELF_R_X86_64_TLSLD; + case R_X64_GOTTPOFF: + return ELF_R_X86_64_GOTTPOFF; case R_X64_GLOB_DAT: return ELF_R_X86_64_GLOB_DAT; case R_X64_JUMP_SLOT: @@ -70,6 +94,30 @@ u32 elf_x86_64_reloc_from(u32 elf_type) { return R_GOT32; case ELF_R_X86_64_GOTPCREL: return R_X64_GOTPCREL; + case ELF_R_X86_64_GOTPCRELX: + return R_X64_GOTPCRELX; + case ELF_R_X86_64_REX_GOTPCRELX: + return R_X64_REX_GOTPCRELX; + case ELF_R_X86_64_GOTPC32: + return R_X64_GOTPC32; + case ELF_R_X86_64_GOTOFF64: + return R_X64_GOTOFF64; + case ELF_R_X86_64_TPOFF32: + return R_X64_TPOFF32; + case ELF_R_X86_64_TPOFF64: + return R_X64_TPOFF64; + case ELF_R_X86_64_DTPOFF32: + return R_X64_DTPOFF32; + case ELF_R_X86_64_DTPMOD64: + return R_X64_DTPMOD64; + case ELF_R_X86_64_DTPOFF64: + return R_X64_DTPOFF64; + case ELF_R_X86_64_TLSGD: + return R_X64_TLSGD; + case ELF_R_X86_64_TLSLD: + return R_X64_TLSLD; + case ELF_R_X86_64_GOTTPOFF: + return R_X64_GOTTPOFF; case ELF_R_X86_64_GLOB_DAT: return R_X64_GLOB_DAT; case ELF_R_X86_64_JUMP_SLOT: diff --git a/src/obj/obj.h b/src/obj/obj.h @@ -153,6 +153,18 @@ typedef enum RelocKind { R_X64_PC8, R_X64_PLT32, R_X64_GOTPCREL, + R_X64_GOTPCRELX, + R_X64_REX_GOTPCRELX, + R_X64_GOTPC32, + R_X64_GOTOFF64, + R_X64_TPOFF32, + R_X64_TPOFF64, + R_X64_DTPOFF32, + R_X64_DTPMOD64, + R_X64_DTPOFF64, + R_X64_TLSGD, + R_X64_TLSLD, + R_X64_GOTTPOFF, R_X64_GLOB_DAT, R_X64_JUMP_SLOT, R_X64_RELATIVE,