From 2c1ad96b7203d5e33528f82e08f69475cd46f074 Mon Sep 17 00:00:00 2001 From: DistroBaker Date: Fri, 30 Oct 2020 20:48:07 +0000 Subject: [PATCH] Merged update from upstream sources This is an automated DistroBaker update from upstream sources. If you do not know what this is about or would like to opt out, contact the OSCI team. Source: https://src.fedoraproject.org/rpms/binutils.git#611c7aa70bbb24b1ee3be993fa56521f52dad1f6 --- binutils-plugin-as-needed.patch | 181 ++++++++++++++++++++++++++++++++ binutils.spec | 4 +- 2 files changed, 183 insertions(+), 2 deletions(-) diff --git a/binutils-plugin-as-needed.patch b/binutils-plugin-as-needed.patch index 53401c9..2cae7e7 100644 --- a/binutils-plugin-as-needed.patch +++ b/binutils-plugin-as-needed.patch @@ -71,3 +71,184 @@ diff -rup binutils.orig/ld/plugin.c binutils-2.35.1/ld/plugin.c goto report_symbol; } if (blhe->type != bfd_link_hash_defined +diff -rup binutils.orig/bfd/elflink.c binutils-2.35.1/bfd/elflink.c +--- binutils.orig/bfd/elflink.c 2020-10-30 10:31:04.291893073 +0000 ++++ binutils-2.35.1/bfd/elflink.c 2020-10-30 10:48:43.793863465 +0000 +@@ -4970,11 +4970,10 @@ elf_link_add_object_symbols (bfd *abfd, + object and a shared object. */ + bfd_boolean dynsym = FALSE; + +- /* Plugin symbols aren't normal. Don't set def_regular or +- ref_regular for them, or make them dynamic. */ ++ /* Plugin symbols aren't normal. Don't set def/ref flags. */ + if ((abfd->flags & BFD_PLUGIN) != 0) + ; +- else if (! dynamic) ++ else if (!dynamic) + { + if (! definition) + { +@@ -4991,14 +4990,6 @@ elf_link_add_object_symbols (bfd *abfd, + h->ref_dynamic = 1; + } + } +- +- /* If the indirect symbol has been forced local, don't +- make the real symbol dynamic. */ +- if ((h == hi || !hi->forced_local) +- && (bfd_link_dll (info) +- || h->def_dynamic +- || h->ref_dynamic)) +- dynsym = TRUE; + } + else + { +@@ -5012,14 +5003,25 @@ elf_link_add_object_symbols (bfd *abfd, + h->def_dynamic = 1; + hi->def_dynamic = 1; + } ++ } + +- /* If the indirect symbol has been forced local, don't +- make the real symbol dynamic. */ +- if ((h == hi || !hi->forced_local) +- && (h->def_regular +- || h->ref_regular +- || (h->is_weakalias +- && weakdef (h)->dynindx != -1))) ++ /* If an indirect symbol has been forced local, don't ++ make the real symbol dynamic. */ ++ if (h != hi && hi->forced_local) ++ ; ++ else if (!dynamic) ++ { ++ if (bfd_link_dll (info) ++ || h->def_dynamic ++ || h->ref_dynamic) ++ dynsym = TRUE; ++ } ++ else ++ { ++ if (h->def_regular ++ || h->ref_regular ++ || (h->is_weakalias ++ && weakdef (h)->dynindx != -1)) + dynsym = TRUE; + } + +@@ -5214,6 +5216,9 @@ elf_link_add_object_symbols (bfd *abfd, + && definition + && ((dynsym + && h->ref_regular_nonweak) ++ || (old_bfd != NULL ++ && (old_bfd->flags & BFD_PLUGIN) != 0 ++ && bind != STB_WEAK) + || (h->ref_dynamic_nonweak + && (elf_dyn_lib_class (abfd) & DYN_AS_NEEDED) != 0 + && !on_needed_list (elf_dt_name (abfd), +@@ -5338,55 +5343,33 @@ elf_link_add_object_symbols (bfd *abfd, + { + struct bfd_hash_entry *p; + struct elf_link_hash_entry *h; +- bfd_size_type size; +- unsigned int alignment_power; +- struct elf_link_hash_entry preserved_h; ++ unsigned int non_ir_ref_dynamic; + + for (p = htab->root.table.table[i]; p != NULL; p = p->next) + { +- h = (struct elf_link_hash_entry *) p; +- if (h->root.type == bfd_link_hash_warning) +- h = (struct elf_link_hash_entry *) h->root.u.i.link; +- +- /* Preserve the maximum alignment and size for common +- symbols even if this dynamic lib isn't on DT_NEEDED +- since it can still be loaded at run time by another +- dynamic lib. */ +- if (h->root.type == bfd_link_hash_common) +- { +- size = h->root.u.c.size; +- alignment_power = h->root.u.c.p->alignment_power; +- } +- else +- { +- size = 0; +- alignment_power = 0; +- } + /* Preserve non_ir_ref_dynamic so that this symbol + will be exported when the dynamic lib becomes needed + in the second pass. */ +- preserved_h = *h; ++ h = (struct elf_link_hash_entry *) p; ++ if (h->root.type == bfd_link_hash_warning) ++ h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ non_ir_ref_dynamic = h->root.non_ir_ref_dynamic; + +- memcpy (p, old_ent, htab->root.table.entsize); +- old_ent = (char *) old_ent + htab->root.table.entsize; + h = (struct elf_link_hash_entry *) p; ++ memcpy (h, old_ent, htab->root.table.entsize); ++ old_ent = (char *) old_ent + htab->root.table.entsize; + if (h->root.type == bfd_link_hash_warning) + { +- memcpy (h->root.u.i.link, old_ent, htab->root.table.entsize); +- old_ent = (char *) old_ent + htab->root.table.entsize; + h = (struct elf_link_hash_entry *) h->root.u.i.link; ++ memcpy (h, old_ent, htab->root.table.entsize); ++ old_ent = (char *) old_ent + htab->root.table.entsize; + } + if (h->root.type == bfd_link_hash_common) + { +- if (size > h->root.u.c.size) +- h->root.u.c.size = size; +- if (alignment_power > h->root.u.c.p->alignment_power) +- h->root.u.c.p->alignment_power = alignment_power; ++ memcpy (h->root.u.c.p, old_ent, sizeof (*h->root.u.c.p)); ++ old_ent = (char *) old_ent + sizeof (*h->root.u.c.p); + } +- +- h->root.non_ir_ref_dynamic +- = preserved_h.root.non_ir_ref_dynamic; +- h->root.as_needed_def_dynamic |= preserved_h.dynamic_def; ++ h->root.non_ir_ref_dynamic = non_ir_ref_dynamic; + } + } + +@@ -5823,11 +5806,6 @@ elf_link_add_archive_symbols (bfd *abfd, + if (h == NULL) + continue; + +- /* Don't load the archive element after seeing a definition +- in a DT_NEEDED shared object. */ +- if (h->root.as_needed_def_dynamic) +- continue; +- + if (h->root.type == bfd_link_hash_undefined) + { + /* If the archive element has already been loaded then one +diff -rup binutils.orig/include/bfdlink.h binutils-2.35.1/include/bfdlink.h +--- binutils.orig/include/bfdlink.h 2020-10-30 10:31:03.269895974 +0000 ++++ binutils-2.35.1/include/bfdlink.h 2020-10-30 10:47:03.087152957 +0000 +@@ -114,9 +114,6 @@ struct bfd_link_hash_entry + as distinct from a LTO IR object file. */ + unsigned int non_ir_ref_dynamic : 1; + +- /* Symbol is defined in a DT_NEEDED dynamic object file. */ +- unsigned int as_needed_def_dynamic : 1; +- + /* Symbol is a built-in define. These will be overridden by PROVIDE + in a linker script. */ + unsigned int linker_def : 1; +diff -rup binutils.orig/ld/plugin.c binutils-2.35.1/ld/plugin.c +--- binutils.orig/ld/plugin.c 2020-10-30 10:31:03.357895725 +0000 ++++ binutils-2.35.1/ld/plugin.c 2020-10-30 10:47:23.905093110 +0000 +@@ -794,8 +794,7 @@ get_symbols (const void *handle, int nsy + if (blhe->type == bfd_link_hash_undefined + || blhe->type == bfd_link_hash_undefweak) + { +- res = (blhe->as_needed_def_dynamic +- ? LDPR_RESOLVED_DYN : LDPR_UNDEF); ++ res = LDPR_UNDEF; + goto report_symbol; + } + if (blhe->type != bfd_link_hash_defined diff --git a/binutils.spec b/binutils.spec index 0c9a781..a2a1bee 100644 --- a/binutils.spec +++ b/binutils.spec @@ -2,7 +2,7 @@ Summary: A GNU collection of binary utilities Name: %{?cross}binutils%{?_with_debug:-debug} Version: 2.35.1 -Release: 10%{?dist} +Release: 11%{?dist} License: GPLv3+ URL: https://sourceware.org/binutils @@ -832,7 +832,7 @@ exit 0 #---------------------------------------------------------------------------- %changelog -* Wed Oct 28 2020 Nick Clifton - 2.35.1-9 +* Wed Oct 28 2020 Nick Clifton - 2.35.1-11 - Correction for plugin as-needed patch. (#1889763) * Tue Oct 27 2020 Nick Clifton - 2.35.1-8