This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
powerpc help needed: Defining hidden alias for __sigsetjmp
- From: Florian Weimer <fweimer at redhat dot com>
- To: GNU C Library <libc-alpha at sourceware dot org>
- Date: Mon, 14 Nov 2016 15:44:00 +0100
- Subject: powerpc help needed: Defining hidden alias for __sigsetjmp
- Authentication-results: sourceware.org; auth=none
I'm trying to create a hidden alias for __sigsetjmp on powerpc. The
problem is that powerpc uses the generic <setjmp.h> wrapper, which has a
libc_hidden_proto for it, but the implementation of that redirect never
happens.
I came up with the attached patch. It adds a definition of the hidden
redirect to libc.so, as expected. But in addition to that, I get this
ABI difference on powerpc32:
-GLIBC_2.3.4 __longjmp F
This does not happen on powerpc64.
I really can't explain that. Any ideas?
Florian
powerpc: Add hidden definition for __sigsetjmp
2016-11-14 Florian Weimer <fweimer@redhat.com>
* sysdeps/powerpc/powerpc64/setjmp-common.S (__GI___sigsetjmp):
Define.
* sysdeps/powerpc/powerpc32/setjmp.S (__sigsetjmp): Add hidden
definition.
diff --git a/sysdeps/powerpc/powerpc32/fpu/setjmp.S b/sysdeps/powerpc/powerpc32/fpu/setjmp.S
index 6a4016c..de6cdcf 100644
--- a/sysdeps/powerpc/powerpc32/fpu/setjmp.S
+++ b/sysdeps/powerpc/powerpc32/fpu/setjmp.S
@@ -32,6 +32,7 @@ versioned_symbol (libc, __vmx__sigsetjmp, __sigsetjmp, GLIBC_2_3_4)
# define __sigsetjmp_symbol __vmx__sigsetjmp
# define __sigjmp_save_symbol __vmx__sigjmp_save
# include "setjmp-common.S"
+libc_hidden_ver (__vmx__sigsetjmp, __sigsetjmp)
# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
# define __NO_VMX__
diff --git a/sysdeps/powerpc/powerpc32/setjmp.S b/sysdeps/powerpc/powerpc32/setjmp.S
index 88f7f82..285d40c 100644
--- a/sysdeps/powerpc/powerpc32/setjmp.S
+++ b/sysdeps/powerpc/powerpc32/setjmp.S
@@ -31,6 +31,7 @@ versioned_symbol (libc, __vmx__sigsetjmp, __sigsetjmp, GLIBC_2_3_4)
# define __sigsetjmp_symbol __vmx__sigsetjmp
# define __sigjmp_save_symbol __vmx__sigjmp_save
# include "setjmp-common.S"
+libc_hidden_ver (__vmx__sigsetjmp, __sigsetjmp)
# if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)
# define __NO_VMX__
diff --git a/sysdeps/powerpc/powerpc64/setjmp-common.S b/sysdeps/powerpc/powerpc64/setjmp-common.S
index 83361f5..b5de49e 100644
--- a/sysdeps/powerpc/powerpc64/setjmp-common.S
+++ b/sysdeps/powerpc/powerpc64/setjmp-common.S
@@ -232,3 +232,14 @@ L(no_vmx):
blr
#endif
END (__sigsetjmp_symbol)
+
+#if defined SHARED && !IS_IN (rtld) && !defined __NO_VMX__
+/* When called from within libc we need a special version of __sigsetjmp
+ that saves r2 since the call won't go via a plt call stub. See
+ bugz #269. */
+ENTRY (__GI___sigsetjmp)
+ std r2,FRAME_TOC_SAVE(r1) /* Save the callers TOC in the save area. */
+ CALL_MCOUNT 1
+ b JUMPTARGET (GLUE(__sigsetjmp_symbol,_ent))
+END (__GI___sigsetjmp)
+#endif