Handle platforms without aux vector

This commit is contained in:
Thomas Schwinge 2010-03-29 15:13:53 -07:00 committed by Ulrich Drepper
parent 8f4a5048ee
commit bc58236c65
3 changed files with 14 additions and 6 deletions

View file

@ -1,3 +1,10 @@
2010-03-28 Thomas Schwinge <thomas@schwinge.name>
* sysdeps/mach/hurd/dl-sysdep.c (_dl_sysdep_start): Adapt to auxv
changes in the generic code.
* elf/rtld.c (dl_main): Conditionalize the code that dereferences auxv
to [HAVE_AUX_VECTOR].
2010-03-27 Ulrich Drepper <drepper@redhat.com>
* sysdeps/unix/sysv/linux/getpagesize.c (__getpagesize): If

View file

@ -928,8 +928,6 @@ dl_main (const ElfW(Phdr) *phdr,
if (*user_entry == (ElfW(Addr)) ENTRY_POINT)
{
ElfW(auxv_t) *av;
/* Ho ho. We are not the program interpreter! We are the program
itself! This means someone ran ld.so as a command. Well, that
might be convenient to do sometimes. We support it by
@ -1086,9 +1084,10 @@ of this helper program; chances are you did not intend to run this program.\n\
main_map->l_name = (char *) "";
*user_entry = main_map->l_entry;
#ifdef HAVE_AUX_VECTOR
/* Adjust the on-stack auxiliary vector so that it looks like the
binary was executed directly. */
for (av = auxv; av->a_type != AT_NULL; av++)
for (ElfW(auxv_t) *av = auxv; av->a_type != AT_NULL; av++)
switch (av->a_type)
{
case AT_PHDR:
@ -1101,6 +1100,7 @@ of this helper program; chances are you did not intend to run this program.\n\
av->a_un.a_val = *user_entry;
break;
}
#endif
}
else
{

View file

@ -1,5 +1,5 @@
/* Operating system support for run-time dynamic linker. Hurd version.
Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004
Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2010
Free Software Foundation, Inc.
This file is part of the GNU C Library.
@ -116,7 +116,8 @@ static void fmh(void) {
ElfW(Addr)
_dl_sysdep_start (void **start_argptr,
void (*dl_main) (const ElfW(Phdr) *phdr, ElfW(Word) phent,
ElfW(Addr) *user_entry))
ElfW(Addr) *user_entry,
ElfW(auxv_t) *auxv)))
{
void go (intptr_t *argdata)
{
@ -197,7 +198,7 @@ unfmh(); /* XXX */
up and leave us to transfer control to USER_ENTRY. */
(*dl_main) ((const ElfW(Phdr) *) _dl_hurd_data->phdr,
_dl_hurd_data->phdrsz / sizeof (ElfW(Phdr)),
&_dl_hurd_data->user_entry);
&_dl_hurd_data->user_entry, NULLy);
/* The call above might screw a few things up.