This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: PowerPC ugly symbol versioning
- From: Adhemerval Zanella <azanella at linux dot vnet dot ibm dot com>
- To: libc-alpha at sourceware dot org
- Date: Tue, 20 Aug 2013 15:15:52 -0300
- Subject: Re: PowerPC ugly symbol versioning
- References: <20130809045235 dot GA3294 at bubble dot grove dot modra dot org>
Hi Alan,
This patch seems ok, I checked and there is not ABI incompatibility for BE.
On 09-08-2013 01:52, Alan Modra wrote:
> 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.
>
> diff --git a/sysdeps/powerpc/longjmp.c b/sysdeps/powerpc/longjmp.c
> index 198c894..189fc03 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 8f6ea35..b2c0e4c 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 95e8a5a..ad2b5ff 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 1113ea5..5e1e860 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 96e50de..27166c4 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 dc93db3..671032d 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 0476bf6..d8c0632 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 851a5b9..f0c1507 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 667b9d1..0a3b2fc 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
> diff --git a/nptl/sysdeps/unix/sysv/linux/powerpc/pt-longjmp.c b/nptl/sysdeps/unix/sysv/linux/powerpc/pt-longjmp.c
> index ace858f..4ac913c 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);
>