MIPS, SPARC: fix wrong vfork aliases in libpthread.so

Message ID 1466173263-16155-1-git-send-email-aurelien@aurel32.net
State New, archived
Headers

Commit Message

Aurelien Jarno June 17, 2016, 2:21 p.m. UTC
  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.

Changelog:
	* sysdeps/unix/sysv/linux/mips/vfork.S (__vfork): Conditionalize
	hidden_def, weak_alias and strong_alias on [IS_IN (libc)].
	* sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S: Likewise.
	* sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S: Likewise.
---
 ChangeLog                                     | 7 +++++++
 sysdeps/unix/sysv/linux/mips/vfork.S          | 2 ++
 sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S | 2 ++
 sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S | 2 ++
 4 files changed, 13 insertions(+)

Notes:
 - this has been initially reported in this Debian bug report:
   https://bugs.debian.org/827477
 - the issue has been found on mips, sparc32 and sparc64, but the fix
   has only been tested on mips
 - microblaze is likely impacted too, but I have no way to very it
  

Comments

Joseph Myers June 17, 2016, 3:44 p.m. UTC | #1
On Fri, 17 Jun 2016, Aurelien Jarno wrote:

> 	* sysdeps/unix/sysv/linux/mips/vfork.S (__vfork): Conditionalize
> 	hidden_def, weak_alias and strong_alias on [IS_IN (libc)].

OK for MIPS.
  
David Miller June 18, 2016, 4:28 a.m. UTC | #2
From: Aurelien Jarno <aurelien@aurel32.net>
Date: Fri, 17 Jun 2016 16:21:03 +0200

> 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.
> 
> Changelog:
> 	* sysdeps/unix/sysv/linux/mips/vfork.S (__vfork): Conditionalize
> 	hidden_def, weak_alias and strong_alias on [IS_IN (libc)].
> 	* sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S: Likewise.
> 	* sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S: Likewise.

Sparc bits look fine to me.
  

Patch

diff --git a/ChangeLog b/ChangeLog
index e72ffb8..643aee8 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@ 
+2016-06-17  Aurelien Jarno  <aurelien@aurel32.net>
+
+	* sysdeps/unix/sysv/linux/mips/vfork.S (__vfork): Conditionalize
+	hidden_def, weak_alias and strong_alias on [IS_IN (libc)].
+	* sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S: Likewise.
+	* sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S: Likewise.
+
 2016-06-16  Rajalakshmi Srinivasaraghavan  <raji@linux.vnet.ibm.com>
 
 	* NEWS: Mention addition of nextup and nextdown.
diff --git a/sysdeps/unix/sysv/linux/mips/vfork.S b/sysdeps/unix/sysv/linux/mips/vfork.S
index 8c66151..c0c0ce6 100644
--- a/sysdeps/unix/sysv/linux/mips/vfork.S
+++ b/sysdeps/unix/sysv/linux/mips/vfork.S
@@ -106,6 +106,8 @@  L(error):
 #endif
 	END(__vfork)
 
+#if IS_IN (libc)
 libc_hidden_def(__vfork)
 weak_alias (__vfork, vfork)
 strong_alias (__vfork, __libc_vfork)
+#endif
diff --git a/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S b/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S
index dc32e0a..94f2c8d 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc32/vfork.S
@@ -44,6 +44,8 @@  ENTRY(__vfork)
 	 nop
 END(__vfork)
 
+#if IS_IN (libc)
 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 05be3c2..a7479e9 100644
--- a/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S
+++ b/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S
@@ -44,6 +44,8 @@  ENTRY(__vfork)
 	 nop
 END(__vfork)
 
+#if IS_IN (libc)
 libc_hidden_def (__vfork)
 weak_alias (__vfork, vfork)
 strong_alias (__vfork, __libc_vfork)
+#endif