From e4a5f77de683578d85fe7621ebdaee76dd3df89c Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Sun, 7 Jan 2001 02:00:21 +0000 Subject: [PATCH] Update. 2001-01-05 H.J. Lu * elf/dl-support.c (non_dynamic_init): Move the auxiliary vector checking to ... (_dl_aux_init): Here. New function. Defined only if HAVE_AUX_VECTOR is defined. * sysdeps/generic/libc-start.c (__libc_start_main): Call _dl_aux_init for static binaries if HAVE_AUX_VECTOR is defined. * sysdeps/powerpc/elf/libc-start.c (__libc_start_main): Call _dl_aux_init. * sysdeps/unix/sysv/linux/ldsodefs.h (DL_FIND_AUXV): Removed. (HAVE_AUX_VECTOR): Defined. (_dl_aux_init): Declared. --- ChangeLog | 17 +++++++++++++++++ elf/dl-support.c | 23 ++++++++++------------- manual/string.texi | 2 +- sysdeps/generic/libc-start.c | 11 +++++++++++ sysdeps/powerpc/elf/libc-start.c | 1 + sysdeps/unix/sysv/linux/ldsodefs.h | 15 +++++---------- 6 files changed, 45 insertions(+), 24 deletions(-) diff --git a/ChangeLog b/ChangeLog index 84f1fb127e..ebd6a3889f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,20 @@ +2001-01-05 H.J. Lu + + * elf/dl-support.c (non_dynamic_init): Move the auxiliary + vector checking to ... + (_dl_aux_init): Here. New function. Defined only if + HAVE_AUX_VECTOR is defined. + + * sysdeps/generic/libc-start.c (__libc_start_main): Call + _dl_aux_init for static binaries if HAVE_AUX_VECTOR is defined. + + * sysdeps/powerpc/elf/libc-start.c (__libc_start_main): Call + _dl_aux_init. + + * sysdeps/unix/sysv/linux/ldsodefs.h (DL_FIND_AUXV): Removed. + (HAVE_AUX_VECTOR): Defined. + (_dl_aux_init): Declared. + 2001-01-05 Ben Collins * manual/string.texi (Finding Tokens in a String): Document XPG diff --git a/elf/dl-support.c b/elf/dl-support.c index 05dcd05d5e..24f598c856 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -108,34 +108,31 @@ int _dl_starting_up = 1; __libc_lock_define_initialized_recursive (, _dl_load_lock) +#ifdef HAVE_AUX_VECTOR extern int _dl_clktck; -static void non_dynamic_init (int argc, char **argv, char **envp) - __attribute__ ((unused)); - -static void -non_dynamic_init (int argc, char **argv, char **envp) +void +internal_function +_dl_aux_init (ElfW(auxv_t) *av) { -#ifdef DL_FIND_AUXV - ElfW(auxv_t) *av; - - DL_FIND_AUXV (av, envp); - for (; av->a_type != AT_NULL; ++av) switch (av->a_type) { case AT_PAGESZ: _dl_pagesize = av->a_un.a_val; break; - case AT_PLATFORM: - _dl_platform = av->a_un.a_ptr; - break; case AT_CLKTCK: _dl_clktck = av->a_un.a_val; break; } +} #endif +static void non_dynamic_init (void) __attribute__ ((unused)); + +static void +non_dynamic_init (void) +{ if (!_dl_pagesize) _dl_pagesize = __getpagesize (); diff --git a/manual/string.texi b/manual/string.texi index aa87eecfba..e3c15d1dad 100644 --- a/manual/string.texi +++ b/manual/string.texi @@ -1464,7 +1464,7 @@ spirit to the GNU version, but may modify the @var{path} by removing trailing '/' characters. If the @var{path} is made up entirely of '/' characters, then "/" will be returned. Also, if @var{path} is @code{NULL} or an empty string, then "." is returned. The prototype for -the XPG version can be found in @file{string.h}. +the XPG version can be found in @file{libgen.h}. Example of using XPG @code{basename}: diff --git a/sysdeps/generic/libc-start.c b/sysdeps/generic/libc-start.c index c4b8bc6809..fa394b45f2 100644 --- a/sysdeps/generic/libc-start.c +++ b/sysdeps/generic/libc-start.c @@ -59,6 +59,10 @@ BP_SYM (__libc_start_main) (int (*main) (int, char **, char **), #endif #ifndef SHARED +# ifdef HAVE_AUX_VECTOR + void *__unbounded *__unbounded auxvec; +# endif + /* The next variable is only here to work around a bug in gcc <= 2.7.2.2. If the address would be taken inside the expression the optimizer would try to be too smart and throws it away. Grrr. */ @@ -85,6 +89,13 @@ BP_SYM (__libc_start_main) (int (*main) (int, char **, char **), loader did the work already. */ if (__builtin_expect (__libc_enable_secure, 0)) __libc_check_standard_fds (); + +# ifdef HAVE_AUX_VECTOR + for (auxvec = (void *__unbounded *__unbounded) ubp_ev; + *auxvec; auxvec++); + ++auxvec; + _dl_aux_init ((ElfW(auxv_t) *) auxvec); +# endif #endif /* Register the destructor of the dynamic linker if there is any. */ diff --git a/sysdeps/powerpc/elf/libc-start.c b/sysdeps/powerpc/elf/libc-start.c index 6a80bc7ee4..a05bda2219 100644 --- a/sysdeps/powerpc/elf/libc-start.c +++ b/sysdeps/powerpc/elf/libc-start.c @@ -76,6 +76,7 @@ BP_SYM (__libc_start_main) (int argc, char *__unbounded *__unbounded ubp_av, while (*(char *__unbounded *__unbounded) auxvec != NULL) ++auxvec; ++auxvec; + _dl_aux_init ((ElfW(auxv_t) *) auxvec); rtld_fini = NULL; } diff --git a/sysdeps/unix/sysv/linux/ldsodefs.h b/sysdeps/unix/sysv/linux/ldsodefs.h index d5ef2e2643..1bfe6c38af 100644 --- a/sysdeps/unix/sysv/linux/ldsodefs.h +++ b/sysdeps/unix/sysv/linux/ldsodefs.h @@ -24,15 +24,10 @@ /* Now define our stuff. */ -/* Locating the auxiliary vector. */ -#ifndef DL_FIND_AUXV -# define DL_FIND_AUXV(auxp, envp) \ - do { \ - void **_tmp; \ - for (_tmp = (void **) (envp); *_tmp; ++_tmp) \ - continue; \ - (auxp) = (void *) ++_tmp; \ - } while (0) -#endif +/* We have the auxiliary vector. */ +#define HAVE_AUX_VECTOR + +/* Used by static binaries to check the auxiliary vector. */ +extern void _dl_aux_init (ElfW(auxv_t) *av) internal_function; #endif /* ldsodefs.h */