PR ld/12760
authorAlan Modra <amodra@gmail.com>
Tue, 17 May 2011 13:02:18 +0000 (13:02 +0000)
committerAlan Modra <amodra@gmail.com>
Tue, 17 May 2011 13:02:18 +0000 (13:02 +0000)
include/
* bfdlink.h (struct bfd_link_callbacks <notice>): Add "flags" and
"string" param.
bfd/
* coff-aux.c (coff_m68k_aux_link_add_one_symbol): Adjust "notice" call.
* elflink.c (elf_link_add_object_symbols): Likewise.
* linker.c (_bfd_generic_link_add_one_symbol): Likewise.
ld/
* ldmain.c (notice): Add "flags" and "string" param.
* plugin.c (plugin_notice): Likewise.  Handle indirect, warning
and constructor syms.

bfd/ChangeLog
bfd/coff-aux.c
bfd/elflink.c
bfd/linker.c
include/ChangeLog
include/bfdlink.h
ld/ChangeLog
ld/ldmain.c
ld/plugin.c

index 8733a69..a5355b5 100644 (file)
@@ -1,3 +1,10 @@
+2011-05-17  Alan Modra  <amodra@gmail.com>
+
+       PR ld/12760
+       * coff-aux.c (coff_m68k_aux_link_add_one_symbol): Adjust "notice" call.
+       * elflink.c (elf_link_add_object_symbols): Likewise.
+       * linker.c (_bfd_generic_link_add_one_symbol): Likewise.
+
 2011-05-16  Alan Modra  <amodra@gmail.com>
 
        * linker.c (_bfd_generic_link_add_one_symbol): Don't init u.undef.weak.
index 20a680c..84805a8 100644 (file)
@@ -105,7 +105,8 @@ coff_m68k_aux_link_add_one_symbol (info, abfd, name, flags, section, value,
          && (bfd_hash_lookup (info->notice_hash, name, FALSE, FALSE)
              != (struct bfd_hash_entry *) NULL))
        {
-         if (! (*info->callbacks->notice) (info, h, abfd, section, value))
+         if (! (*info->callbacks->notice) (info, h, abfd, section, value,
+                                           flags, string))
            return FALSE;
        }
 
index e4f728d..b08b150 100644 (file)
@@ -3814,7 +3814,7 @@ error_free_dyn:
       /* Make a special call to the linker "notice" function to
         tell it that we are about to handle an as-needed lib.  */
       if (!(*info->callbacks->notice) (info, NULL, abfd, NULL,
-                                      notice_as_needed))
+                                      notice_as_needed, 0, NULL))
        goto error_free_vers;
 
       /* Clone the symbol table and sym hashes.  Remember some
@@ -4561,7 +4561,7 @@ error_free_dyn:
       /* Make a special call to the linker "notice" function to
         tell it that symbols added for crefs may need to be removed.  */
       if (!(*info->callbacks->notice) (info, NULL, abfd, NULL,
-                                      notice_not_needed))
+                                      notice_not_needed, 0, NULL))
        goto error_free_vers;
 
       free (old_tab);
@@ -4575,7 +4575,7 @@ error_free_dyn:
   if (old_tab != NULL)
     {
       if (!(*info->callbacks->notice) (info, NULL, abfd, NULL,
-                                      notice_needed))
+                                      notice_needed, 0, NULL))
        goto error_free_vers;
       free (old_tab);
       old_tab = NULL;
index d92a9d8..90ab63e 100644 (file)
@@ -1607,7 +1607,8 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info,
       || (info->notice_hash != NULL
          && bfd_hash_lookup (info->notice_hash, name, FALSE, FALSE) != NULL))
     {
-      if (! (*info->callbacks->notice) (info, h, abfd, section, value))
+      if (! (*info->callbacks->notice) (info, h,
+                                       abfd, section, value, flags, string))
        return FALSE;
     }
 
index 1f8b378..7fd79a0 100644 (file)
@@ -1,3 +1,9 @@
+2011-05-17  Alan Modra  <amodra@gmail.com>
+
+       PR ld/12760
+       * bfdlink.h (struct bfd_link_callbacks <notice>): Add "flags" and
+       "string" param.
+
 2011-05-16  Alan Modra  <amodra@gmail.com>
 
        * bfdlink.h (struct bfd_link_hash_entry): Remove u.undef.weak field.
index d3ac8d9..bb62fbe 100644 (file)
@@ -573,10 +573,13 @@ struct bfd_link_callbacks
   /* A function which is called when a symbol in notice_hash is
      defined or referenced.  H is the symbol.  ABFD, SECTION and
      ADDRESS are the (new) value of the symbol.  If SECTION is
-     bfd_und_section, this is a reference.  */
+     bfd_und_section, this is a reference.  FLAGS are the symbol
+     BSF_* flags.  STRING is the name of the symbol to indirect to if
+     the sym is indirect, or the warning string if a warning sym.  */
   bfd_boolean (*notice)
     (struct bfd_link_info *, struct bfd_link_hash_entry *h,
-     bfd *abfd, asection *section, bfd_vma address);
+     bfd *abfd, asection *section, bfd_vma address, flagword flags,
+     const char *string);
   /* Error or warning link info message.  */
   void (*einfo)
     (const char *fmt, ...);
index 6697fc1..7b782c8 100644 (file)
@@ -1,3 +1,10 @@
+2011-05-17  Alan Modra  <amodra@gmail.com>
+
+       PR ld/12760
+       * ldmain.c (notice): Add "flags" and "string" param.
+       * plugin.c (plugin_notice): Likewise.  Handle indirect, warning
+       and constructor syms.
+
 2010-05-16  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * ldlang.c (print_assignment): Use the symbol's section if we
index bfa6066..96f3bda 100644 (file)
@@ -151,7 +151,7 @@ static bfd_boolean unattached_reloc
   (struct bfd_link_info *, const char *, bfd *, asection *, bfd_vma);
 static bfd_boolean notice
   (struct bfd_link_info *, struct bfd_link_hash_entry *,
-   bfd *, asection *, bfd_vma);
+   bfd *, asection *, bfd_vma, flagword, const char *);
 
 static struct bfd_link_callbacks link_callbacks =
 {
@@ -1483,7 +1483,9 @@ notice (struct bfd_link_info *info,
        struct bfd_link_hash_entry *h,
        bfd *abfd,
        asection *section,
-       bfd_vma value)
+       bfd_vma value,
+       flagword flags ATTRIBUTE_UNUSED,
+       const char *string ATTRIBUTE_UNUSED)
 {
   const char *name;
 
index 07c6068..60eb102 100644 (file)
@@ -125,9 +125,9 @@ static const enum ld_plugin_tag tv_header_tags[] =
 static const size_t tv_header_size = ARRAY_SIZE (tv_header_tags);
 
 /* Forward references.  */
-static bfd_boolean plugin_notice (struct bfd_link_info *info,
-                                 struct bfd_link_hash_entry *h, bfd *abfd,
-                                 asection *section, bfd_vma value);
+static bfd_boolean plugin_notice (struct bfd_link_info *,
+                                 struct bfd_link_hash_entry *, bfd *,
+                                 asection *, bfd_vma, flagword, const char *);
 
 #if !defined (HAVE_DLFCN_H) && defined (HAVE_WINDOWS_H)
 
@@ -908,7 +908,9 @@ plugin_notice (struct bfd_link_info *info,
               struct bfd_link_hash_entry *h,
               bfd *abfd,
               asection *section,
-              bfd_vma value)
+              bfd_vma value,
+              flagword flags,
+              const char *string)
 {
   if (h != NULL)
     {
@@ -918,8 +920,33 @@ plugin_notice (struct bfd_link_info *info,
       if (is_ir_dummy_bfd (abfd))
        return TRUE;
 
+      /* Making an indirect symbol counts as a reference unless this
+        is a brand new symbol.  */
+      if (bfd_is_ind_section (section)
+         || (flags & BSF_INDIRECT) != 0)
+       {
+         if (h->type != bfd_link_hash_new)
+           {
+             struct bfd_link_hash_entry *inh;
+
+             h->non_ir_ref = TRUE;
+             inh = bfd_wrapped_link_hash_lookup (abfd, info, string, FALSE,
+                                                 FALSE, FALSE);
+             if (inh != NULL)
+               inh->non_ir_ref = TRUE;
+           }
+       }
+
+      /* Nothing to do here for warning symbols.  */
+      else if ((flags & BSF_WARNING) != 0)
+       ;
+
+      /* Nothing to do here for constructor symbols.  */
+      else if ((flags & BSF_CONSTRUCTOR) != 0)
+       ;
+
       /* If this is a ref, set non_ir_ref.  */
-      if (bfd_is_und_section (section))
+      else if (bfd_is_und_section (section))
        h->non_ir_ref = TRUE;
 
       /* Otherwise, it must be a new def.  Ensure any symbol defined
@@ -945,6 +972,7 @@ plugin_notice (struct bfd_link_info *info,
       || (info->notice_hash != NULL
          && bfd_hash_lookup (info->notice_hash, h->root.string,
                              FALSE, FALSE) != NULL))
-    return (*orig_callbacks->notice) (info, h, abfd, section, value);
+    return (*orig_callbacks->notice) (info, h,
+                                     abfd, section, value, flags, string);
   return TRUE;
 }