aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog17
-rw-r--r--elf/dl-support.c23
-rw-r--r--manual/string.texi2
-rw-r--r--sysdeps/generic/libc-start.c11
-rw-r--r--sysdeps/powerpc/elf/libc-start.c1
-rw-r--r--sysdeps/unix/sysv/linux/ldsodefs.h15
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 <hjl@gnu.org>
+
+ * 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 <bcollins@debian.org>
* 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 */