Module Name: src Committed By: skrll Date: Mon May 30 17:06:34 UTC 2022
Modified Files: src/libexec/ld.elf_so/arch/hppa: hppa_reloc.c rtld_start.S Log Message: Set DP early so that any binary functions that override others get the right value if they're called before _start. This is true of bash where it provides its own getenv. Part of port-hppa/56118: sporadic app crashes in HPPA -current To generate a diff of this commit: cvs rdiff -u -r1.48 -r1.49 src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c cvs rdiff -u -r1.13 -r1.14 src/libexec/ld.elf_so/arch/hppa/rtld_start.S 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/hppa/hppa_reloc.c diff -u src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c:1.48 src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c:1.49 --- src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c:1.48 Sat Dec 4 14:39:08 2021 +++ src/libexec/ld.elf_so/arch/hppa/hppa_reloc.c Mon May 30 17:06:34 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: hppa_reloc.c,v 1.48 2021/12/04 14:39:08 skrll Exp $ */ +/* $NetBSD: hppa_reloc.c,v 1.49 2022/05/30 17:06:34 skrll Exp $ */ /*- * Copyright (c) 2002, 2004 The NetBSD Foundation, Inc. @@ -31,7 +31,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: hppa_reloc.c,v 1.48 2021/12/04 14:39:08 skrll Exp $"); +__RCSID("$NetBSD: hppa_reloc.c,v 1.49 2022/05/30 17:06:34 skrll Exp $"); #endif /* not lint */ #include <stdlib.h> @@ -52,6 +52,7 @@ __RCSID("$NetBSD: hppa_reloc.c,v 1.48 20 caddr_t _rtld_bind(const Obj_Entry *, const Elf_Addr); void _rtld_bind_start(void); void __rtld_setup_hppa_pltgot(const Obj_Entry *, Elf_Addr *); +void _rtld_set_dp(Elf_Addr *); /* * It is possible for the compiler to emit relocations for unaligned data. @@ -417,6 +418,16 @@ _rtld_relocate_nonplt_objects(Obj_Entry const Obj_Entry *defobj = NULL; unsigned long last_symnum = ULONG_MAX; + /* + * This will be done by the crt0 code, but make sure it's set + * early so that symbols overridden by the non-pic binary + * get the right DP value. + */ + if (obj->mainprog) { + hdbg(("setting DP to %p", obj->pltgot)); + _rtld_set_dp(obj->pltgot); + } + for (rela = obj->rela; rela < obj->relalim; rela++) { Elf_Addr *where; Elf_Addr tmp; Index: src/libexec/ld.elf_so/arch/hppa/rtld_start.S diff -u src/libexec/ld.elf_so/arch/hppa/rtld_start.S:1.13 src/libexec/ld.elf_so/arch/hppa/rtld_start.S:1.14 --- src/libexec/ld.elf_so/arch/hppa/rtld_start.S:1.13 Sun May 10 06:42:38 2020 +++ src/libexec/ld.elf_so/arch/hppa/rtld_start.S Mon May 30 17:06:34 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: rtld_start.S,v 1.13 2020/05/10 06:42:38 skrll Exp $ */ +/* $NetBSD: rtld_start.S,v 1.14 2022/05/30 17:06:34 skrll Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -231,3 +231,9 @@ ENTRY(_rtld_bind_start,HPPA_FRAME_SIZE) bv %r0(%r21) nop EXIT(_rtld_bind_start) + + +LEAF_ENTRY_NOPROFILE(_rtld_set_dp) + bv %r0(%rp) + copy %arg0, %dp +EXIT(_rtld_set_dp)