diff options
author | Nick Clifton <nickc@redhat.com> | 2008-02-14 15:20:26 +0000 |
---|---|---|
committer | Nick Clifton <nickc@redhat.com> | 2008-02-14 15:20:26 +0000 |
commit | e81819a5c075b642b3b4e171d3d0ce77d2c9da47 (patch) | |
tree | 778740cbcf26f2f26cdaebe0f35c588c4d8b417d /bfd/peicode.h | |
parent | d669d37f8d626f00e8b815527f35017e93a0c00b (diff) | |
download | gdb-e81819a5c075b642b3b4e171d3d0ce77d2c9da47.zip gdb-e81819a5c075b642b3b4e171d3d0ce77d2c9da47.tar.gz gdb-e81819a5c075b642b3b4e171d3d0ce77d2c9da47.tar.bz2 |
* efi-rtdrv-ia32.c: New file.
* efi-bsdrv-ia32.c: New file.
* efi-rtdrv-ia64.c: New file.
* efi-bsdrv-ia64.c: New file.
* efi-rtdrv-x86_64.c: New file.
* efi-bsdrv-x86_64.c: New file.
* peicode.h (pe_bfd_object_p): Add support for boot service and
runtime service drivers.
* libpei.h: Add macros for EFI formats, and rename the efi application
format macros to disambiguate.
* targets.c: Add bfd_target _vec externs.
(_bfd_tar): Add EFI _vec entries.
* config.bfd: Add EFI vectors into the selection routines.
* configure.in: add EFI _vec entries.
* configure: Regenerate.
* Makefile.am: Add EFI files.
* Makefile.in: Regenerate.
Diffstat (limited to 'bfd/peicode.h')
-rw-r--r-- | bfd/peicode.h | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/bfd/peicode.h b/bfd/peicode.h index 15cad54..357d1c8 100644 --- a/bfd/peicode.h +++ b/bfd/peicode.h @@ -1,6 +1,6 @@ /* Support for the generic parts of PE/PEI, for BFD. Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, - 2005, 2006, 2007 Free Software Foundation, Inc. + 2005, 2006, 2007, 2008 Free Software Foundation, Inc. Written by Cygnus Solutions. This file is part of BFD, the Binary File Descriptor library. @@ -237,7 +237,7 @@ coff_swap_scnhdr_in (bfd * abfd, void * ext, void * in) if (scnhdr_int->s_paddr > 0 && (((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0 && (! bfd_pe_executable_p (abfd) || scnhdr_int->s_size == 0)) - || (bfd_pe_executable_p (abfd) && scnhdr_int->s_size > scnhdr_int->s_paddr))) + || (bfd_pe_executable_p (abfd) && (scnhdr_int->s_size > scnhdr_int->s_paddr)))) /* This code used to set scnhdr_int->s_paddr to 0. However, coff_set_alignment_hook stores s_paddr in virt_size, which only works if it correctly holds the virtual size of the @@ -1337,13 +1337,19 @@ pe_bfd_object_p (bfd * abfd) { pe_data_type *pe = pe_data (abfd); struct internal_extra_pe_aouthdr *i = &pe->pe_opthdr; - bfd_boolean efi = i->Subsystem == IMAGE_SUBSYSTEM_EFI_APPLICATION; + bfd_boolean efi = i->Subsystem == IMAGE_SUBSYSTEM_EFI_APPLICATION + || i->Subsystem == IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER + || i->Subsystem == IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER; enum arch_type arch; const bfd_target * const *target_ptr; /* Get the machine. */ - if (bfd_target_efi_p (abfd->xvec)) - arch = pe_arch (bfd_target_efi_arch (abfd->xvec)); + if (bfd_target_efi_app_p (abfd->xvec)) + arch = pe_arch (bfd_target_efi_app_arch (abfd->xvec)); + else if (bfd_target_efi_bsdrv_p (abfd->xvec)) + arch = pe_arch (bfd_target_efi_bsdrv_arch (abfd->xvec)); + else if (bfd_target_efi_rtdrv_p (abfd->xvec)) + arch = pe_arch (bfd_target_efi_rtdrv_arch (abfd->xvec)); else arch = pe_arch (bfd_target_pei_arch (abfd->xvec)); @@ -1361,10 +1367,38 @@ pe_bfd_object_p (bfd * abfd) || (*target_ptr)->flavour != bfd_target_coff_flavour) continue; - if (bfd_target_efi_p (*target_ptr)) + if (bfd_target_efi_app_p (*target_ptr)) { /* Skip incompatible arch. */ - if (pe_arch (bfd_target_efi_arch (*target_ptr)) != arch) + if (pe_arch (bfd_target_efi_app_arch (*target_ptr)) != arch) + continue; + + if (efi) + { + /* TARGET_PTR is an EFI backend. Don't match + TARGET with a EFI file. */ + bfd_set_error (bfd_error_wrong_format); + return NULL; + } + } + else if (bfd_target_efi_bsdrv_p (*target_ptr)) + { + /* Skip incompatible arch. */ + if (pe_arch (bfd_target_efi_bsdrv_arch (*target_ptr)) != arch) + continue; + + if (efi) + { + /* TARGET_PTR is an EFI backend. Don't match + TARGET with a EFI file. */ + bfd_set_error (bfd_error_wrong_format); + return NULL; + } + } + else if (bfd_target_efi_rtdrv_p (*target_ptr)) + { + /* Skip incompatible arch. */ + if (pe_arch (bfd_target_efi_rtdrv_arch (*target_ptr)) != arch) continue; if (efi) |