aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--recipes-microblaze/glibc/files/MicroBlaze-fix-up-pt-vfork-symbol-definitions.patch105
-rw-r--r--recipes-microblaze/glibc/glibc-initial_2.24.bbappend4
-rw-r--r--recipes-microblaze/glibc/glibc_2.24.bbappend4
3 files changed, 113 insertions, 0 deletions
diff --git a/recipes-microblaze/glibc/files/MicroBlaze-fix-up-pt-vfork-symbol-definitions.patch b/recipes-microblaze/glibc/files/MicroBlaze-fix-up-pt-vfork-symbol-definitions.patch
new file mode 100644
index 00000000..ed37d634
--- /dev/null
+++ b/recipes-microblaze/glibc/files/MicroBlaze-fix-up-pt-vfork-symbol-definitions.patch
@@ -0,0 +1,105 @@
+From 873fc4bf58d6cc8d579a65224350ce3adddc6c2a Mon Sep 17 00:00:00 2001
+From: Nathan Rossi <nathan@nathanrossi.com>
+Date: Wed, 23 Nov 2016 22:30:29 +1000
+Subject: [PATCH] MicroBlaze: fix up pt-vfork symbol definitions
+
+Due to the reuse of the alpha/pt-vfork.S implementation additional
+symbols are emitted for libpthread which are invalid due to the
+non-existence of a '__libc_vfork' symbol/implementation. A symbol is
+emitted which references __libc_vfork and is invalid which causes the
+linker to emit a corrupt symbol entry:
+
+ 180: 00000000 0x24a91 NOTYPE LOCAL DEFAULT UND <corrupt>
+
+Depending on the internals of the linker this corrupt symbol is either a
+valid symbol as above or an completely invalid symbol that causes issues
+when linking against libpthread.so:
+
+ 179: 0000564b 0x825fd688 <OS specific>: 11 <unknown>: 4 HIDDEN
+ [<other>: 54] UND <corrupt>
+
+In both cases this is the 'vfork@GLIBC_2.18' compat_symbol which is
+aliased as the local '__libc_vfork'. (in libpthread.so)
+
+ 12: 00000000 0 NOTYPE GLOBAL DEFAULT UND vfork@GLIBC_2.18
+
+Due to how MicroBlaze differs from other architectures, it is special in
+that it only implements '__vfork' and due to the weak_alias in vfork.S
+also defines 'vfork' for both libc and libpthread. No other symbols
+(e.g. '__vfork_compat') are part of the ABI.
+
+This change removes the compatible symbol generation provided by
+alpha/pt-vfork.S and sets up the 'vfork' and '__vfork' symbols to be
+provided in libpthread based on SHLIB_COMPAT. This avoids the generation
+of invalid symbols but maintains the expected libc and libpthread vfork
+ABIs.
+
+Signed-off-by: Nathan Rossi <nathan@nathanrossi.com>
+Upstream-Status: Pending
+---
+ sysdeps/unix/sysv/linux/microblaze/pt-vfork.S | 40 ++++++++++++++++++++++++++-
+ sysdeps/unix/sysv/linux/microblaze/vfork.S | 4 ++-
+ 2 files changed, 42 insertions(+), 2 deletions(-)
+
+diff --git a/sysdeps/unix/sysv/linux/microblaze/pt-vfork.S b/sysdeps/unix/sysv/linux/microblaze/pt-vfork.S
+index 65cc3823ac..82bc36eecc 100644
+--- a/sysdeps/unix/sysv/linux/microblaze/pt-vfork.S
++++ b/sysdeps/unix/sysv/linux/microblaze/pt-vfork.S
+@@ -1 +1,39 @@
+-#include <sysdeps/unix/sysv/linux/alpha/pt-vfork.S>
++/* vfork ABI-compatibility entry points for libpthread.
++ Copyright (C) 2014-2016 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <http://www.gnu.org/licenses/>. */
++
++#include <shlib-compat.h>
++
++/* libpthread used to have its own vfork implementation that differed
++ from libc's only in having a pointless micro-optimization. There
++ is no longer any use to having a separate copy in libpthread, but
++ the historical ABI requires it. For static linking, there is no
++ need to provide anything here--the libc version will be linked in.
++ For shared library ABI compatibility, there must be __vfork and
++ vfork symbols in libpthread.so. */
++
++#if (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
++ || SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20))
++
++#include <vfork.S>
++
++#endif
++
++#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
++weak_alias (__vfork, vfork)
++#endif
++
+diff --git a/sysdeps/unix/sysv/linux/microblaze/vfork.S b/sysdeps/unix/sysv/linux/microblaze/vfork.S
+index 9592cb4f28..b537f1ce34 100644
+--- a/sysdeps/unix/sysv/linux/microblaze/vfork.S
++++ b/sysdeps/unix/sysv/linux/microblaze/vfork.S
+@@ -40,6 +40,8 @@ ENTRY (__vfork)
+ nop
+
+ PSEUDO_END (__vfork)
+-libc_hidden_def (__vfork)
+
++#if IS_IN (libc)
+ weak_alias (__vfork, vfork)
++libc_hidden_def (__vfork)
++#endif
+--
+2.10.2
+
diff --git a/recipes-microblaze/glibc/glibc-initial_2.24.bbappend b/recipes-microblaze/glibc/glibc-initial_2.24.bbappend
new file mode 100644
index 00000000..a4beb0b8
--- /dev/null
+++ b/recipes-microblaze/glibc/glibc-initial_2.24.bbappend
@@ -0,0 +1,4 @@
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+SRC_URI += "file://MicroBlaze-fix-up-pt-vfork-symbol-definitions.patch"
+
diff --git a/recipes-microblaze/glibc/glibc_2.24.bbappend b/recipes-microblaze/glibc/glibc_2.24.bbappend
new file mode 100644
index 00000000..a4beb0b8
--- /dev/null
+++ b/recipes-microblaze/glibc/glibc_2.24.bbappend
@@ -0,0 +1,4 @@
+
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+SRC_URI += "file://MicroBlaze-fix-up-pt-vfork-symbol-definitions.patch"
+