Add option to nm to change the characters displayed for ifunc symbols. Add a configu...
[binutils-gdb.git] / ld / plugin.c
index 4ef4a236650ce97b51ed6bd7edd5369a035f18f6..067551c4766829795b95d22fe8d12c82852a7c2d 100644 (file)
@@ -21,6 +21,7 @@
 #include "sysdep.h"
 #include "libiberty.h"
 #include "bfd.h"
+#if BFD_SUPPORTS_PLUGINS
 #include "bfdlink.h"
 #include "bfdver.h"
 #include "ctf-api.h"
@@ -414,7 +415,7 @@ asymbol_from_plugin_symbol (bfd *abfd, asymbol *asym,
 
   if (bfd_get_flavour (abfd) == bfd_target_elf_flavour)
     {
-      elf_symbol_type *elfsym = elf_symbol_from (abfd, asym);
+      elf_symbol_type *elfsym = elf_symbol_from (asym);
       unsigned char visibility;
 
       if (!elfsym)
@@ -1191,7 +1192,7 @@ plugin_object_p (bfd *ibfd)
 
   /* We create a dummy BFD, initially empty, to house whatever symbols
      the plugin may want to add.  */
-  abfd = plugin_get_ir_dummy_bfd (ibfd->filename, ibfd);
+  abfd = plugin_get_ir_dummy_bfd (bfd_get_filename (ibfd), ibfd);
 
   input = bfd_alloc (abfd, sizeof (*input));
   if (input == NULL)
@@ -1201,7 +1202,7 @@ plugin_object_p (bfd *ibfd)
   if (!bfd_plugin_open_input (ibfd, &file))
     return NULL;
 
-  if (file.name == ibfd->filename)
+  if (file.name == bfd_get_filename (ibfd))
     {
       /* We must copy filename attached to ibfd if it is not an archive
         member since it may be freed by bfd_close below.  */
@@ -1217,7 +1218,7 @@ plugin_object_p (bfd *ibfd)
   input->use_mmap = FALSE;
   input->offset = file.offset;
   input->filesize = file.filesize;
-  input->name = plugin_strdup (abfd, ibfd->filename);
+  input->name = plugin_strdup (abfd, bfd_get_filename (ibfd));
 
   claimed = 0;
 
@@ -1432,12 +1433,18 @@ plugin_notice (struct bfd_link_info *info,
         new value from a real BFD.  Weak symbols are not normally
         overridden by a new weak definition, and strong symbols
         will normally cause multiple definition errors.  Avoid
-        this by making the symbol appear to be undefined.  */
-      else if (((h->type == bfd_link_hash_defweak
-                || h->type == bfd_link_hash_defined)
-               && is_ir_dummy_bfd (sym_bfd = h->u.def.section->owner))
-              || (h->type == bfd_link_hash_common
-                  && is_ir_dummy_bfd (sym_bfd = h->u.c.p->section->owner)))
+        this by making the symbol appear to be undefined.
+
+        NB: We change the previous definition in the IR object to
+        undefweak only after all LTO symbols have been read or for
+        non-ELF targets.  */
+      else if ((info->lto_all_symbols_read
+               || bfd_get_flavour (abfd) != bfd_target_elf_flavour)
+              && (((h->type == bfd_link_hash_defweak
+                    || h->type == bfd_link_hash_defined)
+                   && is_ir_dummy_bfd (sym_bfd = h->u.def.section->owner))
+                  || (h->type == bfd_link_hash_common
+                      && is_ir_dummy_bfd (sym_bfd = h->u.c.p->section->owner))))
        {
          h->type = bfd_link_hash_undefweak;
          h->u.undef.abfd = sym_bfd;
@@ -1462,3 +1469,4 @@ plugin_notice (struct bfd_link_info *info,
                                      abfd, section, value, flags);
   return TRUE;
 }
+#endif /* BFD_SUPPORTS_PLUGINS */