[binutils-gdb] When copying pe format files, copy the dos_message array, rather than re-initiialising it.

Nick Clifton nickc@sourceware.org
Tue Oct 29 17:08:00 GMT 2019


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

commit 70cf683455e1a3429d517a2e25a36c438474cfde
Author: Andrew Eikum <aeikum@codeweavers.com>
Date:   Tue Oct 29 17:07:03 2019 +0000

    When copying pe format files, copy the dos_message array, rather than re-initiialising it.
    
    	* libcoff-in.h (struct pe_tdata): Add dos_message field.
    	* libcoff.h: Regenerate.
    	* peXXigen.c (_bfd_XXi_only_swap_filehdr_out): Copy the
    	dos_message field rather than initialising it.
    	(_bfd_XX_bfd_copy_private_bfd_data_common): Copy the dos_message
    	field.
    	* peicode.h (pe_mkobject): Initialise the dos_message field.
    	(pe_mkobject_hook): Copy the dos_message field.
    	(pe_bfd_object_p): Copy the dos_message field.

Diff:
---
 bfd/ChangeLog    | 12 ++++++++++++
 bfd/libcoff-in.h |  1 +
 bfd/libcoff.h    |  1 +
 bfd/peXXigen.c   | 21 +++++----------------
 bfd/peicode.h    | 24 ++++++++++++++++++++++++
 5 files changed, 43 insertions(+), 16 deletions(-)

diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 2b41fb3..20d7d5a 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,15 @@
+2019-10-29  Andrew Eikum  <aeikum@codeweavers.com>
+
+	* libcoff-in.h (struct pe_tdata): Add dos_message field.
+	* libcoff.h: Regenerate.
+	* peXXigen.c (_bfd_XXi_only_swap_filehdr_out): Copy the
+	dos_message field rather than initialising it.
+	(_bfd_XX_bfd_copy_private_bfd_data_common): Copy the dos_message
+	field.
+	* peicode.h (pe_mkobject): Initialise the dos_message field.
+	(pe_mkobject_hook): Copy the dos_message field.
+	(pe_bfd_object_p): Copy the dos_message field.
+
 2019-10-25  Alan Modra  <amodra@gmail.com>
 
 	PR 4499
diff --git a/bfd/libcoff-in.h b/bfd/libcoff-in.h
index 783d54a..031622f 100644
--- a/bfd/libcoff-in.h
+++ b/bfd/libcoff-in.h
@@ -127,6 +127,7 @@ typedef struct pe_tdata
   int dll;
   int has_reloc_section;
   int dont_strip_reloc;
+  int dos_message[16];
   bfd_boolean insert_timestamp;
   bfd_boolean (*in_reloc_p) (bfd *, reloc_howto_type *);
   flagword real_flags;
diff --git a/bfd/libcoff.h b/bfd/libcoff.h
index f2613c2..093f1b4 100644
--- a/bfd/libcoff.h
+++ b/bfd/libcoff.h
@@ -131,6 +131,7 @@ typedef struct pe_tdata
   int dll;
   int has_reloc_section;
   int dont_strip_reloc;
+  int dos_message[16];
   bfd_boolean insert_timestamp;
   bfd_boolean (*in_reloc_p) (bfd *, reloc_howto_type *);
   flagword real_flags;
diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c
index ab0da7f..1f55f92 100644
--- a/bfd/peXXigen.c
+++ b/bfd/peXXigen.c
@@ -863,22 +863,9 @@ _bfd_XXi_only_swap_filehdr_out (bfd * abfd, void * in, void * out)
 
   /* This next collection of data are mostly just characters.  It
      appears to be constant within the headers put on NT exes.  */
-  filehdr_in->pe.dos_message[0]  = 0x0eba1f0e;
-  filehdr_in->pe.dos_message[1]  = 0xcd09b400;
-  filehdr_in->pe.dos_message[2]  = 0x4c01b821;
-  filehdr_in->pe.dos_message[3]  = 0x685421cd;
-  filehdr_in->pe.dos_message[4]  = 0x70207369;
-  filehdr_in->pe.dos_message[5]  = 0x72676f72;
-  filehdr_in->pe.dos_message[6]  = 0x63206d61;
-  filehdr_in->pe.dos_message[7]  = 0x6f6e6e61;
-  filehdr_in->pe.dos_message[8]  = 0x65622074;
-  filehdr_in->pe.dos_message[9]  = 0x6e757220;
-  filehdr_in->pe.dos_message[10] = 0x206e6920;
-  filehdr_in->pe.dos_message[11] = 0x20534f44;
-  filehdr_in->pe.dos_message[12] = 0x65646f6d;
-  filehdr_in->pe.dos_message[13] = 0x0a0d0d2e;
-  filehdr_in->pe.dos_message[14] = 0x24;
-  filehdr_in->pe.dos_message[15] = 0x0;
+  memcpy (filehdr_in->pe.dos_message, pe_data (abfd)->dos_message,
+	  sizeof (filehdr_in->pe.dos_message));
+
   filehdr_in->pe.nt_signature = IMAGE_NT_SIGNATURE;
 
   H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->f_magic);
@@ -2979,6 +2966,8 @@ _bfd_XX_bfd_copy_private_bfd_data_common (bfd * ibfd, bfd * obfd)
       && ! (pe_data (ibfd)->real_flags & IMAGE_FILE_RELOCS_STRIPPED))
     pe_data (obfd)->dont_strip_reloc = 1;
 
+  memcpy (ope->dos_message, ipe->dos_message, sizeof (ope->dos_message));
+
   /* The file offsets contained in the debug directory need rewriting.  */
   if (ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size != 0)
     {
diff --git a/bfd/peicode.h b/bfd/peicode.h
index 1e2b104..e9d205a 100644
--- a/bfd/peicode.h
+++ b/bfd/peicode.h
@@ -271,6 +271,24 @@ pe_mkobject (bfd * abfd)
   /* in_reloc_p is architecture dependent.  */
   pe->in_reloc_p = in_reloc_p;
 
+  /* Default DOS message string.  */
+  pe->dos_message[0]  = 0x0eba1f0e;
+  pe->dos_message[1]  = 0xcd09b400;
+  pe->dos_message[2]  = 0x4c01b821;
+  pe->dos_message[3]  = 0x685421cd;
+  pe->dos_message[4]  = 0x70207369;
+  pe->dos_message[5]  = 0x72676f72;
+  pe->dos_message[6]  = 0x63206d61;
+  pe->dos_message[7]  = 0x6f6e6e61;
+  pe->dos_message[8]  = 0x65622074;
+  pe->dos_message[9]  = 0x6e757220;
+  pe->dos_message[10] = 0x206e6920;
+  pe->dos_message[11] = 0x20534f44;
+  pe->dos_message[12] = 0x65646f6d;
+  pe->dos_message[13] = 0x0a0d0d2e;
+  pe->dos_message[14] = 0x24;
+  pe->dos_message[15] = 0x0;
+
   memset (& pe->pe_opthdr, 0, sizeof pe->pe_opthdr);
   return TRUE;
 }
@@ -325,6 +343,9 @@ pe_mkobject_hook (bfd * abfd,
     coff_data (abfd) ->flags = 0;
 #endif
 
+  memcpy (pe->dos_message, internal_f->pe.dos_message,
+	  sizeof (pe->dos_message));
+
   return (void *) pe;
 }
 
@@ -1456,6 +1477,9 @@ pe_bfd_object_p (bfd * abfd)
       return NULL;
     }
 
+  memcpy (internal_f.pe.dos_message, dos_hdr.dos_message,
+	  sizeof (internal_f.pe.dos_message));
+
   /* Read the optional header, which has variable size.  */
   opt_hdr_size = internal_f.f_opthdr;



More information about the Binutils-cvs mailing list