Module Name: src Committed By: joerg Date: Fri Nov 25 21:27:15 UTC 2011
Modified Files: src/libexec/ld.elf_so: rtld.c Log Message: Unbreak RTLD_NEXT and co on platforms that don't inline or tail call do_dlsym. To generate a diff of this commit: cvs rdiff -u -r1.154 -r1.155 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/rtld.c diff -u src/libexec/ld.elf_so/rtld.c:1.154 src/libexec/ld.elf_so/rtld.c:1.155 --- src/libexec/ld.elf_so/rtld.c:1.154 Thu Nov 17 16:20:11 2011 +++ src/libexec/ld.elf_so/rtld.c Fri Nov 25 21:27:15 2011 @@ -1,4 +1,4 @@ -/* $NetBSD: rtld.c,v 1.154 2011/11/17 16:20:11 joerg Exp $ */ +/* $NetBSD: rtld.c,v 1.155 2011/11/25 21:27:15 joerg Exp $ */ /* * Copyright 1996 John D. Polstra. @@ -40,7 +40,7 @@ #include <sys/cdefs.h> #ifndef lint -__RCSID("$NetBSD: rtld.c,v 1.154 2011/11/17 16:20:11 joerg Exp $"); +__RCSID("$NetBSD: rtld.c,v 1.155 2011/11/25 21:27:15 joerg Exp $"); #endif /* not lint */ #include <sys/param.h> @@ -1047,13 +1047,12 @@ hackish_return_address(void) #endif static void * -do_dlsym(void *handle, const char *name, const Ver_Entry *ventry) +do_dlsym(void *handle, const char *name, const Ver_Entry *ventry, void *retaddr) { const Obj_Entry *obj; unsigned long hash; const Elf_Sym *def; const Obj_Entry *defobj; - void *retaddr; DoneList donelist; const u_int flags = SYMLOOK_DLSYM | SYMLOOK_IN_PLT; #ifdef __HAVE_FUNCTION_DESCRIPTORS @@ -1071,11 +1070,6 @@ do_dlsym(void *handle, const char *name, case (intptr_t)RTLD_NEXT: case (intptr_t)RTLD_DEFAULT: case (intptr_t)RTLD_SELF: -#ifdef __powerpc__ - retaddr = hackish_return_address(); -#else - retaddr = __builtin_return_address(0); -#endif if ((obj = _rtld_obj_from_addr(retaddr)) == NULL) { _rtld_error("Cannot determine caller's shared object"); lookup_mutex_exit(); @@ -1165,10 +1159,16 @@ __strong_alias(__dlsym,dlsym) void * dlsym(void *handle, const char *name) { + void *retaddr; dbg(("dlsym of %s in %p", name, handle)); - return do_dlsym(handle, name, NULL); +#ifdef __powerpc__ + retaddr = hackish_return_address(); +#else + retaddr = __builtin_return_address(0); +#endif + return do_dlsym(handle, name, NULL, retaddr); } __strong_alias(__dlvsym,dlvsym) @@ -1177,6 +1177,7 @@ dlvsym(void *handle, const char *name, c { Ver_Entry *ventry = NULL; Ver_Entry ver_entry; + void *retaddr; dbg(("dlvsym of %s@%s in %p", name, version ? version : NULL, handle)); @@ -1187,7 +1188,12 @@ dlvsym(void *handle, const char *name, c ver_entry.flags = 0; ventry = &ver_entry; } - return do_dlsym(handle, name, ventry); +#ifdef __powerpc__ + retaddr = hackish_return_address(); +#else + retaddr = __builtin_return_address(0); +#endif + return do_dlsym(handle, name, ventry, retaddr); } __strong_alias(__dladdr,dladdr)