summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRichard Purdie <richard.purdie@linuxfoundation.org>2014-03-25 10:29:26 +0000
committerRichard Purdie <richard.purdie@linuxfoundation.org>2014-03-25 21:26:49 +0000
commitffa8bbf96524c18d40a18334d5f05f3d27737466 (patch)
treee2e0a63a2b7d5fa2a67068c0e5fc04f99ca28263
parent8dd12d796c3c11cff09b9bfb1b975872749a77cf (diff)
downloadpoky-ffa8bbf96524c18d40a18334d5f05f3d27737466.tar.gz
binutils: Add fixes for binutils issue 16428
"ld:i386 crashes with -static -fPIE -pie" https://bugs.launchpad.net/ubuntu/+source/binutils/+bug/1266492 This adds in two upstream binutils fixes to avoid the internal error triggered by the combination of -static with -pie on x86 builds. This triggers a backtrace which then triggers a bug in glibc where the process ends up hanging on some systems with broken libcs. We can't fix the libc but we can stop the internal error and hence avoid the hanging builds. (From OE-Core rev: e949f9a8fc337bd768c7e8a3fd082775a94e0ad4) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
-rw-r--r--meta/recipes-devtools/binutils/binutils-2.24.inc2
-rw-r--r--meta/recipes-devtools/binutils/binutils/fix-pr16428a.patch75
-rw-r--r--meta/recipes-devtools/binutils/binutils/fix-pr16428b.patch75
3 files changed, 152 insertions, 0 deletions
diff --git a/meta/recipes-devtools/binutils/binutils-2.24.inc b/meta/recipes-devtools/binutils/binutils-2.24.inc
index 42d4ede229..6415a6fbdc 100644
--- a/meta/recipes-devtools/binutils/binutils-2.24.inc
+++ b/meta/recipes-devtools/binutils/binutils-2.24.inc
@@ -28,6 +28,8 @@ SRC_URI = "\
28 file://fix-pr15815.patch \ 28 file://fix-pr15815.patch \
29 file://fix-pr2404.patch \ 29 file://fix-pr2404.patch \
30 file://fix-pr16476.patch \ 30 file://fix-pr16476.patch \
31 file://fix-pr16428a.patch \
32 file://fix-pr16428b.patch \
31 " 33 "
32 34
33SRC_URI[md5sum] = "e0f71a7b2ddab0f8612336ac81d9636b" 35SRC_URI[md5sum] = "e0f71a7b2ddab0f8612336ac81d9636b"
diff --git a/meta/recipes-devtools/binutils/binutils/fix-pr16428a.patch b/meta/recipes-devtools/binutils/binutils/fix-pr16428a.patch
new file mode 100644
index 0000000000..5b3edfbd03
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/fix-pr16428a.patch
@@ -0,0 +1,75 @@
1From d1ec1e40b5b457c92aaa23f7af40e026e4596a99 Mon Sep 17 00:00:00 2001
2From: H.J. Lu <hjl.tools@gmail.com>
3Date: Tue, 14 Jan 2014 10:48:39 -0800
4Subject: [PATCH 1/1] Don't update reloc count if there are any non pc-relative relocs
5
6 PR ld/16428
7 * elf32-i386.c (elf_i386_allocate_dynrelocs): Don't update reloc
8 count if there are any non pc-relative relocs.
9 * elf64-x86-64.c (elf_x86_64_allocate_dynrelocs): Likewise.
10---
11 bfd/ChangeLog | 7 +++++++
12 bfd/elf32-i386.c | 9 +++++++--
13 bfd/elf64-x86-64.c | 9 +++++++--
14 3 files changed, 21 insertions(+), 4 deletions(-)
15
16Upstream-Status: Backport
17
18#diff --git a/bfd/ChangeLog b/bfd/ChangeLog
19#index a8f1f94..7a49fd1 100644
20#--- a/bfd/ChangeLog
21#+++ b/bfd/ChangeLog
22#@@ -1,3 +1,10 @@
23#+2014-01-14 H.J. Lu <hongjiu.lu@intel.com>
24#+
25#+ PR ld/16428
26#+ * elf32-i386.c (elf_i386_allocate_dynrelocs): Don't update reloc
27#+ count if there are any non pc-relative relocs.
28#+ * elf64-x86-64.c (elf_x86_64_allocate_dynrelocs): Likewise.
29#+
30# 2014-01-14 Michael Hudson-Doyle <michael.hudson@linaro.org>
31# Kugan Vivekanandarajah <kugan.vivekanandarajah@linaro.org>
32#
33diff --git a/bfd/elf32-i386.c b/bfd/elf32-i386.c
34index 4d391e1..d7f59e5 100644
35--- a/bfd/elf32-i386.c
36+++ b/bfd/elf32-i386.c
37@@ -2368,8 +2368,13 @@ elf_i386_allocate_dynrelocs (struct elf_link_hash_entry *h, void *inf)
38
39 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
40 {
41- p->count -= p->pc_count;
42- p->pc_count = 0;
43+ /* Don't update reloc count if there are any non
44+ pc-relative relocs. */
45+ if (!h->pointer_equality_needed)
46+ {
47+ p->count -= p->pc_count;
48+ p->pc_count = 0;
49+ }
50 if (p->count == 0)
51 *pp = p->next;
52 else
53diff --git a/bfd/elf64-x86-64.c b/bfd/elf64-x86-64.c
54index edee8ec..999011b 100644
55--- a/bfd/elf64-x86-64.c
56+++ b/bfd/elf64-x86-64.c
57@@ -2463,8 +2463,13 @@ elf_x86_64_allocate_dynrelocs (struct elf_link_hash_entry *h, void * inf)
58
59 for (pp = &eh->dyn_relocs; (p = *pp) != NULL; )
60 {
61- p->count -= p->pc_count;
62- p->pc_count = 0;
63+ /* Don't update reloc count if there are any non
64+ pc-relative relocs. */
65+ if (!h->pointer_equality_needed)
66+ {
67+ p->count -= p->pc_count;
68+ p->pc_count = 0;
69+ }
70 if (p->count == 0)
71 *pp = p->next;
72 else
73--
741.7.1
75
diff --git a/meta/recipes-devtools/binutils/binutils/fix-pr16428b.patch b/meta/recipes-devtools/binutils/binutils/fix-pr16428b.patch
new file mode 100644
index 0000000000..35aa7b577d
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/fix-pr16428b.patch
@@ -0,0 +1,75 @@
1From 818d220a6fe3d0512a226188e9164245a02c9185 Mon Sep 17 00:00:00 2001
2From: H.J. Lu <hjl.tools@gmail.com>
3Date: Tue, 14 Jan 2014 16:42:35 -0800
4Subject: [PATCH] Don't discard relocs against __ehdr_start
5
6__ehdr_start will be defined by assign_file_positions_for_non_load_sections
7later.
8
9 PR ld/16428
10 * elf32-i386.c (elf_i386_allocate_dynrelocs): Don't discard relocs
11 against __ehdr_start.
12 * elf64-x86-64.c (elf_x86_64_allocate_dynrelocs): Likewise.
13---
14 bfd/ChangeLog | 7 +++++++
15 bfd/elf32-i386.c | 7 +++++--
16 bfd/elf64-x86-64.c | 7 +++++--
17 3 files changed, 17 insertions(+), 4 deletions(-)
18
19Upstream-Status: Backport
20
21#diff --git a/bfd/ChangeLog b/bfd/ChangeLog
22#index 7d13a35..f4acda0 100644
23#--- a/bfd/ChangeLog
24#+++ b/bfd/ChangeLog
25#@@ -1,5 +1,12 @@
26# 2014-01-14 H.J. Lu <hongjiu.lu@intel.com>
27#
28#+ PR ld/16428
29#+ * elf32-i386.c (elf_i386_allocate_dynrelocs): Don't discard relocs
30#+ against __ehdr_start.
31#+ * elf64-x86-64.c (elf_x86_64_allocate_dynrelocs): Likewise.
32#+
33#+2014-01-14 H.J. Lu <hongjiu.lu@intel.com>
34#+
35# * elf32-i386.c (elf_i386_allocate_dynrelocs): Revert the last
36# change.
37# * elf64-x86-64.c (elf_x86_64_allocate_dynrelocs): Likewise.
38Index: binutils-2.24/bfd/elf32-i386.c
39===================================================================
40--- binutils-2.24.orig/bfd/elf32-i386.c 2014-03-25 10:26:54.818385608 +0000
41+++ binutils-2.24/bfd/elf32-i386.c 2014-03-25 10:26:54.814385607 +0000
42@@ -2395,9 +2395,12 @@
43 }
44
45 /* Also discard relocs on undefined weak syms with non-default
46- visibility. */
47+ visibility. Don't discard relocs against __ehdr_start which
48+ will be defined by assign_file_positions_for_non_load_sections
49+ later. */
50 if (eh->dyn_relocs != NULL
51- && h->root.type == bfd_link_hash_undefweak)
52+ && h->root.type == bfd_link_hash_undefweak
53+ && strcmp (h->root.root.string, "__ehdr_start") != 0)
54 {
55 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
56 eh->dyn_relocs = NULL;
57Index: binutils-2.24/bfd/elf64-x86-64.c
58===================================================================
59--- binutils-2.24.orig/bfd/elf64-x86-64.c 2014-03-25 10:26:54.818385608 +0000
60+++ binutils-2.24/bfd/elf64-x86-64.c 2014-03-25 10:26:54.814385607 +0000
61@@ -2478,9 +2478,12 @@
62 }
63
64 /* Also discard relocs on undefined weak syms with non-default
65- visibility. */
66+ visibility. Don't discard relocs against __ehdr_start which
67+ will be defined by assign_file_positions_for_non_load_sections
68+ later. */
69 if (eh->dyn_relocs != NULL
70- && h->root.type == bfd_link_hash_undefweak)
71+ && h->root.type == bfd_link_hash_undefweak
72+ && strcmp (h->root.root.string, "__ehdr_start") != 0)
73 {
74 if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT)
75 eh->dyn_relocs = NULL;