* linux-arm-low.c: Include <signal.h>.
[deliverable/binutils-gdb.git] / bfd / linker.c
index 8700c05a5908558fb6636f35989dfb1dcea0f560..7a01e114a21a268e58768859c85342e7740a0316 100644 (file)
@@ -2888,16 +2888,16 @@ FUNCTION
        bfd_section_already_linked
 
 SYNOPSIS
-        void bfd_section_already_linked (bfd *abfd,
-                                        struct already_linked *data,
-                                        struct bfd_link_info *info);
+        bfd_boolean bfd_section_already_linked (bfd *abfd,
+                                               asection *sec,
+                                               struct bfd_link_info *info);
 
 DESCRIPTION
        Check if @var{data} has been already linked during a reloceatable
-       or final link.
+       or final link.  Return TRUE if it has.
 
-.#define bfd_section_already_linked(abfd, data, info) \
-.       BFD_SEND (abfd, _section_already_linked, (abfd, data, info))
+.#define bfd_section_already_linked(abfd, sec, info) \
+.       BFD_SEND (abfd, _section_already_linked, (abfd, sec, info))
 .
 
 */
@@ -2940,7 +2940,7 @@ bfd_section_already_linked_table_lookup (const char *name)
 bfd_boolean
 bfd_section_already_linked_table_insert
   (struct bfd_section_already_linked_hash_entry *already_linked_list,
-   struct already_linked *data)
+   asection *sec)
 {
   struct bfd_section_already_linked *l;
 
@@ -2950,7 +2950,7 @@ bfd_section_already_linked_table_insert
       bfd_hash_allocate (&_bfd_section_already_linked_table, sizeof *l);
   if (l == NULL)
     return FALSE;
-  l->linked = *data;
+  l->sec = sec;
   l->next = already_linked_list->entry;
   already_linked_list->entry = l;
   return TRUE;
@@ -2988,162 +2988,139 @@ bfd_section_already_linked_table_free (void)
   bfd_hash_table_free (&_bfd_section_already_linked_table);
 }
 
-/* This is used on non-ELF inputs.  */
+/* Report warnings as appropriate for duplicate section SEC.
+   Return FALSE if we decide to keep SEC after all.  */
 
-void
-_bfd_generic_section_already_linked (bfd *abfd,
-                                    struct already_linked *linked,
-                                    struct bfd_link_info *info)
+bfd_boolean
+_bfd_handle_already_linked (asection *sec,
+                           struct bfd_section_already_linked *l,
+                           struct bfd_link_info *info)
 {
-  flagword flags;
-  const char *name;
-  struct bfd_section_already_linked *l;
-  struct bfd_section_already_linked_hash_entry *already_linked_list;
-  struct coff_comdat_info *s_comdat;
-  asection *sec;
-
-  name = linked->comdat_key;
-  if (name)
-    {
-      sec = NULL;
-      flags = SEC_GROUP | SEC_LINK_ONCE | SEC_LINK_DUPLICATES_DISCARD;
-      s_comdat = NULL;
-    }
-  else
-    {
-      sec = linked->u.sec;
-      flags = sec->flags;
-      if ((flags & SEC_LINK_ONCE) == 0)
-       return;
-
-      s_comdat = bfd_coff_get_comdat_section (abfd, sec);
-
-      /* FIXME: When doing a relocatable link, we may have trouble
-        copying relocations in other sections that refer to local symbols
-        in the section being discarded.  Those relocations will have to
-        be converted somehow; as of this writing I'm not sure that any of
-        the backends handle that correctly.
-
-        It is tempting to instead not discard link once sections when
-        doing a relocatable link (technically, they should be discarded
-        whenever we are building constructors).  However, that fails,
-        because the linker winds up combining all the link once sections
-        into a single large link once section, which defeats the purpose
-        of having link once sections in the first place.  */
-
-      name = bfd_get_section_name (abfd, sec);
-    }
-
-  already_linked_list = bfd_section_already_linked_table_lookup (name);
-
-  for (l = already_linked_list->entry; l != NULL; l = l->next)
+  switch (sec->flags & SEC_LINK_DUPLICATES)
     {
-      bfd_boolean skip = FALSE;
-      bfd *l_owner;
-      flagword l_flags;
-      struct coff_comdat_info *l_comdat;
-      asection *l_sec;
+    default:
+      abort ();
 
-      if (l->linked.comdat_key)
+    case SEC_LINK_DUPLICATES_DISCARD:
+      /* If we found an LTO IR match for this comdat group on
+        the first pass, replace it with the LTO output on the
+        second pass.  We can't simply choose real object
+        files over IR because the first pass may contain a
+        mix of LTO and normal objects and we must keep the
+        first match, be it IR or real.  */
+      if (info->loading_lto_outputs
+         && (l->sec->owner->flags & BFD_PLUGIN) != 0)
        {
-         l_sec = NULL;
-         l_owner = l->linked.u.abfd;
-         l_comdat = NULL;
-         l_flags = (SEC_GROUP
-                    | SEC_LINK_ONCE
-                    | SEC_LINK_DUPLICATES_DISCARD);
-       }
-      else
-       {
-         l_sec = l->linked.u.sec;
-         l_owner = l_sec->owner;
-         l_flags = l_sec->flags;
-         l_comdat = bfd_coff_get_comdat_section (l_sec->owner, l_sec);
+         l->sec = sec;
+         return FALSE;
        }
+      break;
+
+    case SEC_LINK_DUPLICATES_ONE_ONLY:
+      info->callbacks->einfo
+       (_("%B: ignoring duplicate section `%A'\n"),
+        sec->owner, sec);
+      break;
 
-      /* We may have 3 different sections on the list: group section,
-        comdat section and linkonce section. SEC may be a linkonce or
-        comdat section. We always ignore group section. For non-COFF
-        inputs, we also ignore comdat section.
+    case SEC_LINK_DUPLICATES_SAME_SIZE:
+      if ((l->sec->owner->flags & BFD_PLUGIN) != 0)
+       ;
+      else if (sec->size != l->sec->size)
+       info->callbacks->einfo
+         (_("%B: duplicate section `%A' has different size\n"),
+          sec->owner, sec);
+      break;
 
-        FIXME: Is that safe to match a linkonce section with a comdat
-        section for COFF inputs?  */
-      if ((l_flags & SEC_GROUP) != 0)
-       skip = TRUE;
-      else if (bfd_get_flavour (abfd) == bfd_target_coff_flavour)
+    case SEC_LINK_DUPLICATES_SAME_CONTENTS:
+      if ((l->sec->owner->flags & BFD_PLUGIN) != 0)
+       ;
+      else if (sec->size != l->sec->size)
+       info->callbacks->einfo
+         (_("%B: duplicate section `%A' has different size\n"),
+          sec->owner, sec);
+      else if (sec->size != 0)
        {
-         if (s_comdat != NULL
-             && l_comdat != NULL
-             && strcmp (s_comdat->name, l_comdat->name) != 0)
-           skip = TRUE;
+         bfd_byte *sec_contents, *l_sec_contents = NULL;
+
+         if (!bfd_malloc_and_get_section (sec->owner, sec, &sec_contents))
+           info->callbacks->einfo
+             (_("%B: could not read contents of section `%A'\n"),
+              sec->owner, sec);
+         else if (!bfd_malloc_and_get_section (l->sec->owner, l->sec,
+                                               &l_sec_contents))
+           info->callbacks->einfo
+             (_("%B: could not read contents of section `%A'\n"),
+              l->sec->owner, l->sec);
+         else if (memcmp (sec_contents, l_sec_contents, sec->size) != 0)
+           info->callbacks->einfo
+             (_("%B: duplicate section `%A' has different contents\n"),
+              sec->owner, sec);
+
+         if (sec_contents)
+           free (sec_contents);
+         if (l_sec_contents)
+           free (l_sec_contents);
        }
-      else if (l_comdat != NULL)
-       skip = TRUE;
+      break;
+    }
 
-      if (!skip)
-       {
-         /* The section has already been linked.  See if we should
-             issue a warning.  */
-         switch (flags & SEC_LINK_DUPLICATES)
-           {
-           default:
-             abort ();
-
-           case SEC_LINK_DUPLICATES_DISCARD:
-             /* If we found an LTO IR match for this comdat group on
-                the first pass, replace it with the LTO output on the
-                second pass.  We can't simply choose real object
-                files over IR because the first pass may contain a
-                mix of LTO and normal objects and we must keep the
-                first match, be it IR or real.  */
-             if (info->loading_lto_outputs
-                 && (l_owner->flags & BFD_PLUGIN) != 0)
-               {
-                 l->linked = *linked;
-                 return;
-               }
-             break;
+  /* Set the output_section field so that lang_add_section
+     does not create a lang_input_section structure for this
+     section.  Since there might be a symbol in the section
+     being discarded, we must retain a pointer to the section
+     which we are really going to use.  */
+  sec->output_section = bfd_abs_section_ptr;
+  sec->kept_section = l->sec;
+  return TRUE;
+}
 
-           case SEC_LINK_DUPLICATES_ONE_ONLY:
-             (*_bfd_error_handler)
-               (_("%B: warning: ignoring duplicate section `%A'\n"),
-                abfd, sec);
-             break;
+/* This is used on non-ELF inputs.  */
 
-           case SEC_LINK_DUPLICATES_SAME_CONTENTS:
-             /* FIXME: We should really dig out the contents of both
-                 sections and memcmp them.  The COFF/PE spec says that
-                 the Microsoft linker does not implement this
-                 correctly, so I'm not going to bother doing it
-                 either.  */
-             /* Fall through.  */
-           case SEC_LINK_DUPLICATES_SAME_SIZE:
-             if (sec->size != l_sec->size)
-               (*_bfd_error_handler)
-                 (_("%B: warning: duplicate section `%A' has different size\n"),
-                  abfd, sec);
-             break;
-           }
+bfd_boolean
+_bfd_generic_section_already_linked (bfd *abfd ATTRIBUTE_UNUSED,
+                                    asection *sec,
+                                    struct bfd_link_info *info)
+{
+  const char *name;
+  struct bfd_section_already_linked *l;
+  struct bfd_section_already_linked_hash_entry *already_linked_list;
 
-         if (sec)
-           {
-             /* Set the output_section field so that lang_add_section
-                does not create a lang_input_section structure for this
-                section.  Since there might be a symbol in the section
-                being discarded, we must retain a pointer to the section
-                which we are really going to use.  */
-             sec->output_section = bfd_abs_section_ptr;
-             sec->kept_section = l_sec;
-           }
+  if ((sec->flags & SEC_LINK_ONCE) == 0)
+    return FALSE;
 
-         return;
-       }
+  /* The generic linker doesn't handle section groups.  */
+  if ((sec->flags & SEC_GROUP) != 0)
+    return FALSE;
+
+  /* FIXME: When doing a relocatable link, we may have trouble
+     copying relocations in other sections that refer to local symbols
+     in the section being discarded.  Those relocations will have to
+     be converted somehow; as of this writing I'm not sure that any of
+     the backends handle that correctly.
+
+     It is tempting to instead not discard link once sections when
+     doing a relocatable link (technically, they should be discarded
+     whenever we are building constructors).  However, that fails,
+     because the linker winds up combining all the link once sections
+     into a single large link once section, which defeats the purpose
+     of having link once sections in the first place.  */
+
+  name = bfd_get_section_name (abfd, sec);
+
+  already_linked_list = bfd_section_already_linked_table_lookup (name);
+
+  l = already_linked_list->entry;
+  if (l != NULL)
+    {
+      /* The section has already been linked.  See if we should
+        issue a warning.  */
+      return _bfd_handle_already_linked (sec, l, info);
     }
 
   /* This is the first section with this name.  Record it.  */
-  if (! bfd_section_already_linked_table_insert (already_linked_list,
-                                                linked))
+  if (!bfd_section_already_linked_table_insert (already_linked_list, sec))
     info->callbacks->einfo (_("%F%P: already_linked_table: %E\n"));
+  return FALSE;
 }
 
 /* Convert symbols in excluded output sections to use a kept section.  */
@@ -3403,3 +3380,26 @@ bfd_find_version_for_sym (struct bfd_elf_version_tree *verdefs,
 
   return NULL;
 }
+
+/*
+FUNCTION
+       bfd_hide_sym_by_version
+
+SYNOPSIS
+       bfd_boolean bfd_hide_sym_by_version
+         (struct bfd_elf_version_tree *verdefs, const char *sym_name);
+
+DESCRIPTION
+       Search an elf version script tree for symbol versioning
+       info for a given symbol.  Return TRUE if the symbol is hidden.
+
+*/
+
+bfd_boolean
+bfd_hide_sym_by_version (struct bfd_elf_version_tree *verdefs,
+                        const char *sym_name)
+{
+  bfd_boolean hidden = FALSE;
+  bfd_find_version_for_sym (verdefs, sym_name, &hidden);
+  return hidden;
+}
This page took 0.027877 seconds and 4 git commands to generate.