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:
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,