diff options
| author | skrll <skrll@NetBSD.org> | 2013-11-20 07:18:23 +0000 |
|---|---|---|
| committer | skrll <skrll@NetBSD.org> | 2013-11-20 07:18:23 +0000 |
| commit | 48950f0fa23a3d2c138f16d817fdc088d5076bda (patch) | |
| tree | dbb6b954bf67994626464fd8b7f94a612f84217f /libexec | |
| parent | 7d96d46f18c41576efb32b38de56a257c0235f99 (diff) | |
If dlopen of the dynamic linker is requested, e.g. by rump in
rumpuser_dl_bootstrap, then return &_rtld_objself as the handle and do
not create a duplicate mapping.
The handle is mostly useless as _rtld_objself doesn't appear on
_rtld_objlist.
This fixes a problem on earm platforms where ld.elf_so (currently) has
an init_array section. Calling this caused binaries to segv.
Diffstat (limited to 'libexec')
| -rw-r--r-- | libexec/ld.elf_so/load.c | 11 | ||||
| -rw-r--r-- | libexec/ld.elf_so/rtld.c | 8 |
2 files changed, 14 insertions, 5 deletions
diff --git a/libexec/ld.elf_so/load.c b/libexec/ld.elf_so/load.c index 4b8d377c05c..825660f3690 100644 --- a/libexec/ld.elf_so/load.c +++ b/libexec/ld.elf_so/load.c @@ -1,4 +1,4 @@ -/* $NetBSD: load.c,v 1.45 2013/05/09 15:37:58 christos Exp $ */ +/* $NetBSD: load.c,v 1.46 2013/11/20 07:18:23 skrll Exp $ */ /* * Copyright 1996 John D. Polstra. @@ -40,7 +40,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: load.c,v 1.45 2013/05/09 15:37:58 christos Exp $"); +__RCSID("$NetBSD: load.c,v 1.46 2013/11/20 07:18:23 skrll Exp $"); #endif /* not lint */ #include <err.h> @@ -146,6 +146,13 @@ _rtld_load_object(const char *filepath, int flags) } } +#ifdef RTLD_LOADER + if (pathlen == _rtld_objself.pathlen && + strcmp(_rtld_objself.path, filepath) == 0) { + return &_rtld_objself; + } +#endif + if (obj == NULL) { /* First use of this object, so we must map it in */ obj = _rtld_map_object(filepath, fd, &sb); (void)close(fd); diff --git a/libexec/ld.elf_so/rtld.c b/libexec/ld.elf_so/rtld.c index af8feeb84a2..b6c0802987d 100644 --- a/libexec/ld.elf_so/rtld.c +++ b/libexec/ld.elf_so/rtld.c @@ -1,4 +1,4 @@ -/* $NetBSD: rtld.c,v 1.170 2013/10/19 17:19:30 christos Exp $ */ +/* $NetBSD: rtld.c,v 1.171 2013/11/20 07:18:23 skrll Exp $ */ /* * Copyright 1996 John D. Polstra. @@ -40,7 +40,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: rtld.c,v 1.170 2013/10/19 17:19:30 christos Exp $"); +__RCSID("$NetBSD: rtld.c,v 1.171 2013/11/20 07:18:23 skrll Exp $"); #endif /* not lint */ #include <sys/param.h> @@ -636,8 +636,10 @@ _rtld(Elf_Addr *sp, Elf_Addr relocbase) * one is being used. */ if (_rtld_objmain->interp != NULL && - strcmp(_rtld_objmain->interp, _rtld_objself.path) != 0) + strcmp(_rtld_objmain->interp, _rtld_objself.path) != 0) { _rtld_objself.path = xstrdup(_rtld_objmain->interp); + _rtld_objself.pathlen = strlen(_rtld_objself.path); + } dbg(("actual dynamic linker is %s", _rtld_objself.path)); _rtld_digest_dynamic(execname, _rtld_objmain); |
