On Mon, 22 Aug 2016, Mark Kettenis wrote:
...
> +void
> +_dl_run_dtors(elf_object_t *obj)
> +{
> + if (obj->dyn.fini_array) {
> + int num = obj->dyn.fini_arraysz / sizeof(Elf_Addr);
> + int i;
> +
> + DL_DEB(("doing finiarray obj %p @%p: [%s]\n",
> + obj, obj->dyn.fini, obj->load_name));
That should be
obj, obj->dyn.fini_array, obj->load_name));
> --- libexec/ld.so/resolve.h 8 Aug 2016 21:59:20 -0000 1.79
> +++ libexec/ld.so/resolve.h 22 Aug 2016 21:32:31 -0000
> @@ -81,13 +81,23 @@ struct elf_object {
> const char *soname;
> const char *rpath;
> Elf_Addr symbolic;
> - Elf_Rel *rel;
> + Elf_Rel *rel;
> Elf_Addr relsz;
> Elf_Addr relent;
> Elf_Addr pltrel;
> Elf_Addr debug;
> Elf_Addr textrel;
> Elf_Addr jmprel;
> + Elf_Addr bind_now;
> + void (**init_array)(void);
> + void (**fini_array)(void);
> + Elf_Addr init_arraysz;
> + Elf_Addr fini_arraysz;
> + const char *runpath;
> + Elf_Addr flags;
> + Elf_Addr encoding;
> + void (**preinit_array)(void);
> + Elf_Addr preinit_arraysz;
> } u;
> } Dyn;
This part is wrong and may explode into flames on m88k and
mips64...because you must increase DT_NUM to match the growth in the Dyn.u
struct or else the arch-specific DT_* tags starting at DT_LOPROC will
overlay it starting at the new members! (mips64 and m88k are the only
archs with DT_PROCNUM large enough to overlay the new bits.)
Right now, DT_NUM is defined in <sys/exec_elf.h>, but that's dumb: it
should be moved immediately to libexec/ld.so/resolv.h, right above this
struct, and its value increased to match the growth here. I killed it's
use in lib/csu for this, so don't hesitate in pulling it over.
Otherwise the diff looks good to me.
...and maybe once this is in I should resurrect my diff to change the rest
of ld.so like I did boot.c: eliminate the union of struct+array and cache
just the tags we care about, because it's wasteful and a horrid trap.
Philip