aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNick Clifton <nickc@redhat.com>1999-12-17 19:03:09 +0000
committerNick Clifton <nickc@redhat.com>1999-12-17 19:03:09 +0000
commitcb665cd3e27a53bdc921ba8df64d44dfce65291d (patch)
tree1e366ebf64f07b581199e75900fd5845135f90aa
parenteaeaa15ca4218d3486bb5d9a3a27201c55311e56 (diff)
downloadgdb-cb665cd3e27a53bdc921ba8df64d44dfce65291d.zip
gdb-cb665cd3e27a53bdc921ba8df64d44dfce65291d.tar.gz
gdb-cb665cd3e27a53bdc921ba8df64d44dfce65291d.tar.bz2
Move PE format object file detection code into common place.
-rw-r--r--bfd/ChangeLog13
-rw-r--r--bfd/coff-i386.c67
-rw-r--r--bfd/coff-mcore.c63
-rw-r--r--bfd/peicode.h81
4 files changed, 96 insertions, 128 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index e19cbdd..8f147b7 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -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.
diff --git a/bfd/coff-i386.c b/bfd/coff-i386.c
index a463e58..c5afe65 100644
--- a/bfd/coff-i386.c
+++ b/bfd/coff-i386.c
@@ -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 */
diff --git a/bfd/coff-mcore.c b/bfd/coff-mcore.c
index 09d8bf1..7a3cfaa 100644
--- a/bfd/coff-mcore.c
+++ b/bfd/coff-mcore.c
@@ -582,69 +582,6 @@ coff_mcore_relocate_section (output_bfd, info, input_bfd, input_section,
#include "coffcode.h"
-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);
-}
-
/* Forward declaration to initialise alterbative_target field. */
extern const bfd_target TARGET_LITTLE_SYM;
diff --git a/bfd/peicode.h b/bfd/peicode.h
index 0b6bde4..84dfe57 100644
--- a/bfd/peicode.h
+++ b/bfd/peicode.h
@@ -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