From a087dea8692eee879e8226b70eb691dea7758b0b Mon Sep 17 00:00:00 2001 From: WANG Xuerui Date: Sat, 13 Sep 2025 15:57:12 +0800 Subject: [PATCH] debug/elf: sync new loong64 relocation types up to LoongArch ELF psABI v20250521 Add several new relocation types defined in newer versions of LoongArch ELF psABI v20250521, part of the v2.40 spec bundle. The new relocations are seeing increased adoption because distributions are moving to newer GNU/LLVM toolchain versions, so Go's internal linker must be prepared to handle some of them, especially R_LARCH_CALL36 because the ecosystem is slowly migrating to the "medium" code model by default. The constants R_LARCH_DELETE and R_LARCH_CFA were removed in LoongArch ELF psABI v20231102 (spec bundle v2.20), but they are already part of the public API, so they are retained for now for upholding the go1 compatibility guarantee. Corresponding binutils implementation: * R_LARCH_CALL36: https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=dc5f359ed6a36d2c895d89c3e4886f3a2b6d9232 * TLSDESC: https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=26265e7fdf19d461563388495b6799eb3719f80a * TLS {LD,GD,DESC} relaxation: https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=ae296cc45258b95223210263d1b91115e84beb56 * TLS LE relaxation: https://sourceware.org/git/?p=binutils-gdb.git;a=commit;h=775dead218e12e3fb94481c7a99aa0238d6a9138 Updates #75562 See: https://github.com/loongson/la-abi-specs/blob/v2.40/laelf.adoc See: https://github.com/loongson-community/discussions/issues/43 Change-Id: Ib023e0b6becc0862d27afc419d3eb84c737359db Reviewed-on: https://go-review.googlesource.com/c/go/+/709716 Reviewed-by: Mark Freeman Reviewed-by: Meidan Li Reviewed-by: abner chenc LUCI-TryBot-Result: Go LUCI Reviewed-by: Junyang Shao Reviewed-by: sophie zhao --- api/next/75562.txt | 38 +++++++++++++++++++ doc/next/6-stdlib/99-minor/debug/elf/75562.md | 4 ++ src/debug/elf/elf.go | 38 +++++++++++++++++++ src/debug/elf/elf_test.go | 1 + 4 files changed, 81 insertions(+) create mode 100644 api/next/75562.txt create mode 100644 doc/next/6-stdlib/99-minor/debug/elf/75562.md diff --git a/api/next/75562.txt b/api/next/75562.txt new file mode 100644 index 0000000000..5e3fe6c6a5 --- /dev/null +++ b/api/next/75562.txt @@ -0,0 +1,38 @@ +pkg debug/elf, const R_LARCH_TLS_DESC32 = 13 #75562 +pkg debug/elf, const R_LARCH_TLS_DESC32 R_LARCH #75562 +pkg debug/elf, const R_LARCH_TLS_DESC64 = 14 #75562 +pkg debug/elf, const R_LARCH_TLS_DESC64 R_LARCH #75562 +pkg debug/elf, const R_LARCH_CALL36 = 110 #75562 +pkg debug/elf, const R_LARCH_CALL36 R_LARCH #75562 +pkg debug/elf, const R_LARCH_TLS_DESC_PC_HI20 = 111 #75562 +pkg debug/elf, const R_LARCH_TLS_DESC_PC_HI20 R_LARCH #75562 +pkg debug/elf, const R_LARCH_TLS_DESC_PC_LO12 = 112 #75562 +pkg debug/elf, const R_LARCH_TLS_DESC_PC_LO12 R_LARCH #75562 +pkg debug/elf, const R_LARCH_TLS_DESC64_PC_LO20 = 113 #75562 +pkg debug/elf, const R_LARCH_TLS_DESC64_PC_LO20 R_LARCH #75562 +pkg debug/elf, const R_LARCH_TLS_DESC64_PC_HI12 = 114 #75562 +pkg debug/elf, const R_LARCH_TLS_DESC64_PC_HI12 R_LARCH #75562 +pkg debug/elf, const R_LARCH_TLS_DESC_HI20 = 115 #75562 +pkg debug/elf, const R_LARCH_TLS_DESC_HI20 R_LARCH #75562 +pkg debug/elf, const R_LARCH_TLS_DESC_LO12 = 116 #75562 +pkg debug/elf, const R_LARCH_TLS_DESC_LO12 R_LARCH #75562 +pkg debug/elf, const R_LARCH_TLS_DESC64_LO20 = 117 #75562 +pkg debug/elf, const R_LARCH_TLS_DESC64_LO20 R_LARCH #75562 +pkg debug/elf, const R_LARCH_TLS_DESC64_HI12 = 118 #75562 +pkg debug/elf, const R_LARCH_TLS_DESC64_HI12 R_LARCH #75562 +pkg debug/elf, const R_LARCH_TLS_DESC_LD = 119 #75562 +pkg debug/elf, const R_LARCH_TLS_DESC_LD R_LARCH #75562 +pkg debug/elf, const R_LARCH_TLS_DESC_CALL = 120 #75562 +pkg debug/elf, const R_LARCH_TLS_DESC_CALL R_LARCH #75562 +pkg debug/elf, const R_LARCH_TLS_LE_HI20_R = 121 #75562 +pkg debug/elf, const R_LARCH_TLS_LE_HI20_R R_LARCH #75562 +pkg debug/elf, const R_LARCH_TLS_LE_ADD_R = 122 #75562 +pkg debug/elf, const R_LARCH_TLS_LE_ADD_R R_LARCH #75562 +pkg debug/elf, const R_LARCH_TLS_LE_LO12_R = 123 #75562 +pkg debug/elf, const R_LARCH_TLS_LE_LO12_R R_LARCH #75562 +pkg debug/elf, const R_LARCH_TLS_LD_PCREL20_S2 = 124 #75562 +pkg debug/elf, const R_LARCH_TLS_LD_PCREL20_S2 R_LARCH #75562 +pkg debug/elf, const R_LARCH_TLS_GD_PCREL20_S2 = 125 #75562 +pkg debug/elf, const R_LARCH_TLS_GD_PCREL20_S2 R_LARCH #75562 +pkg debug/elf, const R_LARCH_TLS_DESC_PCREL20_S2 = 126 #75562 +pkg debug/elf, const R_LARCH_TLS_DESC_PCREL20_S2 R_LARCH #75562 diff --git a/doc/next/6-stdlib/99-minor/debug/elf/75562.md b/doc/next/6-stdlib/99-minor/debug/elf/75562.md new file mode 100644 index 0000000000..306111ddd8 --- /dev/null +++ b/doc/next/6-stdlib/99-minor/debug/elf/75562.md @@ -0,0 +1,4 @@ +Additional `R_LARCH_*` constants from [LoongArch ELF psABI v20250521][laelf-20250521] +(global version v2.40) are defined for use with LoongArch systems. + +[laelf-20250521]: https://github.com/loongson/la-abi-specs/blob/v2.40/laelf.adoc diff --git a/src/debug/elf/elf.go b/src/debug/elf/elf.go index 58e37daed2..557648ece9 100644 --- a/src/debug/elf/elf.go +++ b/src/debug/elf/elf.go @@ -2305,6 +2305,8 @@ const ( R_LARCH_TLS_TPREL32 R_LARCH = 10 R_LARCH_TLS_TPREL64 R_LARCH = 11 R_LARCH_IRELATIVE R_LARCH = 12 + R_LARCH_TLS_DESC32 R_LARCH = 13 + R_LARCH_TLS_DESC64 R_LARCH = 14 R_LARCH_MARK_LA R_LARCH = 20 R_LARCH_MARK_PCREL R_LARCH = 21 R_LARCH_SOP_PUSH_PCREL R_LARCH = 22 @@ -2390,6 +2392,23 @@ const ( R_LARCH_ADD_ULEB128 R_LARCH = 107 R_LARCH_SUB_ULEB128 R_LARCH = 108 R_LARCH_64_PCREL R_LARCH = 109 + R_LARCH_CALL36 R_LARCH = 110 + R_LARCH_TLS_DESC_PC_HI20 R_LARCH = 111 + R_LARCH_TLS_DESC_PC_LO12 R_LARCH = 112 + R_LARCH_TLS_DESC64_PC_LO20 R_LARCH = 113 + R_LARCH_TLS_DESC64_PC_HI12 R_LARCH = 114 + R_LARCH_TLS_DESC_HI20 R_LARCH = 115 + R_LARCH_TLS_DESC_LO12 R_LARCH = 116 + R_LARCH_TLS_DESC64_LO20 R_LARCH = 117 + R_LARCH_TLS_DESC64_HI12 R_LARCH = 118 + R_LARCH_TLS_DESC_LD R_LARCH = 119 + R_LARCH_TLS_DESC_CALL R_LARCH = 120 + R_LARCH_TLS_LE_HI20_R R_LARCH = 121 + R_LARCH_TLS_LE_ADD_R R_LARCH = 122 + R_LARCH_TLS_LE_LO12_R R_LARCH = 123 + R_LARCH_TLS_LD_PCREL20_S2 R_LARCH = 124 + R_LARCH_TLS_GD_PCREL20_S2 R_LARCH = 125 + R_LARCH_TLS_DESC_PCREL20_S2 R_LARCH = 126 ) var rlarchStrings = []intName{ @@ -2406,6 +2425,8 @@ var rlarchStrings = []intName{ {10, "R_LARCH_TLS_TPREL32"}, {11, "R_LARCH_TLS_TPREL64"}, {12, "R_LARCH_IRELATIVE"}, + {13, "R_LARCH_TLS_DESC32"}, + {14, "R_LARCH_TLS_DESC64"}, {20, "R_LARCH_MARK_LA"}, {21, "R_LARCH_MARK_PCREL"}, {22, "R_LARCH_SOP_PUSH_PCREL"}, @@ -2491,6 +2512,23 @@ var rlarchStrings = []intName{ {107, "R_LARCH_ADD_ULEB128"}, {108, "R_LARCH_SUB_ULEB128"}, {109, "R_LARCH_64_PCREL"}, + {110, "R_LARCH_CALL36"}, + {111, "R_LARCH_TLS_DESC_PC_HI20"}, + {112, "R_LARCH_TLS_DESC_PC_LO12"}, + {113, "R_LARCH_TLS_DESC64_PC_LO20"}, + {114, "R_LARCH_TLS_DESC64_PC_HI12"}, + {115, "R_LARCH_TLS_DESC_HI20"}, + {116, "R_LARCH_TLS_DESC_LO12"}, + {117, "R_LARCH_TLS_DESC64_LO20"}, + {118, "R_LARCH_TLS_DESC64_HI12"}, + {119, "R_LARCH_TLS_DESC_LD"}, + {120, "R_LARCH_TLS_DESC_CALL"}, + {121, "R_LARCH_TLS_LE_HI20_R"}, + {122, "R_LARCH_TLS_LE_ADD_R"}, + {123, "R_LARCH_TLS_LE_LO12_R"}, + {124, "R_LARCH_TLS_LD_PCREL20_S2"}, + {125, "R_LARCH_TLS_GD_PCREL20_S2"}, + {126, "R_LARCH_TLS_DESC_PCREL20_S2"}, } func (i R_LARCH) String() string { return stringName(uint32(i), rlarchStrings, false) } diff --git a/src/debug/elf/elf_test.go b/src/debug/elf/elf_test.go index 0350d53050..256f850f96 100644 --- a/src/debug/elf/elf_test.go +++ b/src/debug/elf/elf_test.go @@ -34,6 +34,7 @@ var nameTests = []nameTest{ {R_ALPHA_OP_PUSH, "R_ALPHA_OP_PUSH"}, {R_ARM_THM_ABS5, "R_ARM_THM_ABS5"}, {R_386_GOT32, "R_386_GOT32"}, + {R_LARCH_CALL36, "R_LARCH_CALL36"}, {R_PPC_GOT16_HI, "R_PPC_GOT16_HI"}, {R_SPARC_GOT22, "R_SPARC_GOT22"}, {ET_LOOS + 5, "ET_LOOS+5"}, -- 2.52.0