2007-11-12 H.J. Lu <hongjiu.lu@intel.com>

PR binutils/5299
	* peicode.h (pe_bfd_object_p): Save and restore previous bfd
	state when calling coff_object_p.
This commit is contained in:
H.J. Lu 2007-11-12 21:55:50 +00:00
parent c261a0be88
commit fa4dfc15df
2 changed files with 23 additions and 4 deletions

View File

@ -1,7 +1,13 @@
2007-11-12 H.J. Lu <hongjiu.lu@intel.com>
PR binutils/5299
* peicode.h (pe_bfd_object_p): Save and restore previous bfd
state when calling coff_object_p.
2007-11-12 Alan Modra <amodra@bigpond.net.au> 2007-11-12 Alan Modra <amodra@bigpond.net.au>
* elf.c (_bfd_elf_get_synthetic_symtab): Only bump the symbol * elf.c (_bfd_elf_get_synthetic_symtab): Only bump the symbol
pointer when we have a valid symbol. Init udata.p to NULL. pointer when we have a valid symbol. Init udata.p to NULL.
2007-11-09 Nathan Sidwell <nathan@codesourcery.com> 2007-11-09 Nathan Sidwell <nathan@codesourcery.com>

View File

@ -1263,6 +1263,7 @@ pe_bfd_object_p (bfd * abfd)
struct external_PEI_IMAGE_hdr image_hdr; struct external_PEI_IMAGE_hdr image_hdr;
file_ptr offset; file_ptr offset;
const bfd_target *target; const bfd_target *target;
struct bfd_preserve preserve;
/* Detect if this a Microsoft Import Library Format element. */ /* Detect if this a Microsoft Import Library Format element. */
if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0 if (bfd_seek (abfd, (file_ptr) 0, SEEK_SET) != 0
@ -1327,6 +1328,10 @@ pe_bfd_object_p (bfd * abfd)
return NULL; return NULL;
} }
preserve.marker = NULL;
if (! bfd_preserve_save (abfd, &preserve))
return NULL;
target = coff_object_p (abfd); target = coff_object_p (abfd);
if (target) if (target)
{ {
@ -1344,7 +1349,10 @@ pe_bfd_object_p (bfd * abfd)
/* Don't check PE vs. EFI if arch is unknown. */ /* Don't check PE vs. EFI if arch is unknown. */
if (arch == arch_type_unknown) if (arch == arch_type_unknown)
return target; {
bfd_preserve_finish (abfd, &preserve);
return target;
}
for (target_ptr = bfd_target_vector; *target_ptr != NULL; for (target_ptr = bfd_target_vector; *target_ptr != NULL;
target_ptr++) target_ptr++)
@ -1361,8 +1369,10 @@ pe_bfd_object_p (bfd * abfd)
if (efi) if (efi)
{ {
no_match:
/* TARGET_PTR is an EFI backend. Don't match /* TARGET_PTR is an EFI backend. Don't match
TARGET with a EFI file. */ TARGET with a EFI file. */
bfd_preserve_restore (abfd, &preserve);
bfd_set_error (bfd_error_wrong_format); bfd_set_error (bfd_error_wrong_format);
return NULL; return NULL;
} }
@ -1377,12 +1387,15 @@ pe_bfd_object_p (bfd * abfd)
{ {
/* TARGET_PTR is a PE backend. Don't match /* TARGET_PTR is a PE backend. Don't match
TARGET with a PE file. */ TARGET with a PE file. */
bfd_set_error (bfd_error_wrong_format); goto no_match;
return NULL;
} }
} }
} }
bfd_preserve_finish (abfd, &preserve);
} }
else
bfd_preserve_restore (abfd, &preserve);
return target; return target;
} }