kit

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

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:
Msrc/api/pipeline.c | 11+++++++++++
Msrc/obj/elf.h | 14++++++++++++++
Msrc/obj/elf_reloc_aarch64.c | 22++++++++++++++++++++++
Msrc/obj/obj.h | 12++++++++++++
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;