Move PE format object file detection code into common place.
authorNick Clifton <nickc@redhat.com>
Fri, 17 Dec 1999 19:03:09 +0000 (19:03 +0000)
committerNick Clifton <nickc@redhat.com>
Fri, 17 Dec 1999 19:03:09 +0000 (19:03 +0000)
bfd/ChangeLog
bfd/coff-i386.c
bfd/coff-mcore.c
bfd/peicode.h

index e19cbdd..8f147b7 100644 (file)
@@ -1,3 +1,16 @@
+1999-12-17  Nick Clifton  <nickc@cygnus.com>
+
+       * coff-i386.c (i3coff_object_p): Delete.
+       (i386coff_vec): Replace reference to i3coff_object_p with a
+       reference to coff_object_p.
+
+       * coff-mcore.c (pe_object_p): Delete.
+
+       * peicode.h (pe_bfd_object_p): New function: Detect the
+       presence of a PE format COFF object file.  Also detect and
+       warn about the presence of LINK6 format Image Library Format
+       object files.
+       
 1999-12-16  Nick Clifton  <nickc@cygnus.com>
 
        * coff-arm.c (NUM_ELEM): New macro.
index a463e58..c5afe65 100644 (file)
@@ -535,69 +535,6 @@ coff_i386_is_local_label_name (abfd, name)
 
 #include "coffcode.h"
 
-static const bfd_target *
-i3coff_object_p (abfd)
-     bfd *abfd;
-{
-#ifdef COFF_IMAGE_WITH_PE
-  /* We need to hack badly to handle a PE image correctly.  In PE
-     images created by the GNU linker, the offset to the COFF header
-     is always the size.  However, this is not the case in images
-     generated by other PE linkers.  The PE format stores a four byte
-     offset to the PE signature just before the COFF header at
-     location 0x3c of the file.  We pick up that offset, verify that
-     the PE signature is there, and then set ourselves up to read in
-     the COFF header.  */
-  {
-    bfd_byte ext_offset[4];
-    file_ptr offset;
-    bfd_byte ext_signature[4];
-    unsigned long signature;
-
-    if (bfd_seek (abfd, 0x3c, SEEK_SET) != 0
-       || bfd_read (ext_offset, 1, 4, abfd) != 4)
-      {
-       if (bfd_get_error () != bfd_error_system_call)
-         bfd_set_error (bfd_error_wrong_format);
-       return NULL;
-      }
-    offset = bfd_h_get_32 (abfd, ext_offset);
-    if (bfd_seek (abfd, offset, SEEK_SET) != 0
-       || bfd_read (ext_signature, 1, 4, abfd) != 4)
-      {
-       if (bfd_get_error () != bfd_error_system_call)
-         bfd_set_error (bfd_error_wrong_format);
-       return NULL;
-      }
-    signature = bfd_h_get_32 (abfd, ext_signature);
-
-    if (signature != 0x4550)
-      {
-       bfd_set_error (bfd_error_wrong_format);
-       return NULL;
-      }
-
-    /* Here is the hack.  coff_object_p wants to read filhsz bytes to
-       pick up the COFF header.  We adjust so that that will work.  20
-       is the size of the i386 COFF filehdr.  */
-
-    if (bfd_seek (abfd,
-                 (bfd_tell (abfd)
-                  - bfd_coff_filhsz (abfd)
-                  + 20),
-                 SEEK_SET)
-       != 0)
-      {
-       if (bfd_get_error () != bfd_error_system_call)
-         bfd_set_error (bfd_error_wrong_format);
-       return NULL;
-      }
-  }
-#endif
-
-  return coff_object_p (abfd);
-}
-
 const bfd_target
 #ifdef TARGET_SYM
   TARGET_SYM =
@@ -640,8 +577,8 @@ const bfd_target
      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* hdrs */
 
 /* Note that we allow an object file to be treated as a core file as well. */
-    {_bfd_dummy_target, i3coff_object_p, /* bfd_check_format */
-       bfd_generic_archive_p, i3coff_object_p},
+    {_bfd_dummy_target, coff_object_p, /* bfd_check_format */
+       bfd_generic_archive_p, coff_object_p},
     {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
        bfd_false},
     {bfd_false, coff_write_object_contents, /* bfd_write_contents */
index 09d8bf1..7a3cfaa 100644 (file)
@@ -582,69 +582,6 @@ coff_mcore_relocate_section (output_bfd, info, input_bfd, input_section,
 
 #include "coffcode.h"
 \f
-static const bfd_target *
-pe_object_p (abfd)
-     bfd * abfd;
-{
-#ifdef COFF_IMAGE_WITH_PE
-  /* We need to hack badly to handle a PE image correctly.  In PE
-     images created by the GNU linker, the offset to the COFF header
-     is always the size.  However, this is not the case in images
-     generated by other PE linkers.  The PE format stores a four byte
-     offset to the PE signature just before the COFF header at
-     location 0x3c of the file.  We pick up that offset, verify that
-     the PE signature is there, and then set ourselves up to read in
-     the COFF header.  */
-  {
-    bfd_byte ext_offset[4];
-    file_ptr offset;
-    bfd_byte ext_signature[4];
-    unsigned long signature;
-
-    if (bfd_seek (abfd, 0x3c, SEEK_SET) != 0
-       || bfd_read (ext_offset, 1, 4, abfd) != 4)
-      {
-       if (bfd_get_error () != bfd_error_system_call)
-         bfd_set_error (bfd_error_wrong_format);
-       return NULL;
-      }
-    
-    offset = bfd_h_get_32 (abfd, ext_offset);
-    
-    if (bfd_seek (abfd, offset, SEEK_SET) != 0
-       || bfd_read (ext_signature, 1, 4, abfd) != 4)
-      {
-       if (bfd_get_error () != bfd_error_system_call)
-         bfd_set_error (bfd_error_wrong_format);
-       
-       return NULL;
-      }
-    
-    signature = bfd_h_get_32 (abfd, ext_signature);
-
-    if (signature != 0x4550)
-      {
-       bfd_set_error (bfd_error_wrong_format);
-       return NULL;
-      }
-
-    /* Here is the hack.  coff_object_p wants to read filhsz bytes to
-       pick up the COFF header.  We adjust so that that will work.  20
-       is the size of the mips COFF filehdr.  */
-    if (bfd_seek (abfd, (bfd_tell (abfd) - bfd_coff_filhsz (abfd) + 20),
-                 SEEK_SET) != 0)
-      {
-       if (bfd_get_error () != bfd_error_system_call)
-         bfd_set_error (bfd_error_wrong_format);
-       
-       return NULL;
-      }
-  }
-#endif
-
-  return coff_object_p (abfd);
-}
-\f
 /* Forward declaration to initialise alterbative_target field.  */
 extern const bfd_target TARGET_LITTLE_SYM;
 
index 0b6bde4..84dfe57 100644 (file)
@@ -361,3 +361,84 @@ pe_bfd_copy_private_bfd_data (ibfd, obfd)
   _bfd_pe_bfd_copy_private_section_data
 
 #define coff_get_symbol_info _bfd_pe_get_symbol_info
+
+static const bfd_target *
+pe_bfd_object_p (abfd)
+     bfd * abfd;
+{
+  /* We need to handle a PE image correctly.  In PE images created by
+     the GNU linker, the offset to the COFF header is always the size.
+     However, this is not the case in images generated by other PE
+     linkers.  The PE format stores a four byte offset to the PE
+     signature just before the COFF header at location 0x3c of the file.
+     We pick up that offset, verify that the PE signature is there, and
+     then set ourselves up to read in the COFF header.  */
+  bfd_byte buffer[4];
+  file_ptr offset;
+  unsigned long signature;
+
+  /* Detect if this a Microsoft Import Library Format element.  */
+  if (bfd_seek (abfd, 0x00, SEEK_SET) != 0
+      || bfd_read (buffer, 1, 4, abfd) != 4)
+    {
+      if (bfd_get_error () != bfd_error_system_call)
+       bfd_set_error (bfd_error_wrong_format);
+      return NULL;
+    }
+  
+  signature = bfd_h_get_32 (abfd, buffer);
+  
+  if (signature == 0xffff0000)
+    {
+      _bfd_error_handler (_("%s: Import Library Format archives are not currently supported"),
+                         bfd_get_filename (abfd));
+      bfd_set_error (bfd_error_wrong_format);
+       
+      return NULL;
+    }
+  
+  if (bfd_seek (abfd, 0x3c, SEEK_SET) != 0
+      || bfd_read (buffer, 1, 4, abfd) != 4)
+    {
+      if (bfd_get_error () != bfd_error_system_call)
+       bfd_set_error (bfd_error_wrong_format);
+      return NULL;
+    }
+
+  offset = bfd_h_get_32 (abfd, buffer);
+
+  if (bfd_seek (abfd, offset, SEEK_SET) != 0
+      || bfd_read (buffer, 1, 4, abfd) != 4)
+    {
+      if (bfd_get_error () != bfd_error_system_call)
+       bfd_set_error (bfd_error_wrong_format);
+      return NULL;
+    }
+
+  signature = bfd_h_get_32 (abfd, buffer);
+
+  if (signature != 0x4550)
+    {
+      bfd_set_error (bfd_error_wrong_format);
+      return NULL;
+    }
+  
+  /* Here is the hack.  coff_object_p wants to read filhsz bytes to
+     pick up the COFF header.  We adjust so that that will work.  20
+     is the size of the i386 COFF filehdr.  */
+  if (bfd_seek (abfd,
+               (bfd_tell (abfd)
+                - bfd_coff_filhsz (abfd)
+                + 20),
+               SEEK_SET)
+      != 0)
+    {
+      if (bfd_get_error () != bfd_error_system_call)
+       bfd_set_error (bfd_error_wrong_format);
+      return NULL;
+    }
+
+  return coff_object_p (abfd);
+}
+
+#define coff_object_p pe_bfd_object_p