--- libexec/rtld-elf/rtld.c.orig 2010-06-18 23:17:38.000000000 +0800 +++ libexec/rtld-elf/rtld.c 2010-08-12 16:16:43.000000000 +0800 @@ -1435,15 +1435,23 @@ Needed_Entry *needed; for (needed = obj->needed; needed != NULL; needed = needed->next) { - obj1 = needed->obj = load_object(obj->strtab + needed->name, obj, - flags & ~RTLD_LO_NOLOAD); - if (obj1 == NULL && !ld_tracing) + const char *name = obj->strtab + needed->name; + char *path = find_library(name, obj); + + if (path == NULL && !ld_tracing) return -1; - if (obj1 != NULL && obj1->z_nodelete && !obj1->ref_nodel) { - dbg("obj %s nodelete", obj1->path); - init_dag(obj1); - ref_dag(obj1); - obj1->ref_nodel = true; + + if (path) { + obj1 = needed->obj = load_object(path, obj, + flags & ~RTLD_LO_NOLOAD); + if (obj1 == NULL && !ld_tracing) + return -1; + if (obj1 != NULL && obj1->z_nodelete && !obj1->ref_nodel) { + dbg("obj %s nodelete", obj1->path); + init_dag(obj1); + ref_dag(obj1); + obj1->ref_nodel = true; + } } } }