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().
This commit is contained in:
parent
9a0e2e232b
commit
41fc6f680b
@ -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)
|
||||
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -486,6 +486,12 @@ ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
pre_init(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
allocate_initial_tls(Obj_Entry *objs)
|
||||
{
|
||||
|
@ -478,6 +478,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
|
||||
|
@ -472,6 +472,12 @@ ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
pre_init(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
allocate_initial_tls(Obj_Entry *objs)
|
||||
{
|
||||
|
@ -745,6 +745,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
|
||||
|
@ -628,6 +628,13 @@ init_pltgot(Obj_Entry *obj)
|
||||
void
|
||||
ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
pre_init(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -533,6 +533,13 @@ init_pltgot(Obj_Entry *obj)
|
||||
void
|
||||
ifunc_init(Elf_Auxinfo aux_info[__min_size(AT_COUNT)] __unused)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
pre_init(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -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
|
||||
|
@ -755,6 +755,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();
|
||||
|
@ -374,8 +374,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);
|
||||
@ -405,6 +403,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 /* } */
|
||||
|
@ -367,8 +367,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);
|
||||
@ -793,6 +792,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();
|
||||
}
|
||||
|
||||
/*
|
||||
@ -823,6 +832,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);
|
||||
|
Loading…
Reference in New Issue
Block a user