From cb665cd3e27a53bdc921ba8df64d44dfce65291d Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Fri, 17 Dec 1999 19:03:09 +0000 Subject: [PATCH] Move PE format object file detection code into common place. --- bfd/ChangeLog | 13 ++++++++ bfd/coff-i386.c | 67 ++------------------------------------- bfd/coff-mcore.c | 63 ------------------------------------- bfd/peicode.h | 81 ++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 96 insertions(+), 128 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index e19cbddfddf..8f147b74eaa 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,16 @@ +1999-12-17 Nick Clifton + + * 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 * coff-arm.c (NUM_ELEM): New macro. diff --git a/bfd/coff-i386.c b/bfd/coff-i386.c index a463e58b070..c5afe656f1a 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 09d8bf164e6..7a3cfaa7591 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 0b6bde4e44b..84dfe57372d 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 -- 2.30.2