PR24623, DWARF errors
[deliverable/binutils-gdb.git] / bfd / linker.c
index 21e0c9304aa7c3473f6e1ecc95c641fc46cb5dab..edbd0a7df46901e016f43659ed6b6bdf588c560e 100644 (file)
@@ -1,5 +1,5 @@
 /* linker.c -- BFD linker routines
-   Copyright (C) 1993-2018 Free Software Foundation, Inc.
+   Copyright (C) 1993-2019 Free Software Foundation, Inc.
    Written by Steve Chamberlain and Ian Lance Taylor, Cygnus Support
 
    This file is part of BFD, the Binary File Descriptor library.
@@ -484,7 +484,20 @@ _bfd_link_hash_table_init
 
 /* Look up a symbol in a link hash table.  If follow is TRUE, we
    follow bfd_link_hash_indirect and bfd_link_hash_warning links to
-   the real symbol.  */
+   the real symbol.
+
+.{* Return TRUE if the symbol described by a linker hash entry H
+.   is going to be absolute.  Linker-script defined symbols can be
+.   converted from absolute to section-relative ones late in the
+.   link.  Use this macro to correctly determine whether the symbol
+.   will actually end up absolute in output.  *}
+.#define bfd_is_abs_symbol(H) \
+.  (((H)->type == bfd_link_hash_defined \
+.    || (H)->type == bfd_link_hash_defweak) \
+.   && bfd_is_abs_section ((H)->u.def.section) \
+.   && !(H)->rel_from_abs)
+.
+*/
 
 struct bfd_link_hash_entry *
 bfd_link_hash_lookup (struct bfd_link_hash_table *table,
@@ -495,6 +508,9 @@ bfd_link_hash_lookup (struct bfd_link_hash_table *table,
 {
   struct bfd_link_hash_entry *ret;
 
+  if (table == NULL || string == NULL)
+    return NULL;
+
   ret = ((struct bfd_link_hash_entry *)
         bfd_hash_lookup (&table->table, string, create, copy));
 
@@ -941,6 +957,9 @@ _bfd_generic_link_add_archive_symbols
              continue;
            }
 
+         if (arsym->name == NULL)
+           goto error_return;
+
          h = bfd_link_hash_lookup (info->hash, arsym->name,
                                    FALSE, FALSE, TRUE);
 
@@ -1402,12 +1421,24 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info,
   else if (bfd_is_com_section (section))
     {
       row = COMMON_ROW;
-      if (!bfd_link_relocatable (info)
-         && name[0] == '_'
-         && name[1] == '_'
-         && strcmp (name + (name[2] == '_'), "__gnu_lto_slim") == 0)
-       _bfd_error_handler
-         (_("%B: plugin needed to handle lto object"), abfd);
+      static bfd_boolean report_plugin_err = TRUE;
+      if (!bfd_link_relocatable (info) && report_plugin_err)
+       {
+         if (abfd->lto_slim_object)
+           {
+             report_plugin_err = FALSE;
+             _bfd_error_handler
+               (_("%pB: plugin needed to handle lto object"), abfd);
+           }
+         else if (name[0] == '_'
+                  && name[1] == '_'
+                  && strcmp (name + (name[2] == '_'), "__gnu_lto_slim") == 0)
+           {
+             report_plugin_err = FALSE;
+             _bfd_error_handler
+               (_("%pB: plugin needed to handle lto object"), abfd);
+           }
+       }
     }
   else
     row = DEF_ROW;
@@ -1675,7 +1706,7 @@ _bfd_generic_link_add_one_symbol (struct bfd_link_info *info,
            {
              _bfd_error_handler
                /* xgettext:c-format */
-               (_("%B: indirect symbol `%s' to `%s' is a loop"),
+               (_("%pB: indirect symbol `%s' to `%s' is a loop"),
                 abfd, name, string);
              bfd_set_error (bfd_error_invalid_operation);
              return FALSE;
@@ -2093,12 +2124,11 @@ _bfd_generic_link_output_symbols (bfd *output_bfd,
            }
        }
 
-      /* This switch is straight from the old code in
-        write_file_locals in ldsym.c.  */
-      if (info->strip == strip_all
-         || (info->strip == strip_some
-             && bfd_hash_lookup (info->keep_hash, bfd_asymbol_name (sym),
-                                 FALSE, FALSE) == NULL))
+      if ((sym->flags & BSF_KEEP) == 0
+         && (info->strip == strip_all
+             || (info->strip == strip_some
+                 && bfd_hash_lookup (info->keep_hash, bfd_asymbol_name (sym),
+                                     FALSE, FALSE) == NULL)))
        output = FALSE;
       else if ((sym->flags & (BSF_GLOBAL | BSF_WEAK | BSF_GNU_UNIQUE)) != 0)
        {
@@ -2112,6 +2142,8 @@ _bfd_generic_link_output_symbols (bfd *output_bfd,
          else
            output = FALSE;
        }
+      else if ((sym->flags & BSF_KEEP) != 0)
+       output = TRUE;
       else if (bfd_is_ind_section (sym->section))
        output = FALSE;
       else if ((sym->flags & BSF_DEBUGGING) != 0)
@@ -2545,7 +2577,7 @@ default_indirect_link_order (bfd *output_bfd,
         difficult, and sometimes impossible.  */
       _bfd_error_handler
        /* xgettext:c-format */
-       (_("Attempt to do relocatable link with %s input and %s output"),
+       (_("attempt to do relocatable link with %s input and %s output"),
         bfd_get_target (input_bfd), bfd_get_target (output_bfd));
       bfd_set_error (bfd_error_wrong_format);
       return FALSE;
@@ -2831,7 +2863,7 @@ _bfd_handle_already_linked (asection *sec,
     case SEC_LINK_DUPLICATES_ONE_ONLY:
       info->callbacks->einfo
        /* xgettext:c-format */
-       (_("%B: ignoring duplicate section `%A'\n"),
+       (_("%pB: ignoring duplicate section `%pA'\n"),
         sec->owner, sec);
       break;
 
@@ -2841,7 +2873,7 @@ _bfd_handle_already_linked (asection *sec,
       else if (sec->size != l->sec->size)
        info->callbacks->einfo
          /* xgettext:c-format */
-         (_("%B: duplicate section `%A' has different size\n"),
+         (_("%pB: duplicate section `%pA' has different size\n"),
           sec->owner, sec);
       break;
 
@@ -2851,7 +2883,7 @@ _bfd_handle_already_linked (asection *sec,
       else if (sec->size != l->sec->size)
        info->callbacks->einfo
          /* xgettext:c-format */
-         (_("%B: duplicate section `%A' has different size\n"),
+         (_("%pB: duplicate section `%pA' has different size\n"),
           sec->owner, sec);
       else if (sec->size != 0)
        {
@@ -2860,18 +2892,18 @@ _bfd_handle_already_linked (asection *sec,
          if (!bfd_malloc_and_get_section (sec->owner, sec, &sec_contents))
            info->callbacks->einfo
              /* xgettext:c-format */
-             (_("%B: could not read contents of section `%A'\n"),
+             (_("%pB: could not read contents of section `%pA'\n"),
               sec->owner, sec);
          else if (!bfd_malloc_and_get_section (l->sec->owner, l->sec,
                                                &l_sec_contents))
            info->callbacks->einfo
              /* xgettext:c-format */
-             (_("%B: could not read contents of section `%A'\n"),
+             (_("%pB: could not read contents of section `%pA'\n"),
               l->sec->owner, l->sec);
          else if (memcmp (sec_contents, l_sec_contents, sec->size) != 0)
            info->callbacks->einfo
              /* xgettext:c-format */
-             (_("%B: duplicate section `%A' has different contents\n"),
+             (_("%pB: duplicate section `%pA' has different contents\n"),
               sec->owner, sec);
 
          if (sec_contents)
@@ -3100,10 +3132,36 @@ bfd_generic_define_common_symbol (bfd *output_bfd,
   /* Make sure the section is allocated in memory, and make sure that
      it is no longer a common section.  */
   section->flags |= SEC_ALLOC;
-  section->flags &= ~SEC_IS_COMMON;
+  section->flags &= ~(SEC_IS_COMMON | SEC_HAS_CONTENTS);
   return TRUE;
 }
 
+/*
+FUNCTION
+       _bfd_generic_link_hide_symbol
+
+SYNOPSIS
+       void _bfd_generic_link_hide_symbol
+         (bfd *output_bfd, struct bfd_link_info *info,
+          struct bfd_link_hash_entry *h);
+
+DESCRIPTION
+       Hide symbol @var{h}.
+       This is an internal function.  It should not be called from
+       outside the BFD library.
+
+.#define bfd_link_hide_symbol(output_bfd, info, h) \
+.      BFD_SEND (output_bfd, _bfd_link_hide_symbol, (output_bfd, info, h))
+.
+*/
+
+void
+_bfd_generic_link_hide_symbol (bfd *output_bfd ATTRIBUTE_UNUSED,
+                              struct bfd_link_info *info ATTRIBUTE_UNUSED,
+                              struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED)
+{
+}
+
 /*
 FUNCTION
        bfd_generic_define_start_stop
@@ -3359,10 +3417,10 @@ _bfd_generic_verify_endian_match (bfd *ibfd, struct bfd_link_info *info)
       && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
     {
       if (bfd_big_endian (ibfd))
-       _bfd_error_handler (_("%B: compiled for a big endian system "
+       _bfd_error_handler (_("%pB: compiled for a big endian system "
                              "and target is little endian"), ibfd);
       else
-       _bfd_error_handler (_("%B: compiled for a little endian system "
+       _bfd_error_handler (_("%pB: compiled for a little endian system "
                              "and target is big endian"), ibfd);
       bfd_set_error (bfd_error_wrong_format);
       return FALSE;
This page took 0.027155 seconds and 4 git commands to generate.