From 9b874b2f1eb2550e39d3e9c38772e64a767e9de2 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Sat, 17 Aug 2013 18:35:40 +0930 Subject: [PATCH] PowerPC ugly symbol versioning http://sourceware.org/ml/libc-alpha/2013-08/msg00090.html This patch fixes symbol versioning in setjmp/longjmp. The existing code uses raw versions, which results in wrong symbol versioning when you want to build glibc with a base version of 2.19 for LE. Note that the merging the 64-bit and 32-bit versions in novmx-lonjmp.c and pt-longjmp.c doesn't result in GLIBC_2.0 versions for 64-bit, due to the base in shlib_versions. * sysdeps/powerpc/longjmp.c: Use proper symbol versioning macros. * sysdeps/powerpc/novmx-longjmp.c: Likewise. * sysdeps/powerpc/powerpc32/bsd-_setjmp.S: Likewise. * sysdeps/powerpc/powerpc32/bsd-setjmp.S: Likewise. * sysdeps/powerpc/powerpc32/fpu/__longjmp.S: Likewise. * sysdeps/powerpc/powerpc32/fpu/setjmp.S: Likewise. * sysdeps/powerpc/powerpc32/mcount.c: Likewise. * sysdeps/powerpc/powerpc32/setjmp.S: Likewise. * sysdeps/powerpc/powerpc64/setjmp.S: Likewise. * nptl/sysdeps/unix/sysv/linux/powerpc/pt-longjmp.c: Likewise. --- ChangeLog | 13 +++++++++++++ nptl/sysdeps/unix/sysv/linux/powerpc/pt-longjmp.c | 13 ++++--------- sysdeps/powerpc/longjmp.c | 6 +++--- sysdeps/powerpc/novmx-longjmp.c | 12 +++--------- sysdeps/powerpc/powerpc32/bsd-_setjmp.S | 4 ++-- sysdeps/powerpc/powerpc32/bsd-setjmp.S | 4 ++-- sysdeps/powerpc/powerpc32/fpu/__longjmp.S | 4 ++-- sysdeps/powerpc/powerpc32/fpu/setjmp.S | 4 ++-- sysdeps/powerpc/powerpc32/mcount.c | 2 +- sysdeps/powerpc/powerpc32/setjmp.S | 4 ++-- sysdeps/powerpc/powerpc64/setjmp.S | 12 ++++++------ 11 files changed, 40 insertions(+), 38 deletions(-) diff --git a/ChangeLog b/ChangeLog index c106857c3f..cd5d1a181b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,16 @@ +2013-10-04 Alan Modra + + * sysdeps/powerpc/longjmp.c: Use proper symbol versioning macros. + * sysdeps/powerpc/novmx-longjmp.c: Likewise. + * sysdeps/powerpc/powerpc32/bsd-_setjmp.S: Likewise. + * sysdeps/powerpc/powerpc32/bsd-setjmp.S: Likewise. + * sysdeps/powerpc/powerpc32/fpu/__longjmp.S: Likewise. + * sysdeps/powerpc/powerpc32/fpu/setjmp.S: Likewise. + * sysdeps/powerpc/powerpc32/mcount.c: Likewise. + * sysdeps/powerpc/powerpc32/setjmp.S: Likewise. + * sysdeps/powerpc/powerpc64/setjmp.S: Likewise. + * nptl/sysdeps/unix/sysv/linux/powerpc/pt-longjmp.c: Likewise. + 2013-10-04 Anton Blanchard Alistair Popple Alan Modra diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/pt-longjmp.c b/nptl/sysdeps/unix/sysv/linux/powerpc/pt-longjmp.c index ace858fd13..4ac913c3be 100644 --- a/nptl/sysdeps/unix/sysv/linux/powerpc/pt-longjmp.c +++ b/nptl/sysdeps/unix/sysv/linux/powerpc/pt-longjmp.c @@ -41,13 +41,8 @@ void __novmx_longjmp (jmp_buf env, int val) __novmx__libc_longjmp (env, val); } -# if __WORDSIZE == 64 -symbol_version (__novmx_longjmp,longjmp,GLIBC_2.3); -symbol_version (__novmx_siglongjmp,siglongjmp,GLIBC_2.3); -# else -symbol_version (__novmx_longjmp,longjmp,GLIBC_2.0); -symbol_version (__novmx_siglongjmp,siglongjmp,GLIBC_2.0); -# endif +compat_symbol (libpthread, __novmx_longjmp, longjmp, GLIBC_2_0); +compat_symbol (libpthread, __novmx_siglongjmp, siglongjmp, GLIBC_2_0); #endif /* defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)) */ void @@ -62,5 +57,5 @@ __vmx_siglongjmp (jmp_buf env, int val) __libc_siglongjmp (env, val); } -versioned_symbol (libc, __vmx_longjmp, longjmp, GLIBC_2_3_4); -versioned_symbol (libc, __vmx_siglongjmp, siglongjmp, GLIBC_2_3_4); +versioned_symbol (libpthread, __vmx_longjmp, longjmp, GLIBC_2_3_4); +versioned_symbol (libpthread, __vmx_siglongjmp, siglongjmp, GLIBC_2_3_4); diff --git a/sysdeps/powerpc/longjmp.c b/sysdeps/powerpc/longjmp.c index 198c894208..189fc03aba 100644 --- a/sysdeps/powerpc/longjmp.c +++ b/sysdeps/powerpc/longjmp.c @@ -55,6 +55,6 @@ weak_alias (__vmx__libc_siglongjmp, __vmxsiglongjmp) default_symbol_version (__vmx__libc_longjmp, __libc_longjmp, GLIBC_PRIVATE); default_symbol_version (__vmx__libc_siglongjmp, __libc_siglongjmp, GLIBC_PRIVATE); -default_symbol_version (__vmx_longjmp, _longjmp, GLIBC_2.3.4); -default_symbol_version (__vmxlongjmp, longjmp, GLIBC_2.3.4); -default_symbol_version (__vmxsiglongjmp, siglongjmp, GLIBC_2.3.4); +versioned_symbol (libc, __vmx_longjmp, _longjmp, GLIBC_2_3_4); +versioned_symbol (libc, __vmxlongjmp, longjmp, GLIBC_2_3_4); +versioned_symbol (libc, __vmxsiglongjmp, siglongjmp, GLIBC_2_3_4); diff --git a/sysdeps/powerpc/novmx-longjmp.c b/sysdeps/powerpc/novmx-longjmp.c index 8f6ea357d4..b2c0e4cf5f 100644 --- a/sysdeps/powerpc/novmx-longjmp.c +++ b/sysdeps/powerpc/novmx-longjmp.c @@ -50,13 +50,7 @@ weak_alias (__novmx__libc_siglongjmp, __novmx_longjmp) weak_alias (__novmx__libc_siglongjmp, __novmxlongjmp) weak_alias (__novmx__libc_siglongjmp, __novmxsiglongjmp) -# if __WORDSIZE == 64 -symbol_version (__novmx_longjmp,_longjmp,GLIBC_2.3); -symbol_version (__novmxlongjmp,longjmp,GLIBC_2.3); -symbol_version (__novmxsiglongjmp,siglongjmp,GLIBC_2.3); -# else -symbol_version (__novmx_longjmp,_longjmp,GLIBC_2.0); -symbol_version (__novmxlongjmp,longjmp,GLIBC_2.0); -symbol_version (__novmxsiglongjmp,siglongjmp,GLIBC_2.0); -# endif +compat_symbol (libc, __novmx_longjmp, _longjmp, GLIBC_2_0); +compat_symbol (libc, __novmxlongjmp, longjmp, GLIBC_2_0); +compat_symbol (libc, __novmxsiglongjmp, siglongjmp, GLIBC_2_0); #endif /* defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4)) */ diff --git a/sysdeps/powerpc/powerpc32/bsd-_setjmp.S b/sysdeps/powerpc/powerpc32/bsd-_setjmp.S index 95e8a5aa10..ad2b5ffdb0 100644 --- a/sysdeps/powerpc/powerpc32/bsd-_setjmp.S +++ b/sysdeps/powerpc/powerpc32/bsd-_setjmp.S @@ -30,7 +30,7 @@ libc_hidden_def (_setjmp) /* Build a versioned object for libc. */ # if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4) -symbol_version (__novmx_setjmp,_setjmp,GLIBC_2.0); +compat_symbol (libc, __novmx_setjmp, _setjmp, GLIBC_2_0); ENTRY (__novmx_setjmp) li r4,0 /* Set second argument to 0. */ @@ -39,7 +39,7 @@ END (__novmx_setjmp) libc_hidden_def (__novmx_setjmp) # endif /* defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4) */ -default_symbol_version (__vmx_setjmp,_setjmp,GLIBC_2.3.4) +versioned_symbol (libc, __vmx_setjmp, _setjmp, GLIBC_2_3_4) /* __GI__setjmp prototype is needed for ntpl i.e. _setjmp is defined as a libc_hidden_proto & is used in sysdeps/generic/libc-start.c if HAVE_CLEANUP_JMP_BUF is defined */ diff --git a/sysdeps/powerpc/powerpc32/bsd-setjmp.S b/sysdeps/powerpc/powerpc32/bsd-setjmp.S index 1113ea533c..5e1e860d85 100644 --- a/sysdeps/powerpc/powerpc32/bsd-setjmp.S +++ b/sysdeps/powerpc/powerpc32/bsd-setjmp.S @@ -26,7 +26,7 @@ ENTRY (__novmxsetjmp) b __novmx__sigsetjmp@local END (__novmxsetjmp) strong_alias (__novmxsetjmp, __novmx__setjmp) -symbol_version (__novmxsetjmp, setjmp, GLIBC_2.0) +compat_symbol (libc, __novmxsetjmp, setjmp, GLIBC_2_0) #endif /* defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4) ) */ @@ -36,4 +36,4 @@ ENTRY (__vmxsetjmp) END (__vmxsetjmp) strong_alias (__vmxsetjmp, __vmx__setjmp) strong_alias (__vmx__setjmp, __setjmp) -default_symbol_version (__vmxsetjmp,setjmp,GLIBC_2.3.4) +versioned_symbol (libc, __vmxsetjmp, setjmp, GLIBC_2_3_4) diff --git a/sysdeps/powerpc/powerpc32/fpu/__longjmp.S b/sysdeps/powerpc/powerpc32/fpu/__longjmp.S index 96e50de378..27166c454f 100644 --- a/sysdeps/powerpc/powerpc32/fpu/__longjmp.S +++ b/sysdeps/powerpc/powerpc32/fpu/__longjmp.S @@ -26,14 +26,14 @@ #else /* !NOT_IN_libc */ /* Build a versioned object for libc. */ -default_symbol_version (__vmx__longjmp,__longjmp,GLIBC_2.3.4); +versioned_symbol (libc, __vmx__longjmp, __longjmp, GLIBC_2_3_4); # define __longjmp __vmx__longjmp # include "__longjmp-common.S" # if defined SHARED && SHLIB_COMPAT (libc, GLIBC_2_0, GLIBC_2_3_4) # define __NO_VMX__ # undef JB_SIZE -symbol_version (__novmx__longjmp,__longjmp,GLIBC_2.0); +compat_symbol (libc, __novmx__longjmp, __longjmp, GLIBC_2_0); # undef __longjmp # define __longjmp __novmx__longjmp # include "__longjmp-common.S" diff --git a/sysdeps/powerpc/powerpc32/fpu/setjmp.S b/sysdeps/powerpc/powerpc32/fpu/setjmp.S index 60cd350522..92acff1e63 100644 --- a/sysdeps/powerpc/powerpc32/fpu/setjmp.S +++ b/sysdeps/powerpc/powerpc32/fpu/setjmp.S @@ -26,7 +26,7 @@ #else /* !NOT_IN_libc */ /* Build a versioned object for libc. */ -default_symbol_version (__vmx__sigsetjmp,__sigsetjmp,GLIBC_2.3.4) +versioned_symbol (libc, __vmx__sigsetjmp, __sigsetjmp, GLIBC_2_3_4) # define __sigsetjmp __vmx__sigsetjmp # define __sigjmp_save __vmx__sigjmp_save # include "setjmp-common.S" @@ -36,7 +36,7 @@ default_symbol_version (__vmx__sigsetjmp,__sigsetjmp,GLIBC_2.3.4) # undef __sigsetjmp # undef __sigjmp_save # undef JB_SIZE -symbol_version (__novmx__sigsetjmp,__sigsetjmp,GLIBC_2.0) +compat_symbol (libc, __novmx__sigsetjmp, __sigsetjmp, GLIBC_2_0) # define __sigsetjmp __novmx__sigsetjmp # define __sigjmp_save __novmx__sigjmp_save # include "setjmp-common.S" diff --git a/sysdeps/powerpc/powerpc32/mcount.c b/sysdeps/powerpc/powerpc32/mcount.c index 0476bf61db..d8c063222a 100644 --- a/sysdeps/powerpc/powerpc32/mcount.c +++ b/sysdeps/powerpc/powerpc32/mcount.c @@ -9,7 +9,7 @@ /* __mcount_internal was added in glibc 2.15 with version GLIBC_PRIVATE, but it should have been put in version GLIBC_2.15. Mark the GLIBC_PRIVATE version obsolete and add it to GLIBC_2.16 instead. */ -default_symbol_version (___mcount_internal, __mcount_internal, GLIBC_2.16); +versioned_symbol (libc, ___mcount_internal, __mcount_internal, GLIBC_2_16); #if SHLIB_COMPAT (libc, GLIBC_2_15, GLIBC_2_16) strong_alias (___mcount_internal, ___mcount_internal_private); diff --git a/sysdeps/powerpc/powerpc32/setjmp.S b/sysdeps/powerpc/powerpc32/setjmp.S index 8a8cf0d6e7..49b64ecf01 100644 --- a/sysdeps/powerpc/powerpc32/setjmp.S +++ b/sysdeps/powerpc/powerpc32/setjmp.S @@ -25,7 +25,7 @@ #else /* !NOT_IN_libc */ /* Build a versioned object for libc. */ -default_symbol_version (__vmx__sigsetjmp,__sigsetjmp,GLIBC_2.3.4) +versioned_symbol (libc, __vmx__sigsetjmp, __sigsetjmp, GLIBC_2_3_4) # define __sigsetjmp __vmx__sigsetjmp # define __sigjmp_save __vmx__sigjmp_save # include "setjmp-common.S" @@ -35,7 +35,7 @@ default_symbol_version (__vmx__sigsetjmp,__sigsetjmp,GLIBC_2.3.4) # undef __sigsetjmp # undef __sigjmp_save # undef JB_SIZE -symbol_version (__novmx__sigsetjmp,__sigsetjmp,GLIBC_2.0) +compat_symbol (libc, __novmx__sigsetjmp, __sigsetjmp, GLIBC_2_0) # define __sigsetjmp __novmx__sigsetjmp # define __sigjmp_save __novmx__sigjmp_save # include "setjmp-common.S" diff --git a/sysdeps/powerpc/powerpc64/setjmp.S b/sysdeps/powerpc/powerpc64/setjmp.S index 667b9d12dd..0a3b2fc022 100644 --- a/sysdeps/powerpc/powerpc64/setjmp.S +++ b/sysdeps/powerpc/powerpc64/setjmp.S @@ -26,9 +26,9 @@ #else /* !NOT_IN_libc */ /* Build a versioned object for libc. */ -default_symbol_version (__vmxsetjmp, setjmp, GLIBC_2.3.4) -default_symbol_version (__vmx_setjmp,_setjmp,GLIBC_2.3.4) -default_symbol_version (__vmx__sigsetjmp,__sigsetjmp,GLIBC_2.3.4) +versioned_symbol (libc, __vmxsetjmp, setjmp, GLIBC_2_3_4) +versioned_symbol (libc, __vmx_setjmp, _setjmp, GLIBC_2_3_4) +versioned_symbol (libc, __vmx__sigsetjmp, __sigsetjmp, GLIBC_2_3_4) # define setjmp __vmxsetjmp # define _setjmp __vmx_setjmp # define __sigsetjmp __vmx__sigsetjmp @@ -44,9 +44,9 @@ strong_alias (__vmx__sigsetjmp, __setjmp) # undef __sigjmp_save # undef JB_SIZE # define __NO_VMX__ -symbol_version (__novmxsetjmp, setjmp, GLIBC_2.3) -symbol_version (__novmx_setjmp,_setjmp,GLIBC_2.3); -symbol_version (__novmx__sigsetjmp,__sigsetjmp,GLIBC_2.3) +compat_symbol (libc, __novmxsetjmp, setjmp, GLIBC_2_3) +compat_symbol (libc, __novmx_setjmp,_setjmp, GLIBC_2_3); +compat_symbol (libc, __novmx__sigsetjmp,__sigsetjmp, GLIBC_2_3) # define setjmp __novmxsetjmp # define _setjmp __novmx_setjmp # define __sigsetjmp __novmx__sigsetjmp -- 2.11.4.GIT