diff options
author | Alan Modra <amodra@gmail.com> | 2021-02-24 18:01:16 +1030 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2021-03-01 14:52:20 +1030 |
commit | e3316baf921523e884731f5c7b547bc9362039e5 (patch) | |
tree | 35f1ff05980d713086e41305242c17cfb907b439 | |
parent | 54a12d44be75091c5e81b7f385bd9c64c6eaec03 (diff) | |
download | binutils-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/ChangeLog | 10 | ||||
-rw-r--r-- | bfd/elf-bfd.h | 2 | ||||
-rw-r--r-- | bfd/elflink.c | 11 |
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), |