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)