Module Name: src
Committed By: skrll
Date: Wed Nov 20 07:18:23 UTC 2013
Modified Files:
src/libexec/ld.elf_so: load.c rtld.c
Log Message:
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.
To generate a diff of this commit:
cvs rdiff -u -r1.45 -r1.46 src/libexec/ld.elf_so/load.c
cvs rdiff -u -r1.170 -r1.171 src/libexec/ld.elf_so/rtld.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/libexec/ld.elf_so/load.c
diff -u src/libexec/ld.elf_so/load.c:1.45 src/libexec/ld.elf_so/load.c:1.46
--- src/libexec/ld.elf_so/load.c:1.45 Thu May 9 15:37:58 2013
+++ src/libexec/ld.elf_so/load.c Wed Nov 20 07:18:23 2013
@@ -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,
}
}
+#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);
Index: src/libexec/ld.elf_so/rtld.c
diff -u src/libexec/ld.elf_so/rtld.c:1.170 src/libexec/ld.elf_so/rtld.c:1.171
--- src/libexec/ld.elf_so/rtld.c:1.170 Sat Oct 19 17:19:30 2013
+++ src/libexec/ld.elf_so/rtld.c Wed Nov 20 07:18:23 2013
@@ -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);