Fix Rust test suite for 1.20 beta
[deliverable/binutils-gdb.git] / ld / pe-dll.c
index ac7c70ccf48d5c86159f4a3b9eacc79fcae1df8a..e99f753d27d6bf0c32291081fe18e53a60c2fea9 100644 (file)
@@ -269,6 +269,17 @@ static pe_details_type pe_detail_list[] =
 #endif
     autofilter_symbollist_i386
   },
+#ifdef pe_use_x86_64
+  {
+    "pei-x86-64",
+    "pe-bigobj-x86-64",
+    3 /* R_IMAGEBASE */,
+    PE_ARCH_i386,
+    bfd_arch_i386,
+    FALSE,
+    autofilter_symbollist_i386
+  },
+#endif
   {
     "pei-shl",
     "pe-shl",
@@ -428,7 +439,7 @@ pe_dll_id_target (const char *target)
        pe_leading_underscore = (u != 0 ? 1 : 0);
        return;
       }
-  einfo (_("%XUnsupported PEI architecture: %s\n"), target);
+  einfo (_("%P%X: Unsupported PEI architecture: %s\n"), target);
   exit (1);
 }
 
@@ -797,7 +808,7 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *
              if (tmp_at)
                *tmp_at = 0;
              else
-               einfo (_("%XCannot export %s: invalid export name\n"),
+               einfo (_("%P%X: Cannot export %s: invalid export name\n"),
                       pe_def_file->exports[i].name);
              pe_def_file->exports[i].name = tmp;
               resort_needed = TRUE;
@@ -849,14 +860,14 @@ process_def_file_and_drectve (bfd *abfd ATTRIBUTE_UNUSED, struct bfd_link_info *
            {
              if (pe_dll_warn_dup_exports)
                /* xgettext:c-format */
-               einfo (_("%XError, duplicate EXPORT with ordinals: %s (%d vs %d)\n"),
+               einfo (_("%P%X: 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 (_("Warning, duplicate EXPORT: %s\n"),
+               einfo (_("%P: Warning, duplicate EXPORT: %s\n"),
                       e[j - 1].name);
            }
 
@@ -966,20 +977,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 (_("%XCannot export %s: symbol not defined\n"),
+         einfo (_("%P%X: Cannot export %s: symbol not defined\n"),
                 int_name);
        }
       else if (blhe)
        {
          /* xgettext:c-format */
-         einfo (_("%XCannot export %s: symbol wrong type (%d vs %d)\n"),
+         einfo (_("%P%X: Cannot export %s: symbol wrong type (%d vs %d)\n"),
                 int_name,
                 blhe->type, bfd_link_hash_defined);
        }
       else
        {
          /* xgettext:c-format */
-         einfo (_("%XCannot export %s: symbol not found\n"),
+         einfo (_("%P%X: Cannot export %s: symbol not found\n"),
                 int_name);
        }
       free (name);
@@ -1093,7 +1104,7 @@ generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
              if (pi != -1)
                {
                  /* xgettext:c-format */
-                 einfo (_("%XError, ordinal used twice: %d (%s vs %s)\n"),
+                 einfo (_("%P%X: 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,6 +1137,12 @@ generate_edata (bfd *abfd, struct bfd_link_info *info ATTRIBUTE_UNUSED)
        pe_def_file->exports[i].ordinal = next_ordinal;
       }
 
+  /* 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"),
+         max_ordinal > next_ordinal ? max_ordinal : next_ordinal);
+
   /* OK, now we can allocate some memory.  */
   edata_sz = (40                               /* directory */
              + 4 * export_table_size           /* addresses */
@@ -1269,8 +1286,8 @@ static struct bfd_section *current_sec;
 
 void
 pe_walk_relocs_of_symbol (struct bfd_link_info *info,
-                         const char *name,
-                         int (*cb) (arelent *, asection *))
+                         char *name,
+                         int (*cb) (arelent *, asection *, char *))
 {
   bfd *b;
   asection *s;
@@ -1309,7 +1326,7 @@ pe_walk_relocs_of_symbol (struct bfd_link_info *info,
              struct bfd_symbol *sym = *relocs[i]->sym_ptr_ptr;
 
              if (!strcmp (name, sym->name))
-               cb (relocs[i], s);
+               cb (relocs[i], s, name);
            }
 
          free (relocs);
@@ -1483,7 +1500,7 @@ generate_reloc (bfd *abfd, struct bfd_link_info *info)
                      /* Fall through.  */
                    default:
                      /* xgettext:c-format */
-                     einfo (_("%XError: %d-bit reloc in dll\n"),
+                     einfo (_("%P%X: Error: %d-bit reloc in dll\n"),
                             relocs[i]->howto->bitsize);
                      break;
                    }
@@ -1611,8 +1628,8 @@ pe_dll_generate_def_file (const char *pe_out_def_filename)
 
   if (out == NULL)
     /* xgettext:c-format */
-    einfo (_("%s: Can't open output def file %s\n"),
-          program_name, pe_out_def_filename);
+    einfo (_("%P: Can't open output def file %s\n"),
+          pe_out_def_filename);
 
   if (pe_def_file)
     {
@@ -2390,37 +2407,21 @@ make_singleton_name_thunk (const char *import, bfd *parent)
 }
 
 static char *
-make_import_fixup_mark (arelent *rel)
+make_import_fixup_mark (arelent *rel, char *name)
 {
   /* We convert reloc to symbol, for later reference.  */
-  static int counter;
-  static char *fixup_name = NULL;
-  static size_t buffer_len = 0;
-
+  static unsigned int counter;
   struct bfd_symbol *sym = *rel->sym_ptr_ptr;
-
   bfd *abfd = bfd_asymbol_bfd (sym);
   struct bfd_link_hash_entry *bh;
+  char *fixup_name, buf[26];
+  size_t prefix_len;
 
-  if (!fixup_name)
-    {
-      fixup_name = xmalloc (384);
-      buffer_len = 384;
-    }
-
-  if (strlen (sym->name) + 25 > buffer_len)
-  /* Assume 25 chars for "__fu" + counter + "_".  If counter is
-     bigger than 20 digits long, we've got worse problems than
-     overflowing this buffer...  */
-    {
-      free (fixup_name);
-      /* New buffer size is length of symbol, plus 25, but
-        then rounded up to the nearest multiple of 128.  */
-      buffer_len = ((strlen (sym->name) + 25) + 127) & ~127;
-      fixup_name = xmalloc (buffer_len);
-    }
-
-  sprintf (fixup_name, "__fu%d_%s", counter++, sym->name);
+  /* "name" buffer has space before the symbol name for prefixes.  */
+  sprintf (buf, "__fu%d_", counter++);
+  prefix_len = strlen (buf);
+  fixup_name = name - prefix_len;
+  memcpy (fixup_name, buf, prefix_len);
 
   bh = NULL;
   bfd_coff_link_add_one_symbol (&link_info, abfd, fixup_name, BSF_GLOBAL,
@@ -2620,23 +2621,25 @@ pe_create_runtime_relocator_reference (bfd *parent)
 }
 
 void
-pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend)
+pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend, char *name)
 {
-  char buf[300];
   struct bfd_symbol *sym = *rel->sym_ptr_ptr;
   struct bfd_link_hash_entry *name_thunk_sym;
   struct bfd_link_hash_entry *name_imp_sym;
-  const char *name = sym->name;
-  char *fixup_name = make_import_fixup_mark (rel);
+  char *fixup_name, *impname;
   bfd *b;
   int need_import_table = 1;
 
-  sprintf (buf, "__imp_%s", name);
-  name_imp_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
+  /* name buffer is allocated with space at beginning for prefixes.  */
+  impname = name - (sizeof "__imp_" - 1);
+  memcpy (impname, "__imp_", sizeof "__imp_" - 1);
+  name_imp_sym = bfd_link_hash_lookup (link_info.hash, impname, 0, 0, 1);
 
-  sprintf (buf, "__nm_thnk_%s", name);
+  impname = name - (sizeof "__nm_thnk_" - 1);
+  memcpy (impname, "__nm_thnk_", sizeof "__nm_thnk_" - 1);
+  name_thunk_sym = bfd_link_hash_lookup (link_info.hash, impname, 0, 0, 1);
 
-  name_thunk_sym = bfd_link_hash_lookup (link_info.hash, buf, 0, 0, 1);
+  fixup_name = make_import_fixup_mark (rel, name);
 
   /* For version 2 pseudo relocation we don't need to add an import
      if the import symbol is already present.  */
@@ -2695,11 +2698,8 @@ pe_create_import_fixup (arelent *rel, asection *s, bfd_vma addend)
        runtime_pseudo_relocs_created++;
       }
     else if (addend != 0)
-      {
-       einfo (_("%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);
-       einfo ("%X");
-      }
+      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);
 }
 
 
@@ -2726,7 +2726,7 @@ pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_
   if (!outarch)
     {
       /* xgettext:c-format */
-      einfo (_("%XCan't open .lib file: %s\n"), impfilename);
+      einfo (_("%P%X: Can't open .lib file: %s\n"), impfilename);
       return;
     }
 
@@ -2761,7 +2761,7 @@ pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_
                ? ibfd->my_archive->filename : ibfd->filename, NULL);
          if (!newbfd)
            {
-             einfo (_("%Xbfd_openr %s: %E\n"), ibfd->filename);
+             einfo (_("%P%X: bfd_openr %s: %E\n"), ibfd->filename);
              return;
            }
          if (ibfd->my_archive)
@@ -2773,7 +2773,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 (_("%X%s(%s): can't find member in non-archive file"),
+                 einfo (_("%P%X: %s(%s): can't find member in non-archive file"),
                    ibfd->my_archive->filename, ibfd->filename);
                  return;
                }
@@ -2785,7 +2785,7 @@ pe_dll_generate_implib (def_file *def, const char *impfilename, struct bfd_link_
                }
              if (!newbfd)
                {
-                 einfo (_("%X%s(%s): can't find member in archive"),
+                 einfo (_("%P%X: %s(%s): can't find member in archive"),
                    ibfd->my_archive->filename, ibfd->filename);
                  return;
                }
@@ -2860,10 +2860,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 ("%Xbfd_set_archive_head: %E\n");
+    einfo ("%P%X: bfd_set_archive_head: %E\n");
 
   if (! bfd_close (outarch))
-    einfo ("%Xbfd_close %s: %E\n", impfilename);
+    einfo ("%P%X: bfd_close %s: %E\n", impfilename);
 
   while (head != NULL)
     {
@@ -3047,7 +3047,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 ("%Xaddsym %s: %E\n", name);
+    einfo ("%P%X: addsym %s: %E\n", name);
 }
 
 void
@@ -3233,14 +3233,14 @@ pe_implied_import_dll (const char *filename)
   dll = bfd_openr (filename, pe_details->target_name);
   if (!dll)
     {
-      einfo ("%Xopen %s: %E\n", filename);
+      einfo ("%P%X: open %s: %E\n", filename);
       return FALSE;
     }
 
   /* PEI dlls seem to be bfd_objects.  */
   if (!bfd_check_format (dll, bfd_object))
     {
-      einfo ("%X%s: this doesn't appear to be a DLL\n", filename);
+      einfo ("%P%X: %s: this doesn't appear to be a DLL\n", filename);
       return FALSE;
     }
 
@@ -3411,7 +3411,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 (_("%XError: can't use long section names on this arch\n"));
+    einfo (_("%P%X: Error: can't use long section names on this arch\n"));
 }
 
 /* These are the main functions, called from the emulation.  The first
This page took 0.027207 seconds and 4 git commands to generate.