mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2025-02-17 16:09:47 +00:00
Move PE format object file detection code into common place.
This commit is contained in:
parent
eaeaa15ca4
commit
cb665cd3e2
@ -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.
|
||||
|
@ -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 */
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
x
Reference in New Issue
Block a user