Module Name: src Committed By: martin Date: Wed Aug 7 10:45:41 UTC 2024
Modified Files: src/libexec/ld.elf_so/arch/aarch64 [netbsd-9]: mdreloc.c src/libexec/ld.elf_so/arch/arm [netbsd-9]: mdreloc.c Log Message: Pull up following revision(s) (requested by riastradh in ticket #1862): libexec/ld.elf_so/arch/arm/mdreloc.c: revision 1.45 libexec/ld.elf_so/arch/aarch64/mdreloc.c: revision 1.14 Honor addend for R_AARCH64_TLS_TPREL relocation. R_ARM_TLS_TPOFF32 needs to adjust the existing value, not blindly overwrite it. To generate a diff of this commit: cvs rdiff -u -r1.13.2.1 -r1.13.2.2 \ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c cvs rdiff -u -r1.44.4.1 -r1.44.4.2 src/libexec/ld.elf_so/arch/arm/mdreloc.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/libexec/ld.elf_so/arch/aarch64/mdreloc.c diff -u src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.13.2.1 src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.13.2.2 --- src/libexec/ld.elf_so/arch/aarch64/mdreloc.c:1.13.2.1 Fri Aug 4 12:55:46 2023 +++ src/libexec/ld.elf_so/arch/aarch64/mdreloc.c Wed Aug 7 10:45:41 2024 @@ -1,4 +1,4 @@ -/* $NetBSD: mdreloc.c,v 1.13.2.1 2023/08/04 12:55:46 martin Exp $ */ +/* $NetBSD: mdreloc.c,v 1.13.2.2 2024/08/07 10:45:41 martin Exp $ */ /*- * Copyright (c) 2014 The NetBSD Foundation, Inc. @@ -60,7 +60,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.13.2.1 2023/08/04 12:55:46 martin Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.13.2.2 2024/08/07 10:45:41 martin Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -296,8 +296,9 @@ _rtld_relocate_nonplt_objects(Obj_Entry _rtld_tls_offset_allocate(__UNCONST(defobj))) return -1; - *where = (Elf_Addr)def->st_value + defobj->tlsoffset + - sizeof(struct tls_tcb); + *where = (Elf_Addr)(def->st_value + defobj->tlsoffset + + rela->r_addend + sizeof(struct tls_tcb)); + rdbg(("TLS_TPREL %s in %s --> %p in %s", obj->strtab + obj->symtab[symnum].st_name, obj->path, (void *)*where, defobj->path)); Index: src/libexec/ld.elf_so/arch/arm/mdreloc.c diff -u src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.44.4.1 src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.44.4.2 --- src/libexec/ld.elf_so/arch/arm/mdreloc.c:1.44.4.1 Fri Aug 4 12:55:46 2023 +++ src/libexec/ld.elf_so/arch/arm/mdreloc.c Wed Aug 7 10:45:41 2024 @@ -1,8 +1,8 @@ -/* $NetBSD: mdreloc.c,v 1.44.4.1 2023/08/04 12:55:46 martin Exp $ */ +/* $NetBSD: mdreloc.c,v 1.44.4.2 2024/08/07 10:45:41 martin Exp $ */ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: mdreloc.c,v 1.44.4.1 2023/08/04 12:55:46 martin Exp $"); +__RCSID("$NetBSD: mdreloc.c,v 1.44.4.2 2024/08/07 10:45:41 martin Exp $"); #endif /* not lint */ #include <sys/types.h> @@ -232,8 +232,11 @@ _rtld_relocate_nonplt_objects(Obj_Entry _rtld_tls_offset_allocate(__UNCONST(defobj))) return -1; - tmp = (Elf_Addr)def->st_value + defobj->tlsoffset + - sizeof(struct tls_tcb); + if (__predict_true(RELOC_ALIGNED_P(where))) + tmp = *where; + else + tmp = load_ptr(where); + tmp += (Elf_Addr)def->st_value + defobj->tlsoffset + sizeof(struct tls_tcb); if (__predict_true(RELOC_ALIGNED_P(where))) *where = tmp; else