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);

Reply via email to