diff options
| author | joerg <joerg@NetBSD.org> | 2012-02-16 23:00:38 +0000 |
|---|---|---|
| committer | joerg <joerg@NetBSD.org> | 2012-02-16 23:00:38 +0000 |
| commit | 42222af804c5efe6af85ec73b50622960bc54841 (patch) | |
| tree | fdcb50cbf2cd06c17fa8cb1ce4b73ff793c5c498 /libexec | |
| parent | e20d694f96d4601ab264358459d52f7dbb38a65b (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.c | 16 | ||||
| -rw-r--r-- | libexec/ld.elf_so/rtld.h | 4 | ||||
| -rw-r--r-- | libexec/ld.elf_so/symbol.c | 5 |
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, |
