commit 336cd946102c66acf0a2b6f75d6fd998af1ed51b
parent ded0e181e2962ef600e6fe13935f4fb822365e7a
Author: Ryan Sepassi <rsepassi@gmail.com>
Date: Sat, 9 May 2026 12:07:22 -0700
elf: aarch64 TLSLE reloc roundtrip support
Adds the 11 R_AARCH64_TLSLE_* (549-559) wire-format constants and
matching RelocKind entries, with read/write mappings and pretty names.
Unblocks cases/06_tls; xfail removed.
Diffstat:
4 files changed, 59 insertions(+), 0 deletions(-)
diff --git a/src/api/pipeline.c b/src/api/pipeline.c
@@ -969,6 +969,17 @@ static const char* reloc_kind_name(u16 kind)
case R_AARCH64_LDST32_ABS_LO12_NC: return "R_AARCH64_LDST32_ABS_LO12_NC";
case R_AARCH64_LDST64_ABS_LO12_NC: return "R_AARCH64_LDST64_ABS_LO12_NC";
case R_AARCH64_LDST128_ABS_LO12_NC:return "R_AARCH64_LDST128_ABS_LO12_NC";
+ case R_AARCH64_TLSLE_ADD_TPREL_HI12: return "R_AARCH64_TLSLE_ADD_TPREL_HI12";
+ case R_AARCH64_TLSLE_ADD_TPREL_LO12: return "R_AARCH64_TLSLE_ADD_TPREL_LO12";
+ case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC: return "R_AARCH64_TLSLE_ADD_TPREL_LO12_NC";
+ case R_AARCH64_TLSLE_LDST8_TPREL_LO12: return "R_AARCH64_TLSLE_LDST8_TPREL_LO12";
+ case R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC: return "R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC";
+ case R_AARCH64_TLSLE_LDST16_TPREL_LO12: return "R_AARCH64_TLSLE_LDST16_TPREL_LO12";
+ case R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC: return "R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC";
+ case R_AARCH64_TLSLE_LDST32_TPREL_LO12: return "R_AARCH64_TLSLE_LDST32_TPREL_LO12";
+ case R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC: return "R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC";
+ case R_AARCH64_TLSLE_LDST64_TPREL_LO12: return "R_AARCH64_TLSLE_LDST64_TPREL_LO12";
+ case R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC: return "R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC";
case R_RV_HI20: return "R_RISCV_HI20";
case R_RV_LO12_I: return "R_RISCV_LO12_I";
case R_RV_LO12_S: return "R_RISCV_LO12_S";
diff --git a/src/obj/elf.h b/src/obj/elf.h
@@ -139,6 +139,20 @@
#define ELF_R_AARCH64_ADR_GOT_PAGE 311
#define ELF_R_AARCH64_LD64_GOT_LO12_NC 312
+/* AArch64 TLS Local-Exec (static linking model: each TLV is at a fixed
+ * offset from the thread pointer, computed at link time). */
+#define ELF_R_AARCH64_TLSLE_ADD_TPREL_HI12 549
+#define ELF_R_AARCH64_TLSLE_ADD_TPREL_LO12 550
+#define ELF_R_AARCH64_TLSLE_ADD_TPREL_LO12_NC 551
+#define ELF_R_AARCH64_TLSLE_LDST8_TPREL_LO12 552
+#define ELF_R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC 553
+#define ELF_R_AARCH64_TLSLE_LDST16_TPREL_LO12 554
+#define ELF_R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC 555
+#define ELF_R_AARCH64_TLSLE_LDST32_TPREL_LO12 556
+#define ELF_R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC 557
+#define ELF_R_AARCH64_TLSLE_LDST64_TPREL_LO12 558
+#define ELF_R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC 559
+
/* Map cfree-canonical RelocKind <-> AArch64 ELF reloc type. Returns
* R_AARCH64_NONE (0) on unsupported kinds; emit_elf treats that as a
* fatal error.
diff --git a/src/obj/elf_reloc_aarch64.c b/src/obj/elf_reloc_aarch64.c
@@ -32,6 +32,17 @@ u32 elf_aarch64_reloc_to(u32 kind /* RelocKind */)
case R_AARCH64_LDST128_ABS_LO12_NC: return ELF_R_AARCH64_LDST128_ABS_LO12_NC;
case R_AARCH64_ADR_GOT_PAGE: return ELF_R_AARCH64_ADR_GOT_PAGE;
case R_AARCH64_LD64_GOT_LO12_NC: return ELF_R_AARCH64_LD64_GOT_LO12_NC;
+ case R_AARCH64_TLSLE_ADD_TPREL_HI12: return ELF_R_AARCH64_TLSLE_ADD_TPREL_HI12;
+ case R_AARCH64_TLSLE_ADD_TPREL_LO12: return ELF_R_AARCH64_TLSLE_ADD_TPREL_LO12;
+ case R_AARCH64_TLSLE_ADD_TPREL_LO12_NC: return ELF_R_AARCH64_TLSLE_ADD_TPREL_LO12_NC;
+ case R_AARCH64_TLSLE_LDST8_TPREL_LO12: return ELF_R_AARCH64_TLSLE_LDST8_TPREL_LO12;
+ case R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC: return ELF_R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC;
+ case R_AARCH64_TLSLE_LDST16_TPREL_LO12: return ELF_R_AARCH64_TLSLE_LDST16_TPREL_LO12;
+ case R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC: return ELF_R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC;
+ case R_AARCH64_TLSLE_LDST32_TPREL_LO12: return ELF_R_AARCH64_TLSLE_LDST32_TPREL_LO12;
+ case R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC: return ELF_R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC;
+ case R_AARCH64_TLSLE_LDST64_TPREL_LO12: return ELF_R_AARCH64_TLSLE_LDST64_TPREL_LO12;
+ case R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC: return ELF_R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC;
default: return ELF_R_AARCH64_NONE;
}
}
@@ -55,6 +66,17 @@ u32 elf_aarch64_reloc_from(u32 elf_type)
case ELF_R_AARCH64_LDST128_ABS_LO12_NC: return R_AARCH64_LDST128_ABS_LO12_NC;
case ELF_R_AARCH64_ADR_GOT_PAGE: return R_AARCH64_ADR_GOT_PAGE;
case ELF_R_AARCH64_LD64_GOT_LO12_NC: return R_AARCH64_LD64_GOT_LO12_NC;
+ case ELF_R_AARCH64_TLSLE_ADD_TPREL_HI12: return R_AARCH64_TLSLE_ADD_TPREL_HI12;
+ case ELF_R_AARCH64_TLSLE_ADD_TPREL_LO12: return R_AARCH64_TLSLE_ADD_TPREL_LO12;
+ case ELF_R_AARCH64_TLSLE_ADD_TPREL_LO12_NC: return R_AARCH64_TLSLE_ADD_TPREL_LO12_NC;
+ case ELF_R_AARCH64_TLSLE_LDST8_TPREL_LO12: return R_AARCH64_TLSLE_LDST8_TPREL_LO12;
+ case ELF_R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC: return R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC;
+ case ELF_R_AARCH64_TLSLE_LDST16_TPREL_LO12: return R_AARCH64_TLSLE_LDST16_TPREL_LO12;
+ case ELF_R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC: return R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC;
+ case ELF_R_AARCH64_TLSLE_LDST32_TPREL_LO12: return R_AARCH64_TLSLE_LDST32_TPREL_LO12;
+ case ELF_R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC: return R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC;
+ case ELF_R_AARCH64_TLSLE_LDST64_TPREL_LO12: return R_AARCH64_TLSLE_LDST64_TPREL_LO12;
+ case ELF_R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC: return R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC;
default: return (u32)-1; /* sentinel */
}
}
diff --git a/src/obj/obj.h b/src/obj/obj.h
@@ -105,6 +105,18 @@ typedef enum RelocKind {
R_AARCH64_LDST8_ABS_LO12_NC, R_AARCH64_LDST16_ABS_LO12_NC,
R_AARCH64_LDST32_ABS_LO12_NC, R_AARCH64_LDST64_ABS_LO12_NC,
R_AARCH64_LDST128_ABS_LO12_NC,
+ /* AArch64 TLS Local-Exec model. */
+ R_AARCH64_TLSLE_ADD_TPREL_HI12,
+ R_AARCH64_TLSLE_ADD_TPREL_LO12,
+ R_AARCH64_TLSLE_ADD_TPREL_LO12_NC,
+ R_AARCH64_TLSLE_LDST8_TPREL_LO12,
+ R_AARCH64_TLSLE_LDST8_TPREL_LO12_NC,
+ R_AARCH64_TLSLE_LDST16_TPREL_LO12,
+ R_AARCH64_TLSLE_LDST16_TPREL_LO12_NC,
+ R_AARCH64_TLSLE_LDST32_TPREL_LO12,
+ R_AARCH64_TLSLE_LDST32_TPREL_LO12_NC,
+ R_AARCH64_TLSLE_LDST64_TPREL_LO12,
+ R_AARCH64_TLSLE_LDST64_TPREL_LO12_NC,
R_RV_HI20, R_RV_LO12_I, R_RV_LO12_S, R_RV_BRANCH, R_RV_JAL, R_RV_CALL,
R_WASM_FUNCIDX, R_WASM_TABLEIDX, R_WASM_MEMOFS, R_WASM_TYPEIDX,
} RelocKind;