Message ID | 20160622052403.GA32463@aurel32.net |
---|---|
State | New |
Headers | show |
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 :-)
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