summaryrefslogtreecommitdiff
path: root/cross/cross-binutils/binutils-2.24-shared-pie.patch
diff options
context:
space:
mode:
Diffstat (limited to 'cross/cross-binutils/binutils-2.24-shared-pie.patch')
-rw-r--r--cross/cross-binutils/binutils-2.24-shared-pie.patch99
1 files changed, 99 insertions, 0 deletions
diff --git a/cross/cross-binutils/binutils-2.24-shared-pie.patch b/cross/cross-binutils/binutils-2.24-shared-pie.patch
new file mode 100644
index 000000000..d40aa47e0
--- /dev/null
+++ b/cross/cross-binutils/binutils-2.24-shared-pie.patch
@@ -0,0 +1,99 @@
+diff --git a/ld/emultempl/elf32.em b/ld/emultempl/elf32.em
+index 9a2fe89..13f86f0 100644
+--- a/ld/emultempl/elf32.em
++++ b/ld/emultempl/elf32.em
+@@ -1480,6 +1480,8 @@ gld${EMULATION_NAME}_before_allocation (void)
+ const char *rpath;
+ asection *sinterp;
+ bfd *abfd;
++ struct elf_link_hash_entry *ehdr_start = NULL;
++ struct bfd_link_hash_entry ehdr_start_save;
+
+ if (is_elf_hash_table (link_info.hash))
+ {
+@@ -1504,6 +1506,16 @@ gld${EMULATION_NAME}_before_allocation (void)
+ _bfd_elf_link_hash_hide_symbol (&link_info, h, TRUE);
+ if (ELF_ST_VISIBILITY (h->other) != STV_INTERNAL)
+ h->other = (h->other & ~ELF_ST_VISIBILITY (-1)) | STV_HIDDEN;
++ /* Don't leave the symbol undefined. Undefined hidden
++ symbols typically won't have dynamic relocations, but
++ we most likely will need dynamic relocations for
++ __ehdr_start if we are building a PIE or shared
++ library. */
++ ehdr_start = h;
++ ehdr_start_save = h->root;
++ h->root.type = bfd_link_hash_defined;
++ h->root.u.def.section = bfd_abs_section_ptr;
++ h->root.u.def.value = 0;
+ }
+ }
+
+@@ -1620,6 +1632,14 @@ ${ELF_INTERPRETER_SET_DEFAULT}
+
+ if (!bfd_elf_size_dynsym_hash_dynstr (link_info.output_bfd, &link_info))
+ einfo ("%P%F: failed to set dynamic section sizes: %E\n");
++
++ if (ehdr_start != NULL)
++ {
++ /* If we twiddled __ehdr_start to defined earlier, put it back
++ as it was. */
++ ehdr_start->root.type = ehdr_start_save.type;
++ ehdr_start->root.u = ehdr_start_save.u;
++ }
+ }
+
+ EOF
+diff --git a/ld/testsuite/ld-elf/ehdr_start-shared.d b/ld/testsuite/ld-elf/ehdr_start-shared.d
+new file mode 100644
+index 0000000..c17516a
+--- /dev/null
++++ b/ld/testsuite/ld-elf/ehdr_start-shared.d
+@@ -0,0 +1,9 @@
++#source: ehdr_start.s
++#ld: -e _start -shared
++#nm: -n
++#target: *-*-linux* *-*-gnu* *-*-nacl*
++#xfail: cris*-*-* frv-*-*
++
++#...
++[0-9a-f]*000 [Adrt] __ehdr_start
++#pass
+diff --git a/ld/testsuite/ld-elf/ehdr_start-userdef.d b/ld/testsuite/ld-elf/ehdr_start-userdef.d
+index 2a88e98..b58ae3f 100644
+--- a/ld/testsuite/ld-elf/ehdr_start-userdef.d
++++ b/ld/testsuite/ld-elf/ehdr_start-userdef.d
+@@ -2,6 +2,7 @@
+ #ld: -e _start -T ehdr_start-userdef.t
+ #readelf: -Ws
+ #target: *-*-linux* *-*-gnu* *-*-nacl*
++#xfail: frv-*-*
+
+ #...
+ Symbol table '\.symtab' contains [0-9]+ entries:
+diff --git a/ld/testsuite/ld-elf/ehdr_start-weak.d b/ld/testsuite/ld-elf/ehdr_start-weak.d
+index 8bd9035..24ae34c 100644
+--- a/ld/testsuite/ld-elf/ehdr_start-weak.d
++++ b/ld/testsuite/ld-elf/ehdr_start-weak.d
+@@ -2,6 +2,7 @@
+ #ld: -e _start -T ehdr_start-missing.t
+ #nm: -n
+ #target: *-*-linux* *-*-gnu* *-*-nacl*
++#xfail: frv-*-*
+
+ #...
+ \s+[wU] __ehdr_start
+diff --git a/ld/testsuite/ld-elf/ehdr_start.d b/ld/testsuite/ld-elf/ehdr_start.d
+index 52e5b54..d538b66 100644
+--- a/ld/testsuite/ld-elf/ehdr_start.d
++++ b/ld/testsuite/ld-elf/ehdr_start.d
+@@ -2,6 +2,7 @@
+ #ld: -e _start
+ #nm: -n
+ #target: *-*-linux* *-*-gnu* *-*-nacl*
++#xfail: frv-*-*
+
+ #...
+ [0-9a-f]*000 [Adrt] __ehdr_start
+--
+1.7.1
+