Set non_ir_ref_dynamic if a symbol is made dynamic
[binutils-gdb.git] / ld / pe-dll.c
index e99f753d27d6bf0c32291081fe18e53a60c2fea9..c087bf23bc1d66da449334288eabb55138e9469d 100644 (file)
@@ -1,5 +1,5 @@
 /* Routines to help build PEI-format DLLs (Win32 etc)
-   Copyright (C) 1998-2017 Free Software Foundation, Inc.
+   Copyright (C) 1998-2018 Free Software Foundation, Inc.
    Written by DJ Delorie <dj@cygnus.com>
 
    This file is part of the GNU Binutils.
@@ -344,6 +344,9 @@ static const autofilter_entry_type autofilter_liblist[] =
   { STRING_COMMA_LEN ("libsupc++") },
   { STRING_COMMA_LEN ("libobjc") },
   { STRING_COMMA_LEN ("libgcj") },
+  { STRING_COMMA_LEN ("libmsvcrt") },
+  { STRING_COMMA_LEN ("libmsvcrt-os") },
+  { STRING_COMMA_LEN ("libucrtbase") },
   { NULL, 0 }
 };
 
@@ -439,7 +442,7 @@ pe_dll_id_target (const char *target)
        pe_leading_underscore = (u != 0 ? 1 : 0);
        return;
       }
-  einfo (_("%P%X: Unsupported PEI architecture: %s\n"), target);
+  einfo (_("%X%P: unsupported PEI architecture: %s\n"), target);
   exit (1);
 }
 
@@ -552,7 +555,7 @@ auto_export (bfd *abfd, def_file *d, const char *n)
 
   /* Return false if n is in the d->exports table.  */
   if (bsearch (&key, d->exports, d->num_exports,
-               sizeof (pe_def_file->exports[0]), pe_export_sort))
+              sizeof (pe_def_file->exports[0]), pe_export_sort))
     return 0;
 
   if (pe_dll_do_default_excludes)
@@ -692,9 +695,9 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *
        {
          struct coff_link_hash_entry *sym_hash;
          sym_hash = coff_link_hash_lookup (coff_hash_table (info),
-               ac->symbol_name, FALSE, FALSE, FALSE);
+                                           ac->symbol_name, FALSE, FALSE, FALSE);
          if (sym_hash && sym_hash->root.type == bfd_link_hash_common
-           && sym_hash->root.u.c.p->alignment_power < (unsigned) ac->alignment)
+             && sym_hash->root.u.c.p->alignment_power < (unsigned) ac->alignment)
            {
              sym_hash->root.u.c.p->alignment_power = (unsigned) ac->alignment;
            }
@@ -719,7 +722,7 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *
 
          if (!bfd_generic_link_read_symbols (b))
            {
-             einfo (_("%B%F: could not read symbols: %E\n"), b);
+             einfo (_("%F%P: %pB: could not read symbols: %E\n"), b);
              return;
            }
 
@@ -736,9 +739,9 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *
                   && ((symbols[j]->flags & BSF_GLOBAL)
                       || (symbols[j]->flags == 0)));
              if (link_info.version_info && would_export)
-                 would_export
-                   = !bfd_hide_sym_by_version (link_info.version_info,
-                                               symbols[j]->name);
+               would_export
+                 = !bfd_hide_sym_by_version (link_info.version_info,
+                                             symbols[j]->name);
              if (would_export)
                {
                  const char *sn = symbols[j]->name;
@@ -747,7 +750,7 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *
                  {
                    char *name;
                    if (is_import (sn))
-                         continue;
+                     continue;
 
                    name = xmalloc (strlen ("__imp_") + strlen (sn) + 1);
                    sprintf (name, "%s%s", "__imp_", sn);
@@ -772,7 +775,7 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *
                                               NULL, &is_dup);
                      /* Fill data flag properly, from dlltool.c.  */
                      if (!is_dup)
-                       p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
+                       p->flag_data = !(symbols[j]->flags & BSF_FUNCTION);
                    }
                }
            }
@@ -806,12 +809,12 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *
              char *tmp_at = strrchr (tmp, '@');
 
              if (tmp_at)
-               *tmp_at = 0;
+               *tmp_at = 0;
              else
-               einfo (_("%P%X: Cannot export %s: invalid export name\n"),
+               einfo (_("%X%P: cannot export %s: invalid export name\n"),
                       pe_def_file->exports[i].name);
              pe_def_file->exports[i].name = tmp;
-              resort_needed = TRUE;
+             resort_needed = TRUE;
            }
        }
     }
@@ -820,7 +823,7 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *
      by removing leading @.  */
   if (resort_needed)
     qsort (pe_def_file->exports, NE, sizeof (pe_def_file->exports[0]),
-           pe_export_sort);
+          pe_export_sort);
 
   if (pe_dll_stdcall_aliases)
     {
@@ -841,7 +844,7 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *
                                     pe_def_file->exports[i].internal_name,
                                     -1, NULL, &is_dup);
              if (is_dup)
-               free (tmp);
+               free (tmp);
            }
        }
     }
@@ -860,14 +863,14 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *
            {
              if (pe_dll_warn_dup_exports)
                /* xgettext:c-format */
-               einfo (_("%P%X: Error, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
+               einfo (_("%X%P: error, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
                       e[j - 1].name, e[j - 1].ordinal, e[i].ordinal);
            }
          else
            {
              if (pe_dll_warn_dup_exports)
                /* xgettext:c-format */
-               einfo (_("%P: Warning, duplicate EXPORT: %s\n"),
+               einfo (_("%P: warning, duplicate EXPORT: %s\n"),
                       e[j - 1].name);
            }
 
@@ -953,7 +956,7 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *
            }
        }
       /* Check for forward exports.  These are indicated in DEF files by an
-         export directive of the form NAME1 = MODULE-NAME.EXTERNAL-NAME
+        export directive of the form NAME1 = MODULE-NAME.EXTERNAL-NAME
         but we must take care not to be fooled when the user wants to export
         a symbol that actually really has a dot in it, so we only check
         for them here, after real defined symbols have already been matched.  */
@@ -977,20 +980,20 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *
       else if (blhe && blhe->type == bfd_link_hash_undefined)
        {
          /* xgettext:c-format */
-         einfo (_("%P%X: Cannot export %s: symbol not defined\n"),
+         einfo (_("%X%P: cannot export %s: symbol not defined\n"),
                 int_name);
        }
       else if (blhe)
        {
          /* xgettext:c-format */
-         einfo (_("%P%X: Cannot export %s: symbol wrong type (%d vs %d)\n"),
+         einfo (_("%X%P: cannot export %s: symbol wrong type (%d vs %d)\n"),
                 int_name,
                 blhe->type, bfd_link_hash_defined);
        }
       else
        {
          /* xgettext:c-format */
-         einfo (_("%P%X: Cannot export %s: symbol not found\n"),
+         einfo (_("%X%P: cannot export %s: symbol not found\n"),
                 int_name);
        }
       free (name);
@@ -1013,7 +1016,7 @@ build_filler_bfd (int include_edata)
                             bfd_get_arch (link_info.output_bfd),
                             bfd_get_mach (link_info.output_bfd)))
     {
-      einfo ("%X%P: can not create BFD: %E\n");
+      einfo (_("%F%P: can not create BFD: %E\n"));
       return;
     }
 
@@ -1028,7 +1031,7 @@ build_filler_bfd (int include_edata)
                                      | SEC_KEEP
                                      | SEC_IN_MEMORY)))
        {
-         einfo ("%X%P: can not create .edata section: %E\n");
+         einfo (_("%X%P: can not create .edata section: %E\n"));
          return;
        }
       bfd_set_section_size (filler_bfd, edata_s, edata_sz);
@@ -1043,7 +1046,7 @@ build_filler_bfd (int include_edata)
                                  | SEC_KEEP
                                  | SEC_IN_MEMORY)))
     {
-      einfo ("%X%P: can not create .reloc section: %E\n");
+      einfo (_("%X%P: can not create .reloc section: %E\n"));
       return;
     }
 
@@ -1093,8 +1096,8 @@ generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
   /* Now we need to assign ordinals to those that don't have them.  */
   for (i = 0; i < NE; i++)
     {
-      if (exported_symbol_sections[i] ||
-          pe_def_file->exports[i].flag_forward)
+      if (exported_symbol_sections[i]
+         || pe_def_file->exports[i].flag_forward)
        {
          if (pe_def_file->exports[i].ordinal != -1)
            {
@@ -1104,7 +1107,7 @@ generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
              if (pi != -1)
                {
                  /* xgettext:c-format */
-                 einfo (_("%P%X: Error: ordinal used twice: %d (%s vs %s)\n"),
+                 einfo (_("%X%P: error: ordinal used twice: %d (%s vs %s)\n"),
                         pe_def_file->exports[i].ordinal,
                         pe_def_file->exports[i].name,
                         pe_def_file->exports[pi].name);
@@ -1126,9 +1129,9 @@ generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
 
   next_ordinal = min_ordinal;
   for (i = 0; i < NE; i++)
-    if ((exported_symbol_sections[i] ||
-         pe_def_file->exports[i].flag_forward) &&
-        pe_def_file->exports[i].ordinal == -1)
+    if ((exported_symbol_sections[i]
+        || pe_def_file->exports[i].flag_forward)
+       && pe_def_file->exports[i].ordinal == -1)
       {
        while (exported_symbols[next_ordinal - min_ordinal] != -1)
          next_ordinal++;
@@ -1140,7 +1143,7 @@ generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
   /* PR 12969: Check for more than 1^16 ordinals.  */
   if (max_ordinal > 65535 || next_ordinal > 65535)
     /* xgettext:c-format */
-    einfo(_("%P%X: Error: export ordinal too large: %d\n"),
+    einfo(_("%X%P: error: export ordinal too large: %d\n"),
          max_ordinal > next_ordinal ? max_ordinal : next_ordinal);
 
   /* OK, now we can allocate some memory.  */
@@ -1166,7 +1169,7 @@ fill_exported_offsets (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *info)
 
       name = xmalloc (strlen (pe_def_file->exports[i].internal_name) + 2);
       if (pe_details->underscored
-         && *pe_def_file->exports[i].internal_name != '@')
+         && *pe_def_file->exports[i].internal_name != '@')
        {
          *name = '_';
          strcpy (name + 1, pe_def_file->exports[i].internal_name);
@@ -1234,21 +1237,21 @@ fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
      Scan alphabetically - ie the ordering in the exports[] table,
      rather than by ordinal - the ordering in the exported_symbol[]
      table.  See dlltool.c and:
-        http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
+       http://sources.redhat.com/ml/binutils/2003-04/msg00379.html
      for more information.  */
   hint = 0;
   for (s = 0; s < NE; s++)
     {
       struct bfd_section *ssec = exported_symbol_sections[s];
-      if (pe_def_file->exports[s].ordinal != -1 &&
-          (pe_def_file->exports[s].flag_forward || ssec != NULL))
+      if (pe_def_file->exports[s].ordinal != -1
+         && (pe_def_file->exports[s].flag_forward || ssec != NULL))
        {
          int ord = pe_def_file->exports[s].ordinal;
 
          if (pe_def_file->exports[s].flag_forward)
            {
              bfd_put_32 (abfd, ERVA (enamestr),
-                         eaddresses + 4 * (ord - min_ordinal));
+                         eaddresses + 4 * (ord - min_ordinal));
 
              strcpy (enamestr, pe_def_file->exports[s].internal_name);
              enamestr += strlen (pe_def_file->exports[s].internal_name) + 1;
@@ -1260,7 +1263,7 @@ fill_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
                                    + ssec->output_offset);
 
              bfd_put_32 (abfd, srva - image_base,
-                         eaddresses + 4 * (ord - min_ordinal));
+                         eaddresses + 4 * (ord - min_ordinal));
            }
 
          if (!pe_def_file->exports[s].flag_noname)
@@ -1298,7 +1301,7 @@ pe_walk_relocs_of_symbol (struct bfd_link_info *info,
 
       if (!bfd_generic_link_read_symbols (b))
        {
-         einfo (_("%B%F: could not read symbols: %E\n"), b);
+         einfo (_("%F%P: %pB: could not read symbols: %E\n"), b);
          return;
        }
 
@@ -1385,7 +1388,7 @@ generate_reloc (bfd *abfd, struct bfd_link_info *info)
          if (s->output_section->vma == 0)
            {
              /* Huh?  Shouldn't happen, but punt if it does.  */
-             einfo ("DJ: zero vma section reloc detected: `%s' #%d f=%d\n",
+             einfo (_("%P: zero vma section reloc detected: `%s' #%d f=%d\n"),
                     s->output_section->name, s->output_section->index,
                     s->output_section->flags);
              continue;
@@ -1393,7 +1396,7 @@ generate_reloc (bfd *abfd, struct bfd_link_info *info)
 
          if (!bfd_generic_link_read_symbols (b))
            {
-             einfo (_("%B%F: could not read symbols: %E\n"), b);
+             einfo (_("%F%P: %pB: could not read symbols: %E\n"), b);
              return;
            }
 
@@ -1500,7 +1503,7 @@ generate_reloc (bfd *abfd, struct bfd_link_info *info)
                      /* Fall through.  */
                    default:
                      /* xgettext:c-format */
-                     einfo (_("%P%X: Error: %d-bit reloc in dll\n"),
+                     einfo (_("%X%P: error: %d-bit reloc in dll\n"),
                             relocs[i]->howto->bitsize);
                      break;
                    }
@@ -1628,7 +1631,7 @@ pe_dll_generate_def_file (const char *pe_out_def_filename)
 
   if (out == NULL)
     /* xgettext:c-format */
-    einfo (_("%P: Can't open output def file %s\n"),
+    einfo (_("%P: can't open output def file %s\n"),
           pe_out_def_filename);
 
   if (pe_def_file)
@@ -1783,7 +1786,7 @@ pe_dll_generate_def_file (const char *pe_out_def_filename)
 
   if (fclose (out) == EOF)
     /* xgettext:c-format */
-    einfo (_("%P: Error closing file `%s'\n"), pe_out_def_filename);
+    einfo (_("%P: error closing file `%s'\n"), pe_out_def_filename);
 }
 
 /* Generate the import library.  */
@@ -1880,20 +1883,20 @@ save_relocs (asection *sec)
 }
 
 /*     .section        .idata$2
-       .global         __head_my_dll
+       .global         __head_my_dll
    __head_my_dll:
-       .rva            hname
-       .long           0
-       .long           0
-       .rva            __my_dll_iname
-       .rva            fthunk
-
-       .section        .idata$5
-       .long           0
+       .rva            hname
+       .long           0
+       .long           0
+       .rva            __my_dll_iname
+       .rva            fthunk
+
+       .section        .idata$5
+       .long           0
    fthunk:
 
-       .section        .idata$4
-       .long           0
+       .section        .idata$4
+       .long           0
    hname:                              */
 
 static bfd *
@@ -1974,15 +1977,15 @@ make_head (bfd *parent)
 }
 
 /*     .section        .idata$4
-       .long           0
+       .long           0
        [.long          0] for PE+
-       .section        .idata$5
-       .long           0
+       .section        .idata$5
+       .long           0
        [.long          0] for PE+
-       .section        idata$7
-       .global         __my_dll_iname
+       .section        idata$7
+       .global         __my_dll_iname
   __my_dll_iname:
-       .asciz          "my.dll"       */
+       .asciz          "my.dll"       */
 
 static bfd *
 make_tail (bfd *parent)
@@ -2044,25 +2047,25 @@ make_tail (bfd *parent)
 }
 
 /*     .text
-       .global         _function
-       .global         ___imp_function
-       .global         __imp__function
+       .global         _function
+       .global         ___imp_function
+       .global         __imp__function
   _function:
-       jmp             *__imp__function:
+       jmp             *__imp__function:
 
-       .section        idata$7
-       .long           __head_my_dll
+       .section        idata$7
+       .long           __head_my_dll
 
-       .section        .idata$5
+       .section        .idata$5
   ___imp_function:
   __imp__function:
   iat?
-       .section        .idata$4
+       .section        .idata$4
   iat?
-       .section        .idata$6
+       .section        .idata$6
   ID<ordinal>:
-       .short          <hint>
-       .asciz          "function" xlate? (add underscore, kill at)  */
+       .short          <hint>
+       .asciz          "function" xlate? (add underscore, kill at)  */
 
 static const unsigned char jmp_ix86_bytes[] =
 {
@@ -2070,11 +2073,11 @@ static const unsigned char jmp_ix86_bytes[] =
 };
 
 /* _function:
-       mov.l   ip+8,r0
-       mov.l   @r0,r0
-       jmp     @r0
-       nop
-       .dw     __imp_function   */
+       mov.l   ip+8,r0
+       mov.l   @r0,r0
+       jmp     @r0
+       nop
+       .dw     __imp_function   */
 
 static const unsigned char jmp_sh_bytes[] =
 {
@@ -2082,10 +2085,10 @@ static const unsigned char jmp_sh_bytes[] =
 };
 
 /* _function:
-       lui     $t0,<high:__imp_function>
-       lw      $t0,<low:__imp_function>
-       jr      $t0
-       nop                              */
+       lui     $t0,<high:__imp_function>
+       lw      $t0,<low:__imp_function>
+       jr      $t0
+       nop                              */
 
 static const unsigned char jmp_mips_bytes[] =
 {
@@ -2211,7 +2214,7 @@ make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
          /* Mark this object as SAFESEH compatible.  */
          quick_symbol (abfd, "", "@feat.00", "", bfd_abs_section_ptr,
                        BSF_LOCAL, 1);
-          quick_reloc (abfd, 2, BFD_RELOC_32, 2);
+         quick_reloc (abfd, 2, BFD_RELOC_32, 2);
 #endif
          break;
        case PE_ARCH_sh:
@@ -2223,8 +2226,8 @@ make_one (def_file_export *exp, bfd *parent, bfd_boolean include_jmp_stub)
          quick_reloc (abfd, 4, BFD_RELOC_LO16, 2);
          break;
        case PE_ARCH_arm:
-       case PE_ARCH_arm_epoc:
-       case PE_ARCH_arm_wince:
+       case PE_ARCH_arm_epoc:
+       case PE_ARCH_arm_wince:
          quick_reloc (abfd, 8, BFD_RELOC_32, 2);
          break;
        default:
@@ -2432,11 +2435,11 @@ make_import_fixup_mark (arelent *rel, char *name)
 }
 
 /*     .section        .idata$2
-       .rva            __nm_thnk_SYM (singleton thunk with name of func)
-       .long           0
-       .long           0
-       .rva            __my_dll_iname (name of dll)
-       .rva            __fuNN_SYM (pointer to reference (address) in text)  */
+       .rva            __nm_thnk_SYM (singleton thunk with name of func)
+       .long           0
+       .long           0
+       .rva            __my_dll_iname (name of dll)
+       .rva            __fuNN_SYM (pointer to reference (address) in text)  */
 
 static bfd *
 make_import_fixup_entry (const char *name,
@@ -2492,8 +2495,8 @@ make_import_fixup_entry (const char *name,
 }
 
 /*     .section        .rdata_runtime_pseudo_reloc
-       .long           addend
-       .rva            __fuNN_SYM (pointer to reference (address) in text)  */
+       .long           addend
+       .rva            __fuNN_SYM (pointer to reference (address) in text)  */
 
 static bfd *
 make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
@@ -2577,7 +2580,7 @@ make_runtime_pseudo_reloc (const char *name ATTRIBUTE_UNUSED,
 }
 
 /*     .section        .rdata
-       .rva            __pei386_runtime_relocator  */
+       .rva            __pei386_runtime_relocator  */
 
 static bfd *
 pe_create_runtime_relocator_reference (bfd *parent)
@@ -2655,16 +2658,16 @@ pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend, char *name)
       add_bfd_to_link (b, b->filename, &link_info);
 
       /* If we ever use autoimport, we have to cast text section writable.
-         But not for version 2.  */
+        But not for version 2.  */
       if (link_info.pei386_runtime_pseudo_reloc != 2)
-        {
-          config.text_read_only = FALSE;
-          link_info.output_bfd->flags &= ~WP_TEXT;
-        }
+       {
+         config.text_read_only = FALSE;
+         link_info.output_bfd->flags &= ~WP_TEXT;
+       }
       if (link_info.pei386_runtime_pseudo_reloc == 2)
-        {
+       {
          b = make_singleton_name_imp (name, link_info.output_bfd);
-          add_bfd_to_link (b, b->filename, &link_info);
+         add_bfd_to_link (b, b->filename, &link_info);
        }
     }
 
@@ -2679,27 +2682,27 @@ pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend, char *name)
       add_bfd_to_link (b, b->filename, &link_info);
     }
 
-    if ((link_info.pei386_runtime_pseudo_reloc != 0 && addend != 0)
-        || link_info.pei386_runtime_pseudo_reloc == 2)
-      {
-       if (pe_dll_extra_pe_debug)
-         printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
-                 fixup_name, (int) addend);
+  if ((link_info.pei386_runtime_pseudo_reloc != 0 && addend != 0)
+      || link_info.pei386_runtime_pseudo_reloc == 2)
+    {
+      if (pe_dll_extra_pe_debug)
+       printf ("creating runtime pseudo-reloc entry for %s (addend=%d)\n",
+               fixup_name, (int) addend);
 
-       b = make_runtime_pseudo_reloc (name, fixup_name, addend, rel->howto->bitsize,
-                                      link_info.output_bfd);
-       add_bfd_to_link (b, b->filename, &link_info);
+      b = make_runtime_pseudo_reloc (name, fixup_name, addend, rel->howto->bitsize,
+                                    link_info.output_bfd);
+      add_bfd_to_link (b, b->filename, &link_info);
 
-       if (runtime_pseudo_relocs_created == 0)
-         {
-           b = pe_create_runtime_relocator_reference (link_info.output_bfd);
-           add_bfd_to_link (b, b->filename, &link_info);
-         }
-       runtime_pseudo_relocs_created++;
-      }
-    else if (addend != 0)
-      einfo (_("%P%X%C: variable '%T' can't be auto-imported. Please read the documentation for ld's --enable-auto-import for details.\n"),
-            s->owner, s, rel->address, sym->name);
+      if (runtime_pseudo_relocs_created == 0)
+       {
+         b = pe_create_runtime_relocator_reference (link_info.output_bfd);
+         add_bfd_to_link (b, b->filename, &link_info);
+       }
+      runtime_pseudo_relocs_created++;
+    }
+  else if (addend != 0)
+    einfo (_("%X%P: %C: variable '%pT' can't be auto-imported; please read the documentation for ld's --enable-auto-import for details\n"),
+          s->owner, s, rel->address, sym->name);
 }
 
 
@@ -2726,7 +2729,7 @@ pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_
   if (!outarch)
     {
       /* xgettext:c-format */
-      einfo (_("%P%X: Can't open .lib file: %s\n"), impfilename);
+      einfo (_("%X%P: can't open .lib file: %s\n"), impfilename);
       return;
     }
 
@@ -2753,15 +2756,15 @@ pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_
          found = (filename_cmp (ex->string, ibfd->filename) == 0);
        }
       /* If it matched, we must open a fresh BFD for it (the original
-        input BFD is still needed for the DLL's final link) and add
-       it into the archive member chain.  */
+        input BFD is still needed for the DLL's final link) and add
+        it into the archive member chain.  */
       if (found)
        {
          bfd *newbfd = bfd_openr (ibfd->my_archive
                ? ibfd->my_archive->filename : ibfd->filename, NULL);
          if (!newbfd)
            {
-             einfo (_("%P%X: bfd_openr %s: %E\n"), ibfd->filename);
+             einfo (_("%X%P: bfd_openr %s: %E\n"), ibfd->filename);
              return;
            }
          if (ibfd->my_archive)
@@ -2773,7 +2776,7 @@ pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_
              bfd *arbfd = newbfd;
              if (!bfd_check_format_matches (arbfd, bfd_archive, NULL))
                {
-                 einfo (_("%P%X: %s(%s): can't find member in non-archive file"),
+                 einfo (_("%X%P: %s(%s): can't find member in non-archive file"),
                    ibfd->my_archive->filename, ibfd->filename);
                  return;
                }
@@ -2785,7 +2788,7 @@ pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_
                }
              if (!newbfd)
                {
-                 einfo (_("%P%X: %s(%s): can't find member in archive"),
+                 einfo (_("%X%P: %s(%s): can't find member in archive"),
                    ibfd->my_archive->filename, ibfd->filename);
                  return;
                }
@@ -2860,10 +2863,10 @@ pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_
   head = ar_tail;
 
   if (! bfd_set_archive_head (outarch, head))
-    einfo ("%P%X: bfd_set_archive_head: %E\n");
+    einfo ("%X%P: bfd_set_archive_head: %E\n");
 
   if (! bfd_close (outarch))
-    einfo ("%P%X: bfd_close %s: %E\n", impfilename);
+    einfo ("%X%P: bfd_close %s: %E\n", impfilename);
 
   while (head != NULL)
     {
@@ -2913,7 +2916,7 @@ pe_find_cdecl_alias_match (struct bfd_link_info *linfo, char *name)
     {
       h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
       if (h->type == bfd_link_hash_undefined)
-        goto return_h;
+       goto return_h;
     }
 
   if (lname[0] == '?')
@@ -2922,7 +2925,7 @@ pe_find_cdecl_alias_match (struct bfd_link_info *linfo, char *name)
   if (at || lname[0] == '@')
     {
       if (lname[0] == '@')
-        {
+       {
          if (pe_details->underscored)
            lname[0] = '_';
          else
@@ -2938,7 +2941,7 @@ pe_find_cdecl_alias_match (struct bfd_link_info *linfo, char *name)
            }
        }
       if (at)
-        *strchr (lname, '@') = 0;
+       *strchr (lname, '@') = 0;
       key.key = lname;
       kv = bsearch (&key, udef_table, undef_count,
                    sizeof (struct key_value), undef_sort_cmp);
@@ -2979,7 +2982,7 @@ pe_find_cdecl_alias_match (struct bfd_link_info *linfo, char *name)
     {
       h = bfd_link_hash_lookup (linfo->hash, kv->oname, FALSE, FALSE, FALSE);
       if (h->type == bfd_link_hash_undefined)
-        goto return_h;
+       goto return_h;
     }
 
  return_NULL:
@@ -2991,7 +2994,7 @@ pe_find_cdecl_alias_match (struct bfd_link_info *linfo, char *name)
 
 static bfd_boolean
 pe_undef_count (struct bfd_link_hash_entry *h ATTRIBUTE_UNUSED,
-                void *inf ATTRIBUTE_UNUSED)
+               void *inf ATTRIBUTE_UNUSED)
 {
   if (h->type == bfd_link_hash_undefined)
     undef_count++;
@@ -3009,7 +3012,7 @@ pe_undef_fill (struct bfd_link_hash_entry *h, void *inf ATTRIBUTE_UNUSED)
       at = strchr (udef_table[undef_count].key
                   + (udef_table[undef_count].key[0] == '@'), '@');
       if (at)
-        at[1] = 0;
+       at[1] = 0;
       udef_table[undef_count].oname = h->root.string;
       undef_count++;
     }
@@ -3047,7 +3050,7 @@ add_bfd_to_link (bfd *abfd, const char *name, struct bfd_link_info *linfo)
   ldlang_add_file (fake_file);
 
   if (!bfd_link_add_symbols (abfd, linfo))
-    einfo ("%P%X: addsym %s: %E\n", name);
+    einfo (_("%X%P: add symbols %s: %E\n"), name);
 }
 
 void
@@ -3073,7 +3076,7 @@ pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo)
       for (i = 0; i < pe_def_file->num_imports && imp[i].module != module; i++)
        ;
       if (i >= pe_def_file->num_imports)
-        continue;
+       continue;
 
       dll_filename = module->name;
       dll_symname = xstrdup (module->name);
@@ -3117,7 +3120,7 @@ pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo)
              blhe = bfd_link_hash_lookup (linfo->hash, name,
                                           FALSE, FALSE, FALSE);
              if (blhe)
-               is_undef = (blhe->type == bfd_link_hash_undefined);
+               is_undef = (blhe->type == bfd_link_hash_undefined);
            }
          else
            {
@@ -3131,7 +3134,7 @@ pe_process_import_defs (bfd *output_bfd, struct bfd_link_info *linfo)
              blhe = pe_find_cdecl_alias_match (linfo, name);
              include_jmp_stub = TRUE;
              if (blhe)
-               is_undef = (blhe->type == bfd_link_hash_undefined);
+               is_undef = (blhe->type == bfd_link_hash_undefined);
            }
 
          free (name);
@@ -3233,14 +3236,14 @@ pe_implied_import_dll (const char *filename)
   dll = bfd_openr (filename, pe_details->target_name);
   if (!dll)
     {
-      einfo ("%P%X: open %s: %E\n", filename);
+      einfo (_("%X%P: open %s: %E\n"), filename);
       return FALSE;
     }
 
   /* PEI dlls seem to be bfd_objects.  */
   if (!bfd_check_format (dll, bfd_object))
     {
-      einfo ("%P%X: %s: this doesn't appear to be a DLL\n", filename);
+      einfo (_("%X%P: %s: this doesn't appear to be a DLL\n"), filename);
       return FALSE;
     }
 
@@ -3380,26 +3383,26 @@ pe_implied_import_dll (const char *filename)
       /* Skip unwanted symbols, which are
         exported in buggy auto-import releases.  */
       if (! CONST_STRNEQ (erva + name_rva, "__nm_"))
-       {
+       {
          int is_dup = 0;
-         /* is_data is true if the address is in the data, rdata or bss
+         /* is_data is true if the address is in the data, rdata or bss
             segment.  */
-         is_data =
+         is_data =
            (func_rva >= data_start && func_rva < data_end)
            || (func_rva >= rdata_start && func_rva < rdata_end)
            || (func_rva >= bss_start && func_rva < bss_end);
 
          imp = def_file_add_import (pe_def_file, erva + name_rva,
                                     dllname, i, NULL, NULL, &is_dup);
-         /* Mark symbol type.  */
-         if (!is_dup)
-           imp->data = is_data;
+         /* Mark symbol type.  */
+         if (!is_dup)
+           imp->data = is_data;
 
-         if (pe_dll_extra_pe_debug)
+         if (pe_dll_extra_pe_debug)
            printf ("%s dll-name: %s sym: %s addr: 0x%lx %s\n",
                    __FUNCTION__, dllname, erva + name_rva,
                    (unsigned long) func_rva, is_data ? "(data)" : "");
-       }
+       }
     }
 
   return TRUE;
@@ -3411,7 +3414,7 @@ pe_output_file_set_long_section_names (bfd *abfd)
   if (pe_use_coff_long_section_names < 0)
     return;
   if (!bfd_coff_set_long_section_names (abfd, pe_use_coff_long_section_names))
-    einfo (_("%P%X: Error: can't use long section names on this arch\n"));
+    einfo (_("%X%P: error: can't use long section names on this arch\n"));
 }
 
 /* These are the main functions, called from the emulation.  The first
@@ -3504,6 +3507,6 @@ bfd_boolean
 pe_bfd_is_dll (bfd *abfd)
 {
   return (bfd_get_format (abfd) == bfd_object
-          && obj_pe (abfd)
-          && pe_data (abfd)->dll);
+         && obj_pe (abfd)
+         && pe_data (abfd)->dll);
 }