summaryrefslogtreecommitdiff
path: root/libexec
diff options
context:
space:
mode:
authorjoerg <joerg@NetBSD.org>2012-02-16 23:00:38 +0000
committerjoerg <joerg@NetBSD.org>2012-02-16 23:00:38 +0000
commit42222af804c5efe6af85ec73b50622960bc54841 (patch)
treefdcb50cbf2cd06c17fa8cb1ce4b73ff793c5c498 /libexec
parente20d694f96d4601ab264358459d52f7dbb38a65b (diff)
Add _dlauxinfo helper function to provide access to the ELF auxilary
vector. This can normally be found via __ps_strings, but libc is initialised too early when linked dynamically and doesn't have access to it yet, so provide an alternative mechanism via ld.elf_so. Bump libc minor.
Diffstat (limited to 'libexec')
-rw-r--r--libexec/ld.elf_so/rtld.c16
-rw-r--r--libexec/ld.elf_so/rtld.h4
-rw-r--r--libexec/ld.elf_so/symbol.c5
3 files changed, 17 insertions, 8 deletions
diff --git a/libexec/ld.elf_so/rtld.c b/libexec/ld.elf_so/rtld.c
index 1418cb99743..6d58dc80adc 100644
--- a/libexec/ld.elf_so/rtld.c
+++ b/libexec/ld.elf_so/rtld.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rtld.c,v 1.155 2011/11/25 21:27:15 joerg Exp $ */
+/* $NetBSD: rtld.c,v 1.156 2012/02/16 23:00:39 joerg Exp $ */
/*
* Copyright 1996 John D. Polstra.
@@ -40,7 +40,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: rtld.c,v 1.155 2011/11/25 21:27:15 joerg Exp $");
+__RCSID("$NetBSD: rtld.c,v 1.156 2012/02/16 23:00:39 joerg Exp $");
#endif /* not lint */
#include <sys/param.h>
@@ -103,6 +103,7 @@ Search_Path *_rtld_default_paths;
Search_Path *_rtld_paths;
Library_Xform *_rtld_xforms;
+static void *auxinfo;
/*
* Global declarations normally provided by crt0.
@@ -349,6 +350,12 @@ _rtld_exit(void)
_rtld_exclusive_exit(&mask);
}
+__dso_public void *
+_dlauxinfo(void)
+{
+ return auxinfo;
+}
+
/*
* Main entry point for dynamic linking. The argument is the stack
* pointer. The stack is expected to be laid out as described in the
@@ -371,7 +378,6 @@ _rtld(Elf_Addr *sp, Elf_Addr relocbase)
*pAUX_ruid, *pAUX_rgid;
const AuxInfo *pAUX_pagesz;
char **env, **oenvp;
- const AuxInfo *aux;
const AuxInfo *auxp;
Obj_Entry *obj;
Elf_Addr *const osp = sp;
@@ -421,7 +427,7 @@ _rtld(Elf_Addr *sp, Elf_Addr relocbase)
dbg(("env[%d] = %p %s", i++, (void *)sp[-1], (char *)sp[-1]));
#endif
}
- aux = (const AuxInfo *) sp;
+ auxinfo = (AuxInfo *) sp;
pAUX_base = pAUX_entry = pAUX_execfd = NULL;
pAUX_phdr = pAUX_phent = pAUX_phnum = NULL;
@@ -431,7 +437,7 @@ _rtld(Elf_Addr *sp, Elf_Addr relocbase)
execname = NULL;
/* Digest the auxiliary vector. */
- for (auxp = aux; auxp->a_type != AT_NULL; ++auxp) {
+ for (auxp = auxinfo; auxp->a_type != AT_NULL; ++auxp) {
switch (auxp->a_type) {
case AT_BASE:
pAUX_base = auxp;
diff --git a/libexec/ld.elf_so/rtld.h b/libexec/ld.elf_so/rtld.h
index f7f54b13c5f..22ac7ef6ff1 100644
--- a/libexec/ld.elf_so/rtld.h
+++ b/libexec/ld.elf_so/rtld.h
@@ -1,4 +1,4 @@
-/* $NetBSD: rtld.h,v 1.107 2011/12/02 09:06:49 skrll Exp $ */
+/* $NetBSD: rtld.h,v 1.108 2012/02/16 23:00:39 joerg Exp $ */
/*
* Copyright 1996 John D. Polstra.
@@ -331,6 +331,8 @@ __dso_public int dlinfo(void *, int, void *);
__dso_public int dl_iterate_phdr(int (*)(struct dl_phdr_info *, size_t, void *),
void *);
+__dso_public void *_dlauxinfo(void) __pure;
+
/* These aren't exported */
void _rtld_error(const char *, ...)
__attribute__((__format__(__printf__,1,2)));
diff --git a/libexec/ld.elf_so/symbol.c b/libexec/ld.elf_so/symbol.c
index d548d2463ff..a46efd9c2f4 100644
--- a/libexec/ld.elf_so/symbol.c
+++ b/libexec/ld.elf_so/symbol.c
@@ -1,4 +1,4 @@
-/* $NetBSD: symbol.c,v 1.59 2011/11/25 14:39:02 joerg Exp $ */
+/* $NetBSD: symbol.c,v 1.60 2012/02/16 23:00:39 joerg Exp $ */
/*
* Copyright 1996 John D. Polstra.
@@ -40,7 +40,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: symbol.c,v 1.59 2011/11/25 14:39:02 joerg Exp $");
+__RCSID("$NetBSD: symbol.c,v 1.60 2012/02/16 23:00:39 joerg Exp $");
#endif /* not lint */
#include <err.h>
@@ -94,6 +94,7 @@ _rtld_is_exported(const Elf_Sym *def)
(fptr_t)dladdr,
(fptr_t)dlinfo,
(fptr_t)dl_iterate_phdr,
+ (fptr_t)_dlauxinfo,
#if defined(__HAVE_TLS_VARIANT_I) || defined(__HAVE_TLS_VARIANT_II)
(fptr_t)_rtld_tls_allocate,
(fptr_t)_rtld_tls_free,