? a.out ? hello.c ? o Index: headers.c =================================================================== RCS file: /cvsroot/src/libexec/ld.elf_so/headers.c,v retrieving revision 1.50 diff -u -p -u -r1.50 headers.c --- headers.c 6 May 2013 08:02:20 -0000 1.50 +++ headers.c 6 May 2013 19:50:19 -0000 @@ -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: load.c =================================================================== RCS file: /cvsroot/src/libexec/ld.elf_so/load.c,v retrieving revision 1.43 diff -u -p -u -r1.43 load.c --- load.c 6 May 2013 08:02:20 -0000 1.43 +++ load.c 6 May 2013 19:50:19 -0000 @@ -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: map_object.c =================================================================== RCS file: /cvsroot/src/libexec/ld.elf_so/map_object.c,v retrieving revision 1.48 diff -u -p -u -r1.48 map_object.c --- map_object.c 6 May 2013 08:02:20 -0000 1.48 +++ map_object.c 6 May 2013 19:50:19 -0000 @@ -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: rtld.c =================================================================== RCS file: /cvsroot/src/libexec/ld.elf_so/rtld.c,v retrieving revision 1.165 diff -u -p -u -r1.165 rtld.c --- rtld.c 6 May 2013 08:02:20 -0000 1.165 +++ rtld.c 6 May 2013 19:50:20 -0000 @@ -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: rtld.h =================================================================== RCS file: /cvsroot/src/libexec/ld.elf_so/rtld.h,v retrieving revision 1.114 diff -u -p -u -r1.114 rtld.h --- rtld.h 6 May 2013 08:02:20 -0000 1.114 +++ rtld.h 6 May 2013 19:50:20 -0000 @@ -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: symver.c =================================================================== RCS file: /cvsroot/src/libexec/ld.elf_so/symver.c,v retrieving revision 1.1 diff -u -p -u -r1.1 symver.c --- symver.c 25 Jun 2011 05:45:12 -0000 1.1 +++ symver.c 6 May 2013 19:50:20 -0000 @@ -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)