Move PE format object file detection code into common place.

This commit is contained in:
Nick Clifton 1999-12-17 19:03:09 +00:00
parent eaeaa15ca4
commit cb665cd3e2
4 changed files with 96 additions and 128 deletions

View 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.

View 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 */

View File

@ -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;

View 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