diff --git a/binutils-aarch64-pie.patch b/binutils-aarch64-pie.patch new file mode 100644 index 0000000..0860795 --- /dev/null +++ b/binutils-aarch64-pie.patch @@ -0,0 +1,193 @@ +Only in binutils-2.29.1/bfd: ChangeLog.orig +Only in binutils-2.29.1/bfd: ChangeLog.rej +diff -rup binutils.orig/bfd/elf64-s390.c binutils-2.29.1/bfd/elf64-s390.c +--- binutils.orig/bfd/elf64-s390.c 2018-01-22 12:10:06.282231202 +0000 ++++ binutils-2.29.1/bfd/elf64-s390.c 2018-01-22 12:32:36.743617339 +0000 +@@ -1600,8 +1600,7 @@ elf_s390_adjust_dynamic_symbol (struct b + { + if (h->plt.refcount <= 0 + || SYMBOL_CALLS_LOCAL (info, h) +- || (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT +- && h->root.type == bfd_link_hash_undefweak)) ++ || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) + { + /* This case can occur if we saw a PLT32 reloc in an input + file, but the symbol was never referred to by a dynamic +@@ -1850,8 +1849,7 @@ allocate_dynrelocs (struct elf_link_hash + htab->elf.srelgot->size += sizeof (Elf64_External_Rela); + else if (tls_type == GOT_TLS_GD) + htab->elf.srelgot->size += 2 * sizeof (Elf64_External_Rela); +- else if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT +- || h->root.type != bfd_link_hash_undefweak) ++ else if (!UNDEFWEAK_NO_DYNAMIC_RELOC (info, h) + && (bfd_link_pic (info) + || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))) + htab->elf.srelgot->size += sizeof (Elf64_External_Rela); +@@ -1890,7 +1888,8 @@ allocate_dynrelocs (struct elf_link_hash + if (eh->dyn_relocs != NULL + && h->root.type == bfd_link_hash_undefweak) + { +- if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT) ++ if (ELF_ST_VISIBILITY (h->other) != STV_DEFAULT ++ || UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) + eh->dyn_relocs = NULL; + + /* Make sure undefined weak symbols are output as a dynamic +@@ -2307,6 +2306,7 @@ elf_s390_relocate_section (bfd *output_b + bfd_reloc_status_type r; + int tls_type; + asection *base_got = htab->elf.sgot; ++ bfd_boolean resolved_to_zero; + + r_type = ELF64_R_TYPE (rel->r_info); + if (r_type == (int) R_390_GNU_VTINHERIT +@@ -2402,6 +2402,9 @@ elf_s390_relocate_section (bfd *output_b + if (bfd_link_relocatable (info)) + continue; + ++ resolved_to_zero = (h != NULL ++ && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)); ++ + switch (r_type) + { + case R_390_GOTPLT12: +@@ -2489,8 +2492,7 @@ elf_s390_relocate_section (bfd *output_b + h) + || (bfd_link_pic (info) + && SYMBOL_REFERENCES_LOCAL (info, h)) +- || (ELF_ST_VISIBILITY (h->other) +- && h->root.type == bfd_link_hash_undefweak)) ++ || resolved_to_zero) + { + /* This is actually a static link, or it is a + -Bsymbolic link and the symbol is defined +@@ -2804,7 +2806,8 @@ elf_s390_relocate_section (bfd *output_b + + if ((bfd_link_pic (info) + && (h == NULL +- || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT ++ || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT ++ && !resolved_to_zero) + || h->root.type != bfd_link_hash_undefweak) + && ((r_type != R_390_PC16 + && r_type != R_390_PC12DBL +@@ -3592,6 +3595,9 @@ elf_s390_finish_dynamic_symbol (bfd *out + else if (bfd_link_pic (info) + && SYMBOL_REFERENCES_LOCAL (info, h)) + { ++ if (UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) ++ return TRUE; ++ + /* If this is a static link, or it is a -Bsymbolic link and + the symbol is defined locally or was forced to be local + because of a version file, we just want to emit a +Only in binutils-2.29.1/bfd: elf64-s390.c.orig +diff -rup binutils.orig/bfd/elf-bfd.h binutils-2.29.1/bfd/elf-bfd.h +--- binutils.orig/bfd/elf-bfd.h 2018-01-22 12:10:06.277231259 +0000 ++++ binutils-2.29.1/bfd/elf-bfd.h 2018-01-22 12:30:14.318245660 +0000 +@@ -266,6 +266,13 @@ struct elf_link_hash_entry + #define SYMBOL_CALLS_LOCAL(INFO, H) \ + _bfd_elf_symbol_refs_local_p (H, INFO, 1) + ++/* Whether an undefined weak symbol should resolve to its link-time ++ value, even in PIC or PIE objects. */ ++#define UNDEFWEAK_NO_DYNAMIC_RELOC(INFO, H) \ ++ ((H)->root.type == bfd_link_hash_undefweak \ ++ && (ELF_ST_VISIBILITY ((H)->other) != STV_DEFAULT \ ++ || (INFO)->dynamic_undefined_weak == 0)) ++ + /* Common symbols that are turned into definitions don't have the + DEF_REGULAR flag set, so they might appear to be undefined. + Symbols defined in linker scripts also don't have DEF_REGULAR set. */ +diff -rup binutils.orig/bfd/elfnn-aarch64.c binutils-2.29.1/bfd/elfnn-aarch64.c +--- binutils.orig/bfd/elfnn-aarch64.c 2018-01-22 12:10:06.271231328 +0000 ++++ binutils-2.29.1/bfd/elfnn-aarch64.c 2018-01-22 12:35:13.030825190 +0000 +@@ -4578,7 +4578,7 @@ aarch64_can_relax_tls (bfd *input_bfd, + if (symbol_got_type == GOT_TLS_IE && GOT_TLS_GD_ANY_P (reloc_got_type)) + return TRUE; + +- if (bfd_link_pic (info)) ++ if (!bfd_link_executable (info)) + return FALSE; + + if (h && h->root.type == bfd_link_hash_undefweak) +@@ -4951,6 +4951,7 @@ elfNN_aarch64_final_link_relocate (reloc + bfd_boolean relative_reloc; + asection *base_got; + bfd_vma orig_value = value; ++ bfd_boolean resolved_to_zero; + + globals = elf_aarch64_hash_table (info); + +@@ -5176,6 +5177,9 @@ bad_ifunc_reloc: + } + } + ++ resolved_to_zero = (h != NULL ++ && UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)); ++ + switch (bfd_r_type) + { + case BFD_RELOC_AARCH64_NONE: +@@ -5194,7 +5198,8 @@ bad_ifunc_reloc: + || globals->root.is_relocatable_executable) + && (input_section->flags & SEC_ALLOC) + && (h == NULL +- || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT ++ || (ELF_ST_VISIBILITY (h->other) == STV_DEFAULT ++ && !resolved_to_zero) + || h->root.type != bfd_link_hash_undefweak)) + /* Or we are creating an executable, we may need to keep relocations + for symbols satisfied by a dynamic library if we manage to avoid +@@ -6246,7 +6251,7 @@ elfNN_aarch64_relocate_section (bfd *out + indx = h && h->dynindx != -1 ? h->dynindx : 0; + + need_relocs = +- (bfd_link_pic (info) || indx != 0) && ++ (!bfd_link_executable (info) || indx != 0) && + (h == NULL + || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT + || h->root.type != bfd_link_hash_undefweak); +@@ -6341,7 +6346,7 @@ elfNN_aarch64_relocate_section (bfd *out + indx = h && h->dynindx != -1 ? h->dynindx : 0; + + need_relocs = +- (bfd_link_pic (info) || indx != 0) && ++ (!bfd_link_executable (info) || indx != 0) && + (h == NULL + || ELF_ST_VISIBILITY (h->other) == STV_DEFAULT + || h->root.type != bfd_link_hash_undefweak); +@@ -8195,7 +8200,10 @@ elfNN_aarch64_allocate_dynrelocs (struct + if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT + || h->root.type != bfd_link_hash_undefweak) + && (bfd_link_pic (info) +- || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))) ++ || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h)) ++ /* Undefined weak symbol in static PIE resolves to 0 without ++ any dynamic relocations. */ ++ && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) + { + htab->root.srelgot->size += RELOC_SIZE (htab); + } +@@ -8227,7 +8235,7 @@ elfNN_aarch64_allocate_dynrelocs (struct + indx = h && h->dynindx != -1 ? h->dynindx : 0; + if ((ELF_ST_VISIBILITY (h->other) == STV_DEFAULT + || h->root.type != bfd_link_hash_undefweak) +- && (bfd_link_pic (info) ++ && (!bfd_link_executable (info) + || indx != 0 + || WILL_CALL_FINISH_DYNAMIC_SYMBOL (dyn, 0, h))) + { +@@ -8995,7 +9003,10 @@ elfNN_aarch64_finish_dynamic_symbol (bfd + } + + if (h->got.offset != (bfd_vma) - 1 +- && elf_aarch64_hash_entry (h)->got_type == GOT_NORMAL) ++ && elf_aarch64_hash_entry (h)->got_type == GOT_NORMAL ++ /* Undefined weak symbol in static PIE resolves to 0 without ++ any dynamic relocations. */ ++ && !UNDEFWEAK_NO_DYNAMIC_RELOC (info, h)) + { + Elf_Internal_Rela rela; + bfd_byte *loc; +Only in binutils-2.29.1/bfd: elfnn-aarch64.c.orig diff --git a/binutils.spec b/binutils.spec index f930a40..5967eff 100644 --- a/binutils.spec +++ b/binutils.spec @@ -54,7 +54,7 @@ Summary: A GNU collection of binary utilities Name: %{?cross}binutils%{?_with_debug:-debug} Version: 2.29.1 -Release: 12%{?dist} +Release: 13%{?dist} License: GPLv3+ Group: Development/Tools URL: https://sourceware.org/binutils @@ -159,6 +159,11 @@ Patch13: binutils-support-v3-build-notes.patch # Lifetime: Fixed in 2.30. Patch14: binutils-z-undefs.patch +# Purpose: Fixes bugs in AArch64 static PIE support. Specifically: FSF PRs +# 22263 and 22269. +# Lifetime: Fixed in 2.30. +Patch15: binutils-aarch64-pie.patch + #---------------------------------------------------------------------------- Provides: bundled(libiberty) @@ -295,6 +300,7 @@ using libelf instead of BFD. %patch12 -p1 %patch13 -p1 %patch14 -p1 +%patch15 -p1 # We cannot run autotools as there is an exact requirement of autoconf-2.59. @@ -699,6 +705,9 @@ exit 0 #---------------------------------------------------------------------------- %changelog +* Mon Jan 22 2018 Nick Clifton 2.29.1-13 +- Fix bugs in AArch64 static PIE support. (#1536645) + * Tue Jan 16 2018 Nick Clifton 2.29.1-12 - Add "-z undefs" option to the linker.