This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] ld.so: Adjust the auxv if ld.so is directly invoked


Hello!

On Fri, Mar 26, 2010 at 02:55:23PM -0700, Ulrich Drepper wrote:
> On 03/26/2010 12:15 PM, Thomas Schwinge wrote:
> > Would the glibc maintainers rather have me send a patch (a) for
> > conditionalizing all auxv code on that conditional, or (b) have the
> > generic code cope with auxv == NULL?
> 
> Nothing which has runtime overhead on Linux is acceptable.  If this can
> be achieved using macros it's likely a bit better.

Here is a patch; a most pragmatic one, taking into account that we might
decide to also support auxvs on the Hurd in the future.

Reaction to 3a56ea26730755076cb5bc1d07727c7a4fcb8fd7.


Conditionalize auxv code; Hurd auxv changes.

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].

 elf/rtld.c                    |    4 ++++
 sysdeps/mach/hurd/dl-sysdep.c |    8 ++++----
 2 files changed, 8 insertions(+), 4 deletions(-)

diff --git a/elf/rtld.c b/elf/rtld.c
index 3afb997..b1899f6 100644
--- a/elf/rtld.c
+++ b/elf/rtld.c
@@ -928,7 +928,9 @@ dl_main (const ElfW(Phdr) *phdr,
 
   if (*user_entry == (ElfW(Addr)) ENTRY_POINT)
     {
+#ifdef HAVE_AUX_VECTOR
       ElfW(auxv_t) *av;
+#endif
 
       /* Ho ho.  We are not the program interpreter!  We are the program
 	 itself!  This means someone ran ld.so as a command.  Well, that
@@ -1086,6 +1088,7 @@ 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++)
@@ -1101,6 +1104,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
     {
diff --git a/sysdeps/mach/hurd/dl-sysdep.c b/sysdeps/mach/hurd/dl-sysdep.c
index 2440682..40323a9 100644
--- a/sysdeps/mach/hurd/dl-sysdep.c
+++ b/sysdeps/mach/hurd/dl-sysdep.c
@@ -1,6 +1,6 @@
 /* Operating system support for run-time dynamic linker.  Hurd version.
-   Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004
-	Free Software Foundation, Inc.
+   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.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -116,7 +116,7 @@ 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 +197,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, NULL);
 
       /* The call above might screw a few things up.
 
-- 
tg: (62f8db6..) t/ld.so_auxv (depends on: baseline)


Regards,
 Thomas

Attachment: signature.asc
Description: Digital signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]