summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormarius <marius@FreeBSD.org>2018-03-19 14:28:20 +0000
committermarius <marius@FreeBSD.org>2018-03-19 14:28:20 +0000
commit35dbea261605689205c7149653272d683a8de94f (patch)
treef2af434c0f4ca3bb03c19babf2b909c230fc93d5
parent0f44f2404bebf6380b7b8345f7882e948c7db454 (diff)
downloadFreeBSD-src-35dbea261605689205c7149653272d683a8de94f.zip
FreeBSD-src-35dbea261605689205c7149653272d683a8de94f.tar.gz
MFC: r328834
o Let rtld(1) set up psABI user trap handlers prior to executing the objects' init functions instead of doing the setup via a constructor in libc as the init functions may already depend on these handlers to be in place. This gets us rid of: - the undefined order in which libc constructors as __guard_setup() and jemalloc_constructor() are executed WRT __sparc_utrap_setup(), - the requirement to link libc last so __sparc_utrap_setup() gets called prior to constructors in other libraries (see r122883). For static binaries, crt1.o still sets up the user trap handlers. o Move misplaced prototypes for MD functions in to the MD prototype section of rtld.h. o Sprinkle nitems().
-rw-r--r--lib/libc/sparc64/sys/__sparc_utrap_setup.c8
-rw-r--r--libexec/rtld-elf/aarch64/reloc.c7
-rw-r--r--libexec/rtld-elf/amd64/reloc.c6
-rw-r--r--libexec/rtld-elf/arm/reloc.c7
-rw-r--r--libexec/rtld-elf/i386/reloc.c6
-rw-r--r--libexec/rtld-elf/mips/reloc.c7
-rw-r--r--libexec/rtld-elf/powerpc/reloc.c7
-rw-r--r--libexec/rtld-elf/powerpc64/reloc.c7
-rw-r--r--libexec/rtld-elf/riscv/reloc.c7
-rw-r--r--libexec/rtld-elf/rtld.c6
-rw-r--r--libexec/rtld-elf/rtld.h5
-rw-r--r--libexec/rtld-elf/sparc64/reloc.c14
12 files changed, 78 insertions, 9 deletions
diff --git a/lib/libc/sparc64/sys/__sparc_utrap_setup.c b/lib/libc/sparc64/sys/__sparc_utrap_setup.c
index a4c70b2..6bdb4ba 100644
--- a/lib/libc/sparc64/sys/__sparc_utrap_setup.c
+++ b/lib/libc/sparc64/sys/__sparc_utrap_setup.c
@@ -29,13 +29,11 @@
#include <sys/cdefs.h>
__FBSDID("$FreeBSD$");
-#include <sys/types.h>
+#include <sys/param.h>
#include <machine/utrap.h>
#include <machine/sysarch.h>
-#include <stdlib.h>
-
#include "__sparc_utrap_private.h"
static const struct sparc_utrap_args ua[] = {
@@ -47,10 +45,10 @@ static const struct sparc_utrap_args ua[] = {
};
static const struct sparc_utrap_install_args uia[] = {
- { sizeof (ua) / sizeof (*ua), ua }
+ { nitems(ua), ua }
};
-void __sparc_utrap_setup(void) __attribute__((constructor));
+void __sparc_utrap_setup(void);
void
__sparc_utrap_setup(void)
diff --git a/libexec/rtld-elf/aarch64/reloc.c b/libexec/rtld-elf/aarch64/reloc.c
index c298195..2ca13d8 100644
--- a/libexec/rtld-elf/aarch64/reloc.c
+++ b/libexec/rtld-elf/aarch64/reloc.c
@@ -306,6 +306,13 @@ reloc_jmpslot(Elf_Addr *where, Elf_Addr target, const Obj_Entry *defobj,
void
ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused)
{
+
+}
+
+void
+pre_init(void)
+{
+
}
/*
diff --git a/libexec/rtld-elf/amd64/reloc.c b/libexec/rtld-elf/amd64/reloc.c
index 47d9522..59f62b8 100644
--- a/libexec/rtld-elf/amd64/reloc.c
+++ b/libexec/rtld-elf/amd64/reloc.c
@@ -485,6 +485,12 @@ ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused)
}
void
+pre_init(void)
+{
+
+}
+
+void
allocate_initial_tls(Obj_Entry *objs)
{
/*
diff --git a/libexec/rtld-elf/arm/reloc.c b/libexec/rtld-elf/arm/reloc.c
index c1d50c0..c34c953 100644
--- a/libexec/rtld-elf/arm/reloc.c
+++ b/libexec/rtld-elf/arm/reloc.c
@@ -481,6 +481,13 @@ reloc_jmpslot(Elf_Addr *where, Elf_Addr target, const Obj_Entry *defobj,
void
ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused)
{
+
+}
+
+void
+pre_init(void)
+{
+
}
void
diff --git a/libexec/rtld-elf/i386/reloc.c b/libexec/rtld-elf/i386/reloc.c
index e97121b..7d68db1 100644
--- a/libexec/rtld-elf/i386/reloc.c
+++ b/libexec/rtld-elf/i386/reloc.c
@@ -471,6 +471,12 @@ ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused)
}
void
+pre_init(void)
+{
+
+}
+
+void
allocate_initial_tls(Obj_Entry *objs)
{
void* tls;
diff --git a/libexec/rtld-elf/mips/reloc.c b/libexec/rtld-elf/mips/reloc.c
index 5dc5c79..a60e010 100644
--- a/libexec/rtld-elf/mips/reloc.c
+++ b/libexec/rtld-elf/mips/reloc.c
@@ -628,6 +628,13 @@ reloc_jmpslot(Elf_Addr *where, Elf_Addr target, const Obj_Entry *defobj,
void
ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused)
{
+
+}
+
+void
+pre_init(void)
+{
+
}
void
diff --git a/libexec/rtld-elf/powerpc/reloc.c b/libexec/rtld-elf/powerpc/reloc.c
index 8d4f87c..658bd92 100644
--- a/libexec/rtld-elf/powerpc/reloc.c
+++ b/libexec/rtld-elf/powerpc/reloc.c
@@ -626,6 +626,13 @@ init_pltgot(Obj_Entry *obj)
void
ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused)
{
+
+}
+
+void
+pre_init(void)
+{
+
}
void
diff --git a/libexec/rtld-elf/powerpc64/reloc.c b/libexec/rtld-elf/powerpc64/reloc.c
index eca489d..07cef1c 100644
--- a/libexec/rtld-elf/powerpc64/reloc.c
+++ b/libexec/rtld-elf/powerpc64/reloc.c
@@ -531,6 +531,13 @@ init_pltgot(Obj_Entry *obj)
void
ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused)
{
+
+}
+
+void
+pre_init(void)
+{
+
}
void
diff --git a/libexec/rtld-elf/riscv/reloc.c b/libexec/rtld-elf/riscv/reloc.c
index a0fedf1..d08f1ac 100644
--- a/libexec/rtld-elf/riscv/reloc.c
+++ b/libexec/rtld-elf/riscv/reloc.c
@@ -368,6 +368,13 @@ reloc_non_plt(Obj_Entry *obj, Obj_Entry *obj_rtld, int flags,
void
ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused)
{
+
+}
+
+void
+pre_init(void)
+{
+
}
void
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index 3d90c91..fba45bd 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -753,6 +753,12 @@ _rtld(Elf_Addr *sp, func_ptr_type *exit_proc, Obj_Entry **objp)
obj_main->fini_array = (Elf_Addr)NULL;
}
+ /*
+ * Execute MD initializers required before we call the objects'
+ * init functions.
+ */
+ pre_init();
+
wlock_acquire(rtld_bind_lock, &lockstate);
if (obj_main->crt_no_init)
preinit_main();
diff --git a/libexec/rtld-elf/rtld.h b/libexec/rtld-elf/rtld.h
index 19fb8fc..196f451 100644
--- a/libexec/rtld-elf/rtld.h
+++ b/libexec/rtld-elf/rtld.h
@@ -371,8 +371,6 @@ void dump_Elf_Rela(Obj_Entry *, const Elf_Rela *, u_long);
unsigned long elf_hash(const char *);
const Elf_Sym *find_symdef(unsigned long, const Obj_Entry *,
const Obj_Entry **, int, SymCache *, struct Struct_RtldLockState *);
-void ifunc_init(Elf_Auxinfo[__min_size(AT_COUNT)]);
-void init_pltgot(Obj_Entry *);
void lockdflt_init(void);
void digest_notes(Obj_Entry *, Elf_Addr, Elf_Addr);
Obj_Entry *globallist_curr(const Obj_Entry *obj);
@@ -402,6 +400,9 @@ int reloc_plt(Obj_Entry *);
int reloc_jmpslots(Obj_Entry *, int flags, struct Struct_RtldLockState *);
int reloc_iresolve(Obj_Entry *, struct Struct_RtldLockState *);
int reloc_gnu_ifunc(Obj_Entry *, int flags, struct Struct_RtldLockState *);
+void ifunc_init(Elf_Auxinfo[__min_size(AT_COUNT)]);
+void pre_init(void);
+void init_pltgot(Obj_Entry *);
void allocate_initial_tls(Obj_Entry *);
#endif /* } */
diff --git a/libexec/rtld-elf/sparc64/reloc.c b/libexec/rtld-elf/sparc64/reloc.c
index 108af80..906f237 100644
--- a/libexec/rtld-elf/sparc64/reloc.c
+++ b/libexec/rtld-elf/sparc64/reloc.c
@@ -365,8 +365,7 @@ reloc_nonplt_object(Obj_Entry *obj, const Elf_Rela *rela, SymCache *cache,
* Note: R_SPARC_TLS_TPOFF64 must be the numerically largest
* relocation type.
*/
- if (type >= sizeof(reloc_target_bitmask) /
- sizeof(*reloc_target_bitmask)) {
+ if (type >= nitems(reloc_target_bitmask)) {
_rtld_error("%s: Unsupported relocation type %d in non-PLT "
"object\n", obj->path, type);
return (-1);
@@ -791,6 +790,16 @@ reloc_jmpslot(Elf_Addr *wherep, Elf_Addr target, const Obj_Entry *obj,
void
ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused)
{
+
+}
+
+extern void __sparc_utrap_setup(void);
+
+void
+pre_init(void)
+{
+
+ __sparc_utrap_setup();
}
/*
@@ -821,6 +830,7 @@ init_pltgot(Obj_Entry *obj)
static void
install_plt(Elf_Word *pltgot, Elf_Addr proc)
{
+
pltgot[0] = SAVE;
flush(pltgot, 0);
pltgot[1] = SETHI_l0 | HIVAL(proc, 42);
OpenPOWER on IntegriCloud