summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2021-02-24 18:01:16 +1030
committerAlan Modra <amodra@gmail.com>2021-03-01 14:52:20 +1030
commite3316baf921523e884731f5c7b547bc9362039e5 (patch)
tree35f1ff05980d713086e41305242c17cfb907b439
parent54a12d44be75091c5e81b7f385bd9c64c6eaec03 (diff)
downloadbinutils-gdb-e3316baf921523e884731f5c7b547bc9362039e5.tar.gz
PR27441, inconsistency in weak definitions
This makes IR objects use the same logic as normal objects with respect to what sort of ref/def makes an as-needed library needed. Testing the binding of the definition is just plain wrong. What matters is the binding of the reference. PR 27441 * elf-bfd.h (struct elf_link_hash_entry): Add ref_ir_nonweak. * elflink.c (elf_link_add_object_symbols): Set ref_ir_nonweak and use when deciding an as-needed library should be loaded instead of using the binding of the library definition. (cherry picked from commit bbaddd4bbeba65200ee805d87c2e3a845842e3eb)
-rw-r--r--bfd/ChangeLog10
-rw-r--r--bfd/elf-bfd.h2
-rw-r--r--bfd/elflink.c11
3 files changed, 20 insertions, 3 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 0c4631e15e6..d49efdb618a 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,13 @@
+2021-03-01 Alan Modra <amodra@gmail.com>
+
+ Apply from mainline
+ 2021-02-25 Alan Modra <amodra@gmail.com>
+ PR 27441
+ * elf-bfd.h (struct elf_link_hash_entry): Add ref_ir_nonweak.
+ * elflink.c (elf_link_add_object_symbols): Set ref_ir_nonweak and
+ use when deciding an as-needed library should be loaded instead
+ of using the binding of the library definition.
+
2021-02-06 Nick Clifton <nickc@redhat.com>
(development): Set to true.
diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h
index 15206b4e876..2cff9f055c5 100644
--- a/bfd/elf-bfd.h
+++ b/bfd/elf-bfd.h
@@ -184,6 +184,8 @@ struct elf_link_hash_entry
/* Symbol has a non-weak reference from a non-shared object (other than
the object in which it is defined). */
unsigned int ref_regular_nonweak : 1;
+ /* Symbol has a non-weak reference from a LTO IR object file. */
+ unsigned int ref_ir_nonweak : 1;
/* Dynamic symbol has been adjustd. */
unsigned int dynamic_adjusted : 1;
/* Symbol needs a copy reloc. */
diff --git a/bfd/elflink.c b/bfd/elflink.c
index 7afbc5b1072..08f241d79a5 100644
--- a/bfd/elflink.c
+++ b/bfd/elflink.c
@@ -5029,7 +5029,12 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
/* Plugin symbols aren't normal. Don't set def/ref flags. */
if ((abfd->flags & BFD_PLUGIN) != 0)
- ;
+ {
+ /* Except for this flag to track nonweak references. */
+ if (!definition
+ && bind != STB_WEAK)
+ h->ref_ir_nonweak = 1;
+ }
else if (!dynamic)
{
if (! definition)
@@ -5279,8 +5284,8 @@ elf_link_add_object_symbols (bfd *abfd, struct bfd_link_info *info)
&& h->ref_regular_nonweak)
|| (old_bfd != NULL
&& (old_bfd->flags & BFD_PLUGIN) != 0
- && !info->lto_all_symbols_read
- && bind != STB_WEAK)
+ && h->ref_ir_nonweak
+ && !info->lto_all_symbols_read)
|| (h->ref_dynamic_nonweak
&& (elf_dyn_lib_class (abfd) & DYN_AS_NEEDED) != 0
&& !on_needed_list (elf_dt_name (abfd),