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)