summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNathan Rossi <nathan@nathanrossi.com>2016-11-24 21:38:28 +1000
committerNathan Rossi <nathan@nathanrossi.com>2016-12-01 23:12:45 +1000
commitcacffe476cf8f7eda6ed574c476e456d2e8ab670 (patch)
treef6a4dcac4c1413f83a284425cfe78544fbf28a19
parent1783cfc3809510d29664bfdc47b89fbe602b84c2 (diff)
downloadmeta-xilinx-cacffe476cf8f7eda6ed574c476e456d2e8ab670.tar.gz
glibc: Fix up MicroBlaze pt-vfork compat symbols
A bug has been present in glibc for a while where a symbol is emitted in libpthread.so which is corrupt. Whilst previously this has not been an issue due to how binutils has handled it, recent binutils behaviour has changed enough to make this bug surface as a linker error. Depending on the host (behaviour and native dependencies) the cross binutils that is built may emit different values for the corrupt symbol. This appears as an error similar to the following when linking against libpthread.so (e.g. librt links against libpthread in glibc): invalid string offset 1843814912 >= 4913 for section `.dynstr' This patch fixes up the symbols emitted for libpthread.so without breaking any libpthread or libc ABI. See the glibc patch for more specifics. Signed-off-by: Nathan Rossi <nathan@nathanrossi.com>
-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 @@
1From 873fc4bf58d6cc8d579a65224350ce3adddc6c2a Mon Sep 17 00:00:00 2001
2From: Nathan Rossi <nathan@nathanrossi.com>
3Date: Wed, 23 Nov 2016 22:30:29 +1000
4Subject: [PATCH] MicroBlaze: fix up pt-vfork symbol definitions
5
6Due to the reuse of the alpha/pt-vfork.S implementation additional
7symbols are emitted for libpthread which are invalid due to the
8non-existence of a '__libc_vfork' symbol/implementation. A symbol is
9emitted which references __libc_vfork and is invalid which causes the
10linker to emit a corrupt symbol entry:
11
12 180: 00000000 0x24a91 NOTYPE LOCAL DEFAULT UND <corrupt>
13
14Depending on the internals of the linker this corrupt symbol is either a
15valid symbol as above or an completely invalid symbol that causes issues
16when linking against libpthread.so:
17
18 179: 0000564b 0x825fd688 <OS specific>: 11 <unknown>: 4 HIDDEN
19 [<other>: 54] UND <corrupt>
20
21In both cases this is the 'vfork@GLIBC_2.18' compat_symbol which is
22aliased as the local '__libc_vfork'. (in libpthread.so)
23
24 12: 00000000 0 NOTYPE GLOBAL DEFAULT UND vfork@GLIBC_2.18
25
26Due to how MicroBlaze differs from other architectures, it is special in
27that it only implements '__vfork' and due to the weak_alias in vfork.S
28also defines 'vfork' for both libc and libpthread. No other symbols
29(e.g. '__vfork_compat') are part of the ABI.
30
31This change removes the compatible symbol generation provided by
32alpha/pt-vfork.S and sets up the 'vfork' and '__vfork' symbols to be
33provided in libpthread based on SHLIB_COMPAT. This avoids the generation
34of invalid symbols but maintains the expected libc and libpthread vfork
35ABIs.
36
37Signed-off-by: Nathan Rossi <nathan@nathanrossi.com>
38Upstream-Status: Pending
39---
40 sysdeps/unix/sysv/linux/microblaze/pt-vfork.S | 40 ++++++++++++++++++++++++++-
41 sysdeps/unix/sysv/linux/microblaze/vfork.S | 4 ++-
42 2 files changed, 42 insertions(+), 2 deletions(-)
43
44diff --git a/sysdeps/unix/sysv/linux/microblaze/pt-vfork.S b/sysdeps/unix/sysv/linux/microblaze/pt-vfork.S
45index 65cc3823ac..82bc36eecc 100644
46--- a/sysdeps/unix/sysv/linux/microblaze/pt-vfork.S
47+++ b/sysdeps/unix/sysv/linux/microblaze/pt-vfork.S
48@@ -1 +1,39 @@
49-#include <sysdeps/unix/sysv/linux/alpha/pt-vfork.S>
50+/* vfork ABI-compatibility entry points for libpthread.
51+ Copyright (C) 2014-2016 Free Software Foundation, Inc.
52+ This file is part of the GNU C Library.
53+
54+ The GNU C Library is free software; you can redistribute it and/or
55+ modify it under the terms of the GNU Lesser General Public
56+ License as published by the Free Software Foundation; either
57+ version 2.1 of the License, or (at your option) any later version.
58+
59+ The GNU C Library is distributed in the hope that it will be useful,
60+ but WITHOUT ANY WARRANTY; without even the implied warranty of
61+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
62+ Lesser General Public License for more details.
63+
64+ You should have received a copy of the GNU Lesser General Public
65+ License along with the GNU C Library; if not, see
66+ <http://www.gnu.org/licenses/>. */
67+
68+#include <shlib-compat.h>
69+
70+/* libpthread used to have its own vfork implementation that differed
71+ from libc's only in having a pointless micro-optimization. There
72+ is no longer any use to having a separate copy in libpthread, but
73+ the historical ABI requires it. For static linking, there is no
74+ need to provide anything here--the libc version will be linked in.
75+ For shared library ABI compatibility, there must be __vfork and
76+ vfork symbols in libpthread.so. */
77+
78+#if (SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20) \
79+ || SHLIB_COMPAT (libpthread, GLIBC_2_1_2, GLIBC_2_20))
80+
81+#include <vfork.S>
82+
83+#endif
84+
85+#if SHLIB_COMPAT (libpthread, GLIBC_2_0, GLIBC_2_20)
86+weak_alias (__vfork, vfork)
87+#endif
88+
89diff --git a/sysdeps/unix/sysv/linux/microblaze/vfork.S b/sysdeps/unix/sysv/linux/microblaze/vfork.S
90index 9592cb4f28..b537f1ce34 100644
91--- a/sysdeps/unix/sysv/linux/microblaze/vfork.S
92+++ b/sysdeps/unix/sysv/linux/microblaze/vfork.S
93@@ -40,6 +40,8 @@ ENTRY (__vfork)
94 nop
95
96 PSEUDO_END (__vfork)
97-libc_hidden_def (__vfork)
98
99+#if IS_IN (libc)
100 weak_alias (__vfork, vfork)
101+libc_hidden_def (__vfork)
102+#endif
103--
1042.10.2
105
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 @@
1
2FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
3SRC_URI += "file://MicroBlaze-fix-up-pt-vfork-symbol-definitions.patch"
4
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 @@
1
2FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
3SRC_URI += "file://MicroBlaze-fix-up-pt-vfork-symbol-definitions.patch"
4