summaryrefslogtreecommitdiff
path: root/libexec
diff options
context:
space:
mode:
authormacallan <macallan@NetBSD.org>2008-09-27 03:52:05 +0000
committermacallan <macallan@NetBSD.org>2008-09-27 03:52:05 +0000
commit982ae38f150bd315071c87cf6fa8beec21db41ea (patch)
tree75b0c2c7f9a247e7067af180ccf9ee1782e22672 /libexec
parent2941ba2cb67d7144d170e6964551489bf1a075f4 (diff)
avoid usind __builtin_return_address(0) on PowerPC because it fails in
Xorg's module loader. Should fix PR37812
Diffstat (limited to 'libexec')
-rw-r--r--libexec/ld.elf_so/rtld.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/libexec/ld.elf_so/rtld.c b/libexec/ld.elf_so/rtld.c
index 40ae558ed75..adf4a63976c 100644
--- a/libexec/ld.elf_so/rtld.c
+++ b/libexec/ld.elf_so/rtld.c
@@ -1,4 +1,4 @@
-/* $NetBSD: rtld.c,v 1.120 2008/07/24 04:39:25 matt Exp $ */
+/* $NetBSD: rtld.c,v 1.121 2008/09/27 03:52:05 macallan Exp $ */
/*
* Copyright 1996 John D. Polstra.
@@ -40,7 +40,7 @@
#include <sys/cdefs.h>
#ifndef lint
-__RCSID("$NetBSD: rtld.c,v 1.120 2008/07/24 04:39:25 matt Exp $");
+__RCSID("$NetBSD: rtld.c,v 1.121 2008/09/27 03:52:05 macallan Exp $");
#endif /* not lint */
#include <err.h>
@@ -813,6 +813,14 @@ _rtld_objmain_sym(const char *name)
return(NULL);
}
+#ifdef __powerpc__
+static void *
+hackish_return_address(void)
+{
+ return __builtin_return_address(1);
+}
+#endif
+
__strong_alias(__dlsym,dlsym)
void *
dlsym(void *handle, const char *name)
@@ -832,7 +840,11 @@ dlsym(void *handle, const char *name)
case (intptr_t)RTLD_NEXT:
case (intptr_t)RTLD_DEFAULT:
case (intptr_t)RTLD_SELF:
- retaddr = __builtin_return_address(0); /* __GNUC__ only */
+#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");
return NULL;