Module Name: src
Committed By: christos
Date: Mon May 6 19:59:30 UTC 2013
Modified Files:
src/libexec/ld.elf_so: headers.c load.c map_object.c rtld.c rtld.h
symver.c
Log Message:
Fixed handling of DT_SONAME:
- add function to add name aliases for shared libraries loaded
XXX[1]: we don't add a name during load time, only when DT_SONAME
is present.
- search already loaded objects in load_by_name for an already
loaded object that matches our name and return it.
- add missing initialization and cleanup for obj->names
XXX[2]: should we make them SIMPLEQ?
- Add XXX in rtld.c about getting the name of an object.
NB: This makes the jdk work again without resorting to a hack of putting
the build path of libjvm.so into the run path (which is a security
problem).
XXX: Pullup-6?
To generate a diff of this commit:
cvs rdiff -u -r1.50 -r1.51 src/libexec/ld.elf_so/headers.c
cvs rdiff -u -r1.43 -r1.44 src/libexec/ld.elf_so/load.c
cvs rdiff -u -r1.48 -r1.49 src/libexec/ld.elf_so/map_object.c
cvs rdiff -u -r1.165 -r1.166 src/libexec/ld.elf_so/rtld.c
cvs rdiff -u -r1.114 -r1.115 src/libexec/ld.elf_so/rtld.h
cvs rdiff -u -r1.1 -r1.2 src/libexec/ld.elf_so/symver.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/headers.c
diff -u src/libexec/ld.elf_so/headers.c:1.50 src/libexec/ld.elf_so/headers.c:1.51
--- src/libexec/ld.elf_so/headers.c:1.50 Mon May 6 04:02:20 2013
+++ src/libexec/ld.elf_so/headers.c Mon May 6 15:59:29 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: headers.c,v 1.50 2013/05/06 08:02:20 skrll Exp $ */
+/* $NetBSD: headers.c,v 1.51 2013/05/06 19:59:29 christos Exp $ */
/*
* Copyright 1996 John D. Polstra.
@@ -40,7 +40,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: headers.c,v 1.50 2013/05/06 08:02:20 skrll Exp $");
+__RCSID("$NetBSD: headers.c,v 1.51 2013/05/06 19:59:29 christos Exp $");
#endif /* not lint */
#include <err.h>
@@ -68,6 +68,7 @@ _rtld_digest_dynamic(const char *execnam
{
Elf_Dyn *dynp;
Needed_Entry **needed_tail = &obj->needed;
+ const Elf_Dyn *dyn_soname = NULL;
const Elf_Dyn *dyn_rpath = NULL;
bool use_pltrel = false;
bool use_pltrela = false;
@@ -222,7 +223,7 @@ _rtld_digest_dynamic(const char *execnam
break;
case DT_SONAME:
- /* Not used by the dynamic linker. */
+ dyn_soname = dynp;
break;
case DT_INIT:
@@ -358,6 +359,10 @@ _rtld_digest_dynamic(const char *execnam
_rtld_add_paths(execname, &obj->rpaths, obj->strtab +
dyn_rpath->d_un.d_val);
}
+ if (dyn_soname != NULL) {
+ _rtld_object_add_name(obj, obj->strtab +
+ dyn_soname->d_un.d_val);
+ }
}
/*
Index: src/libexec/ld.elf_so/load.c
diff -u src/libexec/ld.elf_so/load.c:1.43 src/libexec/ld.elf_so/load.c:1.44
--- src/libexec/ld.elf_so/load.c:1.43 Mon May 6 04:02:20 2013
+++ src/libexec/ld.elf_so/load.c Mon May 6 15:59:30 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: load.c,v 1.43 2013/05/06 08:02:20 skrll Exp $ */
+/* $NetBSD: load.c,v 1.44 2013/05/06 19:59:30 christos Exp $ */
/*
* Copyright 1996 John D. Polstra.
@@ -40,7 +40,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: load.c,v 1.43 2013/05/06 08:02:20 skrll Exp $");
+__RCSID("$NetBSD: load.c,v 1.44 2013/05/06 19:59:30 christos Exp $");
#endif /* not lint */
#include <err.h>
@@ -199,7 +199,7 @@ _rtld_load_by_name(const char *name, Obj
int flags)
{
Library_Xform *x = _rtld_xforms;
- Obj_Entry *o = NULL;
+ Obj_Entry *o;
size_t j;
ssize_t i;
bool got = false;
@@ -210,6 +210,12 @@ _rtld_load_by_name(const char *name, Obj
} val;
dbg(("load by name %s %p", name, x));
+ for (o = _rtld_objlist->next; o != NULL; o = o->next)
+ if (_rtld_object_match_name(o, name)) {
+ (*needed)->obj = o;
+ return true;
+ }
+
for (; x; x = x->next) {
if (strcmp(x->name, name) != 0)
continue;
Index: src/libexec/ld.elf_so/map_object.c
diff -u src/libexec/ld.elf_so/map_object.c:1.48 src/libexec/ld.elf_so/map_object.c:1.49
--- src/libexec/ld.elf_so/map_object.c:1.48 Mon May 6 04:02:20 2013
+++ src/libexec/ld.elf_so/map_object.c Mon May 6 15:59:30 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: map_object.c,v 1.48 2013/05/06 08:02:20 skrll Exp $ */
+/* $NetBSD: map_object.c,v 1.49 2013/05/06 19:59:30 christos Exp $ */
/*
* Copyright 1996 John D. Polstra.
@@ -34,7 +34,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: map_object.c,v 1.48 2013/05/06 08:02:20 skrll Exp $");
+__RCSID("$NetBSD: map_object.c,v 1.49 2013/05/06 19:59:30 christos Exp $");
#endif /* not lint */
#include <errno.h>
@@ -432,6 +432,11 @@ _rtld_obj_free(Obj_Entry *obj)
obj->needed = needed->next;
xfree(needed);
}
+ while (!STAILQ_EMPTY(&obj->names)) {
+ Name_Entry *entry = STAILQ_FIRST(&obj->names);
+ STAILQ_REMOVE_HEAD(&obj->names, link);
+ free(entry);
+ }
while ((elm = SIMPLEQ_FIRST(&obj->dldags)) != NULL) {
SIMPLEQ_REMOVE_HEAD(&obj->dldags, link);
xfree(elm);
@@ -454,6 +459,7 @@ _rtld_obj_new(void)
Obj_Entry *obj;
obj = CNEW(Obj_Entry);
+ STAILQ_INIT(&obj->names);
SIMPLEQ_INIT(&obj->dldags);
SIMPLEQ_INIT(&obj->dagmembers);
return obj;
Index: src/libexec/ld.elf_so/rtld.c
diff -u src/libexec/ld.elf_so/rtld.c:1.165 src/libexec/ld.elf_so/rtld.c:1.166
--- src/libexec/ld.elf_so/rtld.c:1.165 Mon May 6 04:02:20 2013
+++ src/libexec/ld.elf_so/rtld.c Mon May 6 15:59:30 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: rtld.c,v 1.165 2013/05/06 08:02:20 skrll Exp $ */
+/* $NetBSD: rtld.c,v 1.166 2013/05/06 19:59:30 christos Exp $ */
/*
* Copyright 1996 John D. Polstra.
@@ -40,7 +40,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: rtld.c,v 1.165 2013/05/06 08:02:20 skrll Exp $");
+__RCSID("$NetBSD: rtld.c,v 1.166 2013/05/06 19:59:30 christos Exp $");
#endif /* not lint */
#include <sys/param.h>
@@ -1372,6 +1372,7 @@ dl_iterate_phdr(int (*callback)(struct d
for (obj = _rtld_objlist; obj != NULL; obj = obj->next) {
phdr_info.dlpi_addr = (Elf_Addr)obj->relocbase;
+ /* XXX: wrong but not fixing it yet */
phdr_info.dlpi_name = STAILQ_FIRST(&obj->names) ?
STAILQ_FIRST(&obj->names)->name : obj->path;
phdr_info.dlpi_phdr = obj->phdr;
Index: src/libexec/ld.elf_so/rtld.h
diff -u src/libexec/ld.elf_so/rtld.h:1.114 src/libexec/ld.elf_so/rtld.h:1.115
--- src/libexec/ld.elf_so/rtld.h:1.114 Mon May 6 04:02:20 2013
+++ src/libexec/ld.elf_so/rtld.h Mon May 6 15:59:30 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: rtld.h,v 1.114 2013/05/06 08:02:20 skrll Exp $ */
+/* $NetBSD: rtld.h,v 1.115 2013/05/06 19:59:30 christos Exp $ */
/*
* Copyright 1996 John D. Polstra.
@@ -425,6 +425,7 @@ void _rtld_combreloc_reset(const Obj_Ent
#endif
/* symver.c */
+void _rtld_object_add_name(Obj_Entry *, const char *);
int _rtld_object_match_name(const Obj_Entry *, const char *);
int _rtld_verify_object_versions(Obj_Entry *);
Index: src/libexec/ld.elf_so/symver.c
diff -u src/libexec/ld.elf_so/symver.c:1.1 src/libexec/ld.elf_so/symver.c:1.2
--- src/libexec/ld.elf_so/symver.c:1.1 Sat Jun 25 01:45:12 2011
+++ src/libexec/ld.elf_so/symver.c Mon May 6 15:59:30 2013
@@ -1,4 +1,4 @@
-/* $NetBSD: symver.c,v 1.1 2011/06/25 05:45:12 nonaka Exp $ */
+/* $NetBSD: symver.c,v 1.2 2013/05/06 19:59:30 christos Exp $ */
/*-
* Copyright 1996, 1997, 1998, 1999, 2000 John D. Polstra.
@@ -59,7 +59,7 @@
*/
#include <sys/cdefs.h>
-__RCSID("$NetBSD: symver.c,v 1.1 2011/06/25 05:45:12 nonaka Exp $");
+__RCSID("$NetBSD: symver.c,v 1.2 2013/05/06 19:59:30 christos Exp $");
#include <sys/param.h>
#include <sys/exec_elf.h>
@@ -68,6 +68,20 @@ __RCSID("$NetBSD: symver.c,v 1.1 2011/06
#include "debug.h"
#include "rtld.h"
+void
+_rtld_object_add_name(Obj_Entry *obj, const char *name)
+{
+ Name_Entry *entry;
+ size_t len;
+
+ len = strlen(name);
+ entry = xmalloc(sizeof(Name_Entry) + len);
+
+ if (entry != NULL) {
+ strcpy(entry->name, name);
+ STAILQ_INSERT_TAIL(&obj->names, entry, link);
+ }
+}
int
_rtld_object_match_name(const Obj_Entry *obj, const char *name)