MIPS, SPARC: fix wrong vfork aliases in libpthread.so
Commit Message
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.
Aurelien
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(-)
Comments
On Wed, 22 Jun 2016, Aurelien Jarno wrote:
> 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.
OK for MIPS.
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
>
From: Aurelien Jarno <aurelien@aurel32.net>
Date: Sun, 26 Jun 2016 23:39:35 +0200
> 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?
Yep :-)
@@ -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]
@@ -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
@@ -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
@@ -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