summaryrefslogtreecommitdiffstats
path: root/meta
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2014-06-24 14:18:19 -0700
committerRichard Purdie <richard.purdie@linuxfoundation.org>2014-06-25 13:51:45 +0100
commitad07178802d04ff475b3cac6a18f43523351da3e (patch)
treed0d6a26282a385878c5bac2907bd0ea1a73bbcb3 /meta
parent7f6a92b1c51517b63cd15752ecac853de3d6245c (diff)
downloadpoky-ad07178802d04ff475b3cac6a18f43523351da3e.tar.gz
binutils: Apply the proper fix for PR 16428
It is fixed by commit 4199e3b8669d0a36448687850374fdc2ad7240b6 Author: Alan Modra <amodra@gmail.com> Date: Wed Jan 15 21:50:55 2014 +1030 non-PIC references to __ehdr_start in pie and shared Rather than hacking every backend to not discard dynamic relocations against an undefined hidden __ehdr_start, make it appear to be defined early. We want __ehdr_start hidden before size_dynamic_sections so that it isn't put in .dynsym, but we do need the dynamic relocations for a PIE or shared library with a non-PIC reference. Defining it early is wrong if we don't actually define the symbol later to its proper value. (In some cases we want to leave the symbol undefined, for example, when the ELF header isn't loaded, and we don't have this infomation available in before_allocation.) So replace the existing patches with this one. (From OE-Core rev: db37534c412ff3f1460687611060b3c4b3f95a04) Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
Diffstat (limited to 'meta')
-rw-r--r--meta/recipes-devtools/binutils/binutils-2.24.inc3
-rw-r--r--meta/recipes-devtools/binutils/binutils/fix-pr16428.patch123
-rw-r--r--meta/recipes-devtools/binutils/binutils/fix-pr16428a.patch75
-rw-r--r--meta/recipes-devtools/binutils/binutils/fix-pr16428b.patch75
4 files changed, 124 insertions, 152 deletions
diff --git a/meta/recipes-devtools/binutils/binutils-2.24.inc b/meta/recipes-devtools/binutils/binutils-2.24.inc
index 2a9297bfbc..ef6a4eb7b3 100644
--- a/meta/recipes-devtools/binutils/binutils-2.24.inc
+++ b/meta/recipes-devtools/binutils/binutils-2.24.inc
@@ -28,8 +28,7 @@ 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 \ 31 file://fix-pr16428.patch \
32 file://fix-pr16428b.patch \
33 file://replace_macros_with_static_inline.patch \ 32 file://replace_macros_with_static_inline.patch \
34 file://0001-Fix-MMIX-build-breakage-from-bfd_set_section_vma-cha.patch \ 33 file://0001-Fix-MMIX-build-breakage-from-bfd_set_section_vma-cha.patch \
35 " 34 "
diff --git a/meta/recipes-devtools/binutils/binutils/fix-pr16428.patch b/meta/recipes-devtools/binutils/binutils/fix-pr16428.patch
new file mode 100644
index 0000000000..4584748bb2
--- /dev/null
+++ b/meta/recipes-devtools/binutils/binutils/fix-pr16428.patch
@@ -0,0 +1,123 @@
1commit 4199e3b8669d0a36448687850374fdc2ad7240b6
2Author: Alan Modra <amodra@gmail.com>
3Date: Wed Jan 15 21:50:55 2014 +1030
4
5 non-PIC references to __ehdr_start in pie and shared
6
7 Rather than hacking every backend to not discard dynamic relocations
8 against an undefined hidden __ehdr_start, make it appear to be defined
9 early. We want __ehdr_start hidden before size_dynamic_sections so
10 that it isn't put in .dynsym, but we do need the dynamic relocations
11 for a PIE or shared library with a non-PIC reference. Defining it
12 early is wrong if we don't actually define the symbol later to its
13 proper value. (In some cases we want to leave the symbol undefined,
14 for example, when the ELF header isn't loaded, and we don't have this
15 infomation available in before_allocation.)
16
17 ld/
18 * emultempl/elf32.em (gld${EMULATION_NAME}_before_allocation): Define
19 __ehdr_start before size_dynamic_sections and restore afterwards.
20 ld/testsuite/
21 * ld-elf/ehdr_start-shared.d: New.
22 * ld-elf/ehdr_start-userdef.d: xfail frv.
23 * ld-elf/ehdr_start-weak.d: Likewise.
24 * ld-elf/ehdr_start.d: Likewise.
25
26Upstream-Status: Backport
27
28diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em
29index 9a2fe89..13f86f0 100644
30--- a/ld/emultempl/elf32.em
31+++ b/ld/emultempl/elf32.em
32@@ -1480,6 +1480,8 @@ gld${EMULATION_NAME}_before_allocation (void)
33 const char *rpath;
34 asection *sinterp;
35 bfd *abfd;
36+ struct elf_link_hash_entry *ehdr_start = NULL;
37+ struct bfd_link_hash_entry ehdr_start_save;
38
39 if (is_elf_hash_table (link_info.hash))
40 {
41@@ -1504,6 +1506,16 @@ gld${EMULATION_NAME}_before_allocation (void)
42 _bfd_elf_link_hash_hide_symbol (&link_info, h, TRUE);
43 if (ELF_ST_VISIBILITY (h->other) != STV_INTERNAL)
44 h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
45+ /* Don't leave the symbol undefined. Undefined hidden
46+ symbols typically won't have dynamic relocations, but
47+ we most likely will need dynamic relocations for
48+ __ehdr_start if we are building a PIE or shared
49+ library. */
50+ ehdr_start = h;
51+ ehdr_start_save = h->root;
52+ h->root.type = bfd_link_hash_defined;
53+ h->root.u.def.section = bfd_abs_section_ptr;
54+ h->root.u.def.value = 0;
55 }
56 }
57
58@@ -1620,6 +1632,14 @@ ${ELF_INTERPRETER_SET_DEFAULT}
59
60 if (!bfd_elf_size_dynsym_hash_dynstr (link_info.output_bfd, &link_info))
61 einfo ("%P%F: failed to set dynamic section sizes: %E\n");
62+
63+ if (ehdr_start != NULL)
64+ {
65+ /* If we twiddled __ehdr_start to defined earlier, put it back
66+ as it was. */
67+ ehdr_start->root.type = ehdr_start_save.type;
68+ ehdr_start->root.u = ehdr_start_save.u;
69+ }
70 }
71
72 EOF
73diff --git a/ld/testsuite/ld-elf/ehdr_start-shared.d b/ld/testsuite/ld-elf/ehdr_start-shared.d
74new file mode 100644
75index 0000000..c17516a
76--- /dev/null
77+++ b/ld/testsuite/ld-elf/ehdr_start-shared.d
78@@ -0,0 +1,9 @@
79+#source: ehdr_start.s
80+#ld: -e _start -shared
81+#nm: -n
82+#target: *-*-linux* *-*-gnu* *-*-nacl*
83+#xfail: cris*-*-* frv-*-*
84+
85+#...
86+[0-9a-f]*000 [Adrt] __ehdr_start
87+#pass
88diff --git a/ld/testsuite/ld-elf/ehdr_start-userdef.d b/ld/testsuite/ld-elf/ehdr_start-userdef.d
89index 2a88e98..b58ae3f 100644
90--- a/ld/testsuite/ld-elf/ehdr_start-userdef.d
91+++ b/ld/testsuite/ld-elf/ehdr_start-userdef.d
92@@ -2,6 +2,7 @@
93 #ld: -e _start -T ehdr_start-userdef.t
94 #readelf: -Ws
95 #target: *-*-linux* *-*-gnu* *-*-nacl*
96+#xfail: frv-*-*
97
98 #...
99 Symbol table '\.symtab' contains [0-9]+ entries:
100diff --git a/ld/testsuite/ld-elf/ehdr_start-weak.d b/ld/testsuite/ld-elf/ehdr_start-weak.d
101index 8bd9035..24ae34c 100644
102--- a/ld/testsuite/ld-elf/ehdr_start-weak.d
103+++ b/ld/testsuite/ld-elf/ehdr_start-weak.d
104@@ -2,6 +2,7 @@
105 #ld: -e _start -T ehdr_start-missing.t
106 #nm: -n
107 #target: *-*-linux* *-*-gnu* *-*-nacl*
108+#xfail: frv-*-*
109
110 #...
111 \s+[wU] __ehdr_start
112diff --git a/ld/testsuite/ld-elf/ehdr_start.d b/ld/testsuite/ld-elf/ehdr_start.d
113index 52e5b54..d538b66 100644
114--- a/ld/testsuite/ld-elf/ehdr_start.d
115+++ b/ld/testsuite/ld-elf/ehdr_start.d
116@@ -2,6 +2,7 @@
117 #ld: -e _start
118 #nm: -n
119 #target: *-*-linux* *-*-gnu* *-*-nacl*
120+#xfail: frv-*-*
121
122 #...
123 [0-9a-f]*000 [Adrt] __ehdr_start
diff --git a/meta/recipes-devtools/binutils/binutils/fix-pr16428a.patch b/meta/recipes-devtools/binutils/binutils/fix-pr16428a.patch
deleted file mode 100644
index 5b3edfbd03..0000000000
--- a/meta/recipes-devtools/binutils/binutils/fix-pr16428a.patch
+++ /dev/null
@@ -1,75 +0,0 @@
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
deleted file mode 100644
index 35aa7b577d..0000000000
--- a/meta/recipes-devtools/binutils/binutils/fix-pr16428b.patch
+++ /dev/null
@@ -1,75 +0,0 @@
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;