PR27441, inconsistency in weak definitions
authorAlan Modra <amodra@gmail.com>
Wed, 24 Feb 2021 07:31:16 +0000 (18:01 +1030)
committerAlan Modra <amodra@gmail.com>
Thu, 25 Feb 2021 03:49:24 +0000 (14:19 +1030)
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.

bfd/ChangeLog
bfd/elf-bfd.h
bfd/elflink.c

index 52d9bf26008b96308a6a6bc23f4dde19f7bd9290..2fef817d734670e9331ac747d160fe3e36f19433 100644 (file)
@@ -1,3 +1,11 @@
+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-24  Alan Modra  <amodra@gmail.com>
 
        PR 27459
index 4b79ee8eb62a5f4ad4a4bc3f671160f44a29f673..dd66d98883e447fd1f55a07de6bfcdb0091dfe2a 100644 (file)
@@ -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.  */
index 291cec0df25003966ebad260a72c50322c33bb34..7b74f2653c227afb6439337030edf8c787e4afa7 100644 (file)
@@ -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),