From: Kirill A. Korinsky Subject: ld.so/sparc64: fix UA64 relocation mask selection and byte order To: OpenBSD tech Date: Thu, 09 Jul 2026 12:06:51 +0200 tech@, tb@ continue to test my sparc64-by-llvm diff and he discovered a new issues. After some search here and where I think I had spoted two separated issues in ld.so for sparc64. The first one is missing comma. The relocation mask table is indexed by relocation number; the missing separator after the R_SPARC_6 entry shifts subsequent initializers, so R_SPARC_UA64 receives the R_SPARC_UA16 mask. Restore the table layout, otherwise only the low 16 bits of relocated 64 bit pointers survive. Ok, the next one is byte order. The unaligned relocation path reconstructs the relocation target in SPARC byte order, but writes the adjusted value back least significant byte first; this reverses R_SPARC_UA64 results on a big endian target. Write the value back in target byte order, so relocated function pointers retain their canonical representation. Ok? Index: libexec/ld.so/sparc64/rtld_machine.c =================================================================== RCS file: /home/cvs/src/libexec/ld.so/sparc64/rtld_machine.c,v diff -u -p -r1.72 rtld_machine.c --- libexec/ld.so/sparc64/rtld_machine.c 6 May 2026 08:07:05 -0000 1.72 +++ libexec/ld.so/sparc64/rtld_machine.c 9 Jul 2026 09:55:55 -0000 @@ -189,7 +189,7 @@ static const long reloc_target_bitmask[] _BM(22), _BM(10), _BM(22), /* _PC_HH22, _PC_HM10, _PC_LM22 */ _BM(16), _BM(19), /* _WDISP16, _WDISP19 */ -1, /* GLOB_JMP */ - _BM(7), _BM(5), _BM(6) /* _7, _5, _6 */ + _BM(7), _BM(5), _BM(6), /* _7, _5, _6 */ -1, -1, /* DISP64, PLT64 */ _BM(22), _BM(13), /* HIX22, LOX10 */ _BM(22), _BM(10), _BM(13), /* H44, M44, L44 */ @@ -328,7 +328,7 @@ resolve_failed: /* Write it back out. */ for (i=0; i> (8*i)) & 0xff); + ptr[i] = ((tmp >> (8*(size - i - 1))) & 0xff); } else if (RELOC_TARGET_SIZE(type) > 32) { *where &= ~mask; *where |= value; -- wbr, Kirill