This is the mail archive of the binutils-cvs@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[binutils-gdb] Make the linker fail if asked to create more than 1^16 ordinal values for PE targets.


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=611a3ca929d6529f4e7576b0e2ffb588839c1b21

commit 611a3ca929d6529f4e7576b0e2ffb588839c1b21
Author: Nick Clifton <nickc@redhat.com>
Date:   Fri Mar 3 11:35:03 2017 +0000

    Make the linker fail if asked to create more than 1^16 ordinal values for PE targets.
    
    	PR 12969
    	* pe-dll.c (generate_edata): Fail if the input file(s) require too
    	many ordinals.

Diff:
---
 ld/ChangeLog |  6 ++++++
 ld/pe-dll.c  | 55 +++++++++++++++++++++++++++++--------------------------
 2 files changed, 35 insertions(+), 26 deletions(-)

diff --git a/ld/ChangeLog b/ld/ChangeLog
index c785437..db2354a 100644
--- a/ld/ChangeLog
+++ b/ld/ChangeLog
@@ -1,3 +1,9 @@
+2017-03-03  Max Bolingbroke  <batterseapower@hotmail.com>
+
+	PR 12969
+	* pe-dll.c (generate_edata): Fail if the input file(s) require too
+	many ordinals.
+
 2017-03-02  Alan Modra  <amodra@gmail.com>
 
 	* testsuite/ld-elf/shared.exp: Pass -ansi when compiling new.cc
diff --git a/ld/pe-dll.c b/ld/pe-dll.c
index ac7c70c..bb17b7d 100644
--- a/ld/pe-dll.c
+++ b/ld/pe-dll.c
@@ -428,7 +428,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 +797,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 +849,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 +966,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 +1093,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 +1126,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 */
@@ -1483,7 +1489,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 +1617,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)
     {
@@ -2695,11 +2701,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 +2729,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 +2764,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 +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 (_("%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 +2788,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 +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 ("%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 +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 ("%Xaddsym %s: %E\n", name);
+    einfo ("%P%X: addsym %s: %E\n", name);
 }
 
 void
@@ -3233,14 +3236,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 +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 (_("%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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]