f323ec1bdb
Resolves: #1536645
194 lines
7.6 KiB
Diff
194 lines
7.6 KiB
Diff
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
|