This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] MIPS, SPARC: fix wrong vfork aliases in libpthread.so
- From: Aurelien Jarno <aurelien at aurel32 dot net>
- To: libc-alpha at sourceware dot org, David Miller <davem at davemloft dot net>
- Date: Sun, 26 Jun 2016 23:39:35 +0200
- Subject: Re: [PATCH] MIPS, SPARC: fix wrong vfork aliases in libpthread.so
- Authentication-results: sourceware.org; auth=none
- References: <1466173263-16155-1-git-send-email-aurelien at aurel32 dot net> <20160622052403 dot GA32463 at aurel32 dot net>
On 2016-06-22 07:24, Aurelien Jarno wrote:
> On 2016-06-17 16:21, Aurelien Jarno wrote:
> > With recent binutils versions the GNU libc fails to build on at least
> > MISP and SPARC, with this kind of error:
> >
> > /home/aurel32/glibc/glibc-build/nptl/libpthread.so:(*IND*+0x0): multiple definition of `vfork@GLIBC_2.0'
> > /home/aurel32/glibc/glibc-build/nptl/libpthread.so::(.text+0xee50): first defined here
> >
> > It appears that on these architectures pt-vfork.S includes vfork.S
> > (through the alpha version of pt-vfork.S) and that the __vfork aliases
> > are not conditionalized on IS_IN (libc) like on other architectures.
> > Therefore the aliases are also wrongly included in libpthread.so.
> >
> > Fix this by properly conditionalizing the aliases like on other
> > architectures.
>
> Unfortunately I failed to correctly run the testsuite and thus this
> commit broke the libpthread ABI. Sorry about that.
>
> The patch below does the remaining changes to align the MIPS and SPARC
> vfork implementations with the other architectures. I have done a test
> built and run the testsuite on mips64el, sparc32 and sparc64.
David, does the patch below looks fine for SPARC?
> From: Aurelien Jarno <aurelien@aurel32.net>
> Date: Tue, 21 Jun 2016 23:59:37 +0200
> Subject: [PATCH] MIPS, SPARC: more fixes to the vfork aliases in libpthread.so
>
> Commit 43c29487 tried to fix the vfork aliases in libpthread.so on MIPS
> and SPARC, but failed to do it correctly, introducing an ABI change.
>
> This patch does the remaining changes needed to align the MIPS and SPARC
> vfork implementations with the other architectures. That way the the
> alpha version of pt-vfork.S works correctly for MIPS and SPARC. The
> changes for alpha were done in 82aab97c.
>
> Changelog:
> * sysdeps/unix/sysv/linux/mips/vfork.S (__vfork): Rename into
> __libc_vfork.
> (__vfork) [IS_IN (libc)]: Remove alias.
> (__libc_vfork) [IS_IN (libc)]: Define as an alias.
> * sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S: Likewise.
> * sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S: Likewise.
> ---
> ChangeLog | 9 +++++++++
> sysdeps/unix/sysv/linux/mips/vfork.S | 12 ++++++------
> sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S | 8 ++++----
> sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S | 8 ++++----
> 4 files changed, 23 insertions(+), 14 deletions(-)
>
> diff --git a/ChangeLog b/ChangeLog
> index e418cc0..307f33e 100644
> --- a/ChangeLog
> +++ b/ChangeLog
> @@ -1,3 +1,12 @@
> +2016-06-21 Aurelien Jarno <aurelien@aurel32.net>
> +
> + * sysdeps/unix/sysv/linux/mips/vfork.S (__vfork): Rename into
> + __libc_vfork.
> + (__vfork) [IS_IN (libc)]: Remove alias.
> + (__libc_vfork) [IS_IN (libc)]: Define as an alias.
> + * sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S: Likewise.
> + * sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S: Likewise.
> +
> 2016-06-21 Florian Weimer <fweimer@redhat.com>
>
> [BZ #20284]
> diff --git a/sysdeps/unix/sysv/linux/mips/vfork.S b/sysdeps/unix/sysv/linux/mips/vfork.S
> index c0c0ce6..1867c86 100644
> --- a/sysdeps/unix/sysv/linux/mips/vfork.S
> +++ b/sysdeps/unix/sysv/linux/mips/vfork.S
> @@ -31,13 +31,13 @@
> LOCALSZ= 1
> FRAMESZ= (((NARGSAVE+LOCALSZ)*SZREG)+ALSZ)&ALMASK
> GPOFF= FRAMESZ-(1*SZREG)
> -NESTED(__vfork,FRAMESZ,sp)
> +NESTED(__libc_vfork,FRAMESZ,sp)
> #ifdef __PIC__
> SETUP_GP
> #endif
> PTR_SUBU sp, FRAMESZ
> cfi_adjust_cfa_offset (FRAMESZ)
> - SETUP_GP64_REG (a5, __vfork)
> + SETUP_GP64_REG (a5, __libc_vfork)
> #ifdef __PIC__
> SAVE_GP (GPOFF)
> #endif
> @@ -104,10 +104,10 @@ L(error):
> RESTORE_GP64_REG
> j __syscall_error
> #endif
> - END(__vfork)
> + END(__libc_vfork)
>
> #if IS_IN (libc)
> -libc_hidden_def(__vfork)
> -weak_alias (__vfork, vfork)
> -strong_alias (__vfork, __libc_vfork)
> +weak_alias (__libc_vfork, vfork)
> +strong_alias (__libc_vfork, __vfork)
> +libc_hidden_def (__vfork)
> #endif
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S b/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S
> index 94f2c8d..0d0a3b5 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S
> @@ -21,7 +21,7 @@
>
> .text
> .globl __syscall_error
> -ENTRY(__vfork)
> +ENTRY(__libc_vfork)
> ld [%g7 + PID], %o5
> cmp %o5, 0
> bne 1f
> @@ -42,10 +42,10 @@ ENTRY(__vfork)
> st %o5, [%g7 + PID]
> 1: retl
> nop
> -END(__vfork)
> +END(__libc_vfork)
>
> #if IS_IN (libc)
> +weak_alias (__libc_vfork, vfork)
> +strong_alias (__libc_vfork, __vfork)
> libc_hidden_def (__vfork)
> -weak_alias (__vfork, vfork)
> -strong_alias (__vfork, __libc_vfork)
> #endif
> diff --git a/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S b/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S
> index a7479e9..0818eba 100644
> --- a/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S
> +++ b/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S
> @@ -21,7 +21,7 @@
>
> .text
> .globl __syscall_error
> -ENTRY(__vfork)
> +ENTRY(__libc_vfork)
> ld [%g7 + PID], %o5
> sethi %hi(0x80000000), %o3
> cmp %o5, 0
> @@ -42,10 +42,10 @@ ENTRY(__vfork)
> st %o5, [%g7 + PID]
> 1: retl
> nop
> -END(__vfork)
> +END(__libc_vfork)
>
> #if IS_IN (libc)
> +weak_alias (__libc_vfork, vfork)
> +strong_alias (__libc_vfork, __vfork)
> libc_hidden_def (__vfork)
> -weak_alias (__vfork, vfork)
> -strong_alias (__vfork, __libc_vfork)
> #endif
> --
> 2.8.1
>
>
> --
> Aurelien Jarno GPG: 4096R/1DDD8C9B
> aurelien@aurel32.net http://www.aurel32.net
>
--
Aurelien Jarno GPG: 4096R/1DDD8C9B
aurelien@aurel32.net http://www.aurel32.net