This is the mail archive of the binutils@sourceware.cygnus.com mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

bfd/ patch for IA-64 EFI support


I have checked in this patch.  This was reviewed by Richard Henderson.

This adds enough EFI support so that objcopy can be used to create working
EFI binaries from ELF binaries.  This isn't very useful without the generic
IA-64 ELF support.  That will come next, probably Wednesday.

Mon Apr 17 19:14:36 2000  David Mosberger  <davidm@hpl.hp.com>

	* Makefile.am (BFD64_BACKENDS): Mention coff-ia64.lo.
	(BFD64_BACKENDS_CFILES): Mention coff-ia64.c
	(coff-ia64.lo): Add dependency.
	* Makefile.in: Regenerate.
	* coff-ia64.c: New file.
	* efi-app-ia32.c: Ditto.
	* efi-app-ia64.c: Ditto.
	* coffcode.h (coff_set_arch_mach_hook): Handle IA64MAGIC.
	(coff_set_flags): Ditto.
	(coff_write_object_contents) [IA64]: Set magic number to ZMAGIC.
	* config.bfd (i[3456]86-*-linux-gnu*): Mention bfd_efi_app_ia32_vec.
	* configure.in (elf): Handle bfd_efi_app_ia32 and bfd_efi_app_ia64_vec.
	* configure: Regenerate.
	* libpei.h (GET_OPTHDR_IMAGE_BASE): New macro.
	(PUT_OPTHDR_IMAGE_BASE): Ditto.
	(GET_OPTHDR_SIZE_OF_STACK_RESERVE): Ditto.
	(PUT_OPTHDR_SIZE_OF_STACK_RESERVE): Ditto.
	(GET_OPTHDR_SIZE_OF_STACK_COMMIT): Ditto.
	(PUT_OPTHDR_SIZE_OF_STACK_COMMIT): Ditto.
	(GET_OPTHDR_SIZE_OF_HEAP_RESERVE): Ditto.
	(PUT_OPTHDR_SIZE_OF_HEAP_RESERVE): Ditto.
	(GET_OPTHDR_SIZE_OF_HEAP_COMMIT): Ditto.
	(PUT_OPTHDR_SIZE_OF_HEAP_COMMIT): Ditto.
	(GET_PDATA_ENTRY): Ditto.
	* peigen.c (_bfd_pei_swap_aouthdr_in) [COFF_WITH_PEP64]: Don't read
	data_start.  Use above macros to read fields that are 64 bit wide for
	COFF_WITH_PEP64.  Don't truncate entry and text_start to 32 bits.
	(_bfd_pei_swap_aouthdr_out) [PEI_FORCE_MINIMUM_ALIGNMENT]: Force
	FileAlignment and SectionAlignment to minimum alignment if they
	are zero.
	(_bfd_pei_swap_aouthdr_out) [PEI_DEFAULT_TARGET_SUBSYSTEM]: Set
	Subsystem to default PEI_DEFAULT_TARGET_SUBSYSTEM.
	(_bfd_pei_swap_aouthdr_out) [COFF_WITH_PEP64]: Don't set data_start.
	Use above macros to write fields that are 64 bit wide for
	COFF_WITH_PEP64.
	(pe_print_pdata): Set PDATA_ROW_SIZE to 3*8 for COFF_WITH_PEP64,
	5*4 otherwise.  This should be right for IA-32 and IA-64, but may
	be wrong for platforms.  Use PDATA_ROW_SIZE instead of hardcoded
	value of 20 bytes.  Modify printing for COFF_WITH_PEP64 to print
	begin address, end address, and unwind info address only.  Use
	GET_PDATA_ENTRY() to read .pdata entries.  Use fprintf_vma() to
	print addresses.
	(tbl): Add SECTION, REL32, RESERVED1, MIPS_JMPADDR16, DIR64, and
	HIGH3ADJ relocation names.
	(_bfd_pe_print_private_bfd_data): Print Subsystem name in legible form.
	* targets.c: Declare bfd_efi_app_ia32_vec and
	bfd_efi_app_ia64_vec.
	(bfd_target_vector): Mention bfd_efi_app_ia32_vec and
	bfd_efi_app_ia64_vec.
	
Index: Makefile.am
===================================================================
RCS file: /cvs/src/src/bfd/Makefile.am,v
retrieving revision 1.21
diff -p -r1.21 Makefile.am
*** Makefile.am	2000/04/11 23:57:13	1.21
--- Makefile.am	2000/04/18 03:26:38
*************** BFD32_BACKENDS_CFILES = \
*** 385,390 ****
--- 385,391 ----
  BFD64_BACKENDS = \
  	aout64.lo \
  	coff-alpha.lo \
+ 	coff-ia64.lo \
  	demo64.lo \
  	elf64-alpha.lo \
  	elf64-gen.lo \
*************** BFD64_BACKENDS = \
*** 397,402 ****
--- 398,404 ----
  BFD64_BACKENDS_CFILES = \
  	aout64.c \
  	coff-alpha.c \
+ 	coff-ia64.c \
  	demo64.c \
  	elf64-alpha.c \
  	elf64-gen.c \
*************** coff-alpha.lo: coff-alpha.c $(INCDIR)/bf
*** 1093,1098 ****
--- 1095,1102 ----
    $(INCDIR)/coff/sym.h $(INCDIR)/coff/symconst.h $(INCDIR)/coff/ecoff.h \
    $(INCDIR)/coff/alpha.h $(INCDIR)/aout/ar.h libcoff.h \
    libecoff.h coffswap.h ecoffswap.h
+ coff-ia64.lo: coff-ia64.c $(INCDIR)/coff/ia64.h $(INCDIR)/coff/internal.h \
+   $(INCDIR)/coff/pe.h libcoff.h $(INCDIR)/bfdlink.h coffcode.h coffswap.h
  demo64.lo: demo64.c aoutf1.h $(INCDIR)/aout/sun4.h \
    libaout.h $(INCDIR)/bfdlink.h $(INCDIR)/aout/aout64.h \
    $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h \
Index: Makefile.in
===================================================================
RCS file: /cvs/src/src/bfd/Makefile.in,v
retrieving revision 1.23
diff -p -r1.23 Makefile.in
*** Makefile.in	2000/04/11 23:57:13	1.23
--- Makefile.in	2000/04/18 03:26:38
*************** BFD32_BACKENDS_CFILES = \
*** 504,509 ****
--- 504,510 ----
  BFD64_BACKENDS = \
  	aout64.lo \
  	coff-alpha.lo \
+ 	coff-ia64.lo \
  	demo64.lo \
  	elf64-alpha.lo \
  	elf64-gen.lo \
*************** BFD64_BACKENDS = \
*** 517,522 ****
--- 518,524 ----
  BFD64_BACKENDS_CFILES = \
  	aout64.c \
  	coff-alpha.c \
+ 	coff-ia64.c \
  	demo64.c \
  	elf64-alpha.c \
  	elf64-gen.c \
*************** coff-alpha.lo: coff-alpha.c $(INCDIR)/bf
*** 1621,1626 ****
--- 1623,1630 ----
    $(INCDIR)/coff/sym.h $(INCDIR)/coff/symconst.h $(INCDIR)/coff/ecoff.h \
    $(INCDIR)/coff/alpha.h $(INCDIR)/aout/ar.h libcoff.h \
    libecoff.h coffswap.h ecoffswap.h
+ coff-ia64.lo: coff-ia64.c $(INCDIR)/coff/ia64.h $(INCDIR)/coff/internal.h \
+   $(INCDIR)/coff/pe.h libcoff.h $(INCDIR)/bfdlink.h coffcode.h coffswap.h
  demo64.lo: demo64.c aoutf1.h $(INCDIR)/aout/sun4.h \
    libaout.h $(INCDIR)/bfdlink.h $(INCDIR)/aout/aout64.h \
    $(INCDIR)/aout/stab_gnu.h $(INCDIR)/aout/stab.def $(INCDIR)/aout/ar.h \
Index: coff-ia64.c
===================================================================
RCS file: coff-ia64.c
diff -N coff-ia64.c
*** /dev/null	Tue May  5 13:32:27 1998
--- coff-ia64.c	Mon Apr 17 20:26:38 2000
***************
*** 0 ****
--- 1,198 ----
+ /* BFD back-end for HP/Intel IA-64 COFF files.
+    Copyright 1999 Free Software Foundation, Inc.
+    Contributed by David Mosberger <davidm@hpl.hp.com>
+ 
+ This file is part of BFD, the Binary File Descriptor library.
+ 
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ 
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ 
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+ 
+ #include "bfd.h"
+ #include "sysdep.h"
+ #include "libbfd.h"
+ 
+ #include "coff/ia64.h"
+ 
+ #include "coff/internal.h"
+ 
+ #include "coff/pe.h"
+ 
+ #include "libcoff.h"
+ 
+ #define COFF_DEFAULT_SECTION_ALIGNMENT_POWER (2)
+ /* The page size is a guess based on ELF.  */
+ 
+ #define COFF_PAGE_SIZE 0x1000
+ 
+ static reloc_howto_type howto_table[] = 
+ {
+   {0},
+ };
+ 
+ #define BADMAG(x) IA64BADMAG(x)
+ #define IA64 1			/* Customize coffcode.h */
+ 
+ #ifdef COFF_WITH_PEP64
+ # undef AOUTSZ
+ # define AOUTSZ		PEP64AOUTSZ
+ # define PEAOUTHDR	PEP64AOUTHDR
+ #endif
+ 
+ #define RTYPE2HOWTO(cache_ptr, dst) \
+ 	    (cache_ptr)->howto = howto_table + (dst)->r_type;
+ 
+ #ifdef COFF_WITH_PE
+ /* Return true if this relocation should
+    appear in the output .reloc section. */
+ 
+ static boolean
+ in_reloc_p(abfd, howto)
+      bfd * abfd;
+      reloc_howto_type *howto;
+ {
+   return 0;			/* We don't do relocs for now... */
+ }     
+ #endif
+ 
+ #include "coffcode.h"
+ 
+ static const bfd_target *
+ ia64coff_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 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 =
+ #else
+   ia64coff_vec =
+ #endif
+ {
+ #ifdef TARGET_NAME
+   TARGET_NAME,
+ #else
+   "coff-ia64",			/* name */
+ #endif
+   bfd_target_coff_flavour,
+   BFD_ENDIAN_LITTLE,		/* data byte order is little */
+   BFD_ENDIAN_LITTLE,		/* header byte order is little */
+ 
+   (HAS_RELOC | EXEC_P |		/* object flags */
+    HAS_LINENO | HAS_DEBUG |
+    HAS_SYMS | HAS_LOCALS | WP_TEXT | D_PAGED),
+ 
+ #ifndef COFF_WITH_PE
+   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* section flags */
+    | SEC_CODE | SEC_DATA),
+ #else
+   (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_LOAD | SEC_RELOC /* section flags */
+    | SEC_CODE | SEC_DATA
+    | SEC_LINK_ONCE | SEC_LINK_DUPLICATES),
+ #endif
+ 
+ #ifdef TARGET_UNDERSCORE
+   TARGET_UNDERSCORE,		/* leading underscore */
+ #else
+   0,				/* leading underscore */
+ #endif
+   '/',				/* ar_pad_char */
+   15,				/* ar_max_namelen */
+ 
+   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
+      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
+      bfd_getl16, bfd_getl_signed_16, bfd_putl16, /* data */
+   bfd_getl64, bfd_getl_signed_64, bfd_putl64,
+      bfd_getl32, bfd_getl_signed_32, bfd_putl32,
+      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, ia64coff_object_p, /* bfd_check_format */
+        bfd_generic_archive_p, ia64coff_object_p},
+     {bfd_false, coff_mkobject, _bfd_generic_mkarchive, /* bfd_set_format */
+        bfd_false},
+     {bfd_false, coff_write_object_contents, /* bfd_write_contents */
+        _bfd_write_archive_contents, bfd_false},
+ 
+      BFD_JUMP_TABLE_GENERIC (coff),
+      BFD_JUMP_TABLE_COPY (coff),
+      BFD_JUMP_TABLE_CORE (_bfd_nocore),
+      BFD_JUMP_TABLE_ARCHIVE (_bfd_archive_coff),
+      BFD_JUMP_TABLE_SYMBOLS (coff),
+      BFD_JUMP_TABLE_RELOCS (coff),
+      BFD_JUMP_TABLE_WRITE (coff),
+      BFD_JUMP_TABLE_LINK (coff),
+      BFD_JUMP_TABLE_DYNAMIC (_bfd_nodynamic),
+ 
+   NULL,
+ 
+   COFF_SWAP_TABLE
+ };
Index: coffcode.h
===================================================================
RCS file: /cvs/src/src/bfd/coffcode.h,v
retrieving revision 1.36
diff -p -r1.36 coffcode.h
*** coffcode.h	2000/04/11 04:11:02	1.36
--- coffcode.h	2000/04/18 03:26:38
*************** coff_set_arch_mach_hook (abfd, filehdr)
*** 1783,1788 ****
--- 1783,1794 ----
        machine = 0;
        break;
  #endif
+ #ifdef IA64MAGIC
+     case IA64MAGIC:
+       arch = bfd_arch_ia64;
+       machine = 0;
+       break;
+ #endif
  #ifdef A29K_MAGIC_BIG
      case A29K_MAGIC_BIG:
      case A29K_MAGIC_LITTLE:
*************** coff_set_flags (abfd, magicp, flagsp)
*** 2553,2558 ****
--- 2559,2570 ----
        return true;
        break;
  #endif
+ #ifdef IA64MAGIC
+     case bfd_arch_ia64:
+       *magicp = IA64MAGIC;
+       return true;
+       break;
+ #endif
  #ifdef MC68MAGIC
      case bfd_arch_m68k:
  #ifdef APOLLOM68KMAGIC
*************** coff_write_object_contents (abfd)
*** 3627,3632 ****
--- 3639,3649 ----
      internal_a.magic = ZMAGIC;
  #endif /* LYNXOS */
  #endif /* I386 */
+ 
+ #if defined(IA64)
+ #define __A_MAGIC_SET__
+     internal_a.magic = ZMAGIC;
+ #endif /* IA64 */
  
  #if defined(SPARC)
  #define __A_MAGIC_SET__
Index: config.bfd
===================================================================
RCS file: /cvs/src/src/bfd/config.bfd,v
retrieving revision 1.23
diff -p -r1.23 config.bfd
*** config.bfd	2000/04/07 17:06:58	1.23
--- config.bfd	2000/04/18 03:26:38
*************** case "${targ}" in
*** 303,309 ****
      ;;
    i[3456]86-*-linux-gnu*)
      targ_defvec=bfd_elf32_i386_vec
!     targ_selvecs=i386linux_vec
      ;;
    i[3456]86-*-lynxos*)
      targ_defvec=i386lynx_coff_vec
--- 303,309 ----
      ;;
    i[3456]86-*-linux-gnu*)
      targ_defvec=bfd_elf32_i386_vec
!     targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec"
      ;;
    i[3456]86-*-lynxos*)
      targ_defvec=i386lynx_coff_vec
Index: configure
===================================================================
RCS file: /cvs/src/src/bfd/configure,v
retrieving revision 1.23
diff -p -r1.23 configure
*** configure	2000/04/09 12:17:37	1.23
--- configure	2000/04/18 03:26:38
*************** do
*** 5107,5112 ****
--- 5107,5115 ----
      apollocoff_vec)		tb="$tb coff-apollo.lo" ;;
      b_out_vec_big_host)		tb="$tb bout.lo aout32.lo" ;;
      b_out_vec_little_host)	tb="$tb bout.lo aout32.lo" ;;
+     bfd_efi_app_ia32_vec)	tb="$tb efi-app-ia32.lo peigen.lo cofflink.lo" ;;
+     bfd_efi_app_ia64_vec)	tb="$tb efi-app-ia64.lo peigen.lo cofflink.lo"
+   				target64=true ;;
      bfd_elf64_alpha_vec)	tb="$tb elf64-alpha.lo elf64.lo $elf"
  				target64=true ;;
      bfd_elf32_avr_vec)		tb="$tb elf32-avr.lo elf32.lo $elf" ;;
*************** for ac_hdr in unistd.h
*** 5333,5349 ****
  do
  ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:5337: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <<EOF
! #line 5342 "configure"
  #include "confdefs.h"
  #include <$ac_hdr>
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:5347: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
--- 5336,5352 ----
  do
  ac_safe=`echo "$ac_hdr" | sed 'y%./+-%__p_%'`
  echo $ac_n "checking for $ac_hdr""... $ac_c" 1>&6
! echo "configure:5340: checking for $ac_hdr" >&5
  if eval "test \"`echo '$''{'ac_cv_header_$ac_safe'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <<EOF
! #line 5345 "configure"
  #include "confdefs.h"
  #include <$ac_hdr>
  EOF
  ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out"
! { (eval echo configure:5350: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
  ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"`
  if test -z "$ac_err"; then
    rm -rf conftest*
*************** done
*** 5372,5383 ****
  for ac_func in getpagesize
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:5376: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <<EOF
! #line 5381 "configure"
  #include "confdefs.h"
  /* System header to define __stub macros and hopefully few prototypes,
      which can conflict with char $ac_func(); below.  */
--- 5375,5386 ----
  for ac_func in getpagesize
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:5379: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <<EOF
! #line 5384 "configure"
  #include "confdefs.h"
  /* System header to define __stub macros and hopefully few prototypes,
      which can conflict with char $ac_func(); below.  */
*************** $ac_func();
*** 5400,5406 ****
  
  ; return 0; }
  EOF
! if { (eval echo configure:5404: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 5403,5409 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:5407: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
*************** fi
*** 5425,5431 ****
  done
  
  echo $ac_n "checking for working mmap""... $ac_c" 1>&6
! echo "configure:5429: checking for working mmap" >&5
  if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
--- 5428,5434 ----
  done
  
  echo $ac_n "checking for working mmap""... $ac_c" 1>&6
! echo "configure:5432: checking for working mmap" >&5
  if eval "test \"`echo '$''{'ac_cv_func_mmap_fixed_mapped'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
*************** else
*** 5433,5439 ****
    ac_cv_func_mmap_fixed_mapped=no
  else
    cat > conftest.$ac_ext <<EOF
! #line 5437 "configure"
  #include "confdefs.h"
  
  /* Thanks to Mike Haertel and Jim Avera for this test.
--- 5436,5442 ----
    ac_cv_func_mmap_fixed_mapped=no
  else
    cat > conftest.$ac_ext <<EOF
! #line 5440 "configure"
  #include "confdefs.h"
  
  /* Thanks to Mike Haertel and Jim Avera for this test.
*************** main()
*** 5573,5579 ****
  }
  
  EOF
! if { (eval echo configure:5577: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
  then
    ac_cv_func_mmap_fixed_mapped=yes
  else
--- 5576,5582 ----
  }
  
  EOF
! if { (eval echo configure:5580: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext} && (./conftest; exit) 2>/dev/null
  then
    ac_cv_func_mmap_fixed_mapped=yes
  else
*************** fi
*** 5598,5609 ****
  for ac_func in madvise mprotect
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:5602: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <<EOF
! #line 5607 "configure"
  #include "confdefs.h"
  /* System header to define __stub macros and hopefully few prototypes,
      which can conflict with char $ac_func(); below.  */
--- 5601,5612 ----
  for ac_func in madvise mprotect
  do
  echo $ac_n "checking for $ac_func""... $ac_c" 1>&6
! echo "configure:5605: checking for $ac_func" >&5
  if eval "test \"`echo '$''{'ac_cv_func_$ac_func'+set}'`\" = set"; then
    echo $ac_n "(cached) $ac_c" 1>&6
  else
    cat > conftest.$ac_ext <<EOF
! #line 5610 "configure"
  #include "confdefs.h"
  /* System header to define __stub macros and hopefully few prototypes,
      which can conflict with char $ac_func(); below.  */
*************** $ac_func();
*** 5626,5632 ****
  
  ; return 0; }
  EOF
! if { (eval echo configure:5630: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
--- 5629,5635 ----
  
  ; return 0; }
  EOF
! if { (eval echo configure:5633: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
    rm -rf conftest*
    eval "ac_cv_func_$ac_func=yes"
  else
Index: configure.in
===================================================================
RCS file: /cvs/src/src/bfd/configure.in,v
retrieving revision 1.18
diff -p -r1.18 configure.in
*** configure.in	2000/04/09 12:17:38	1.18
--- configure.in	2000/04/18 03:26:38
*************** do
*** 464,469 ****
--- 464,472 ----
      apollocoff_vec)		tb="$tb coff-apollo.lo" ;;
      b_out_vec_big_host)		tb="$tb bout.lo aout32.lo" ;;
      b_out_vec_little_host)	tb="$tb bout.lo aout32.lo" ;;
+     bfd_efi_app_ia32_vec)	tb="$tb efi-app-ia32.lo peigen.lo cofflink.lo" ;;
+     bfd_efi_app_ia64_vec)	tb="$tb efi-app-ia64.lo peigen.lo cofflink.lo"
+   				target64=true ;;
      bfd_elf64_alpha_vec)	tb="$tb elf64-alpha.lo elf64.lo $elf"
  				target64=true ;;
      bfd_elf32_avr_vec)		tb="$tb elf32-avr.lo elf32.lo $elf" ;;
Index: efi-app-ia32.c
===================================================================
RCS file: efi-app-ia32.c
diff -N efi-app-ia32.c
*** /dev/null	Tue May  5 13:32:27 1998
--- efi-app-ia32.c	Mon Apr 17 20:26:38 2000
***************
*** 0 ****
--- 1,35 ----
+ /* BFD back-end for Intel IA-32 EFI application files.
+    Copyright 1999 Free Software Foundation, Inc.
+    Contributed by David Mosberger <davidm@hpl.hp.com>
+ 
+ This file is part of BFD, the Binary File Descriptor library.
+ 
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ 
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ 
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+ 
+ #include "bfd.h"
+ #include "sysdep.h"
+ 
+ #define TARGET_SYM bfd_efi_app_ia32_vec
+ #define TARGET_NAME "efi-app-ia32"
+ #define COFF_IMAGE_WITH_PE
+ #define COFF_WITH_PE
+ #define PCRELOFFSET true
+ #define TARGET_UNDERSCORE '_'
+ #define COFF_LONG_SECTION_NAMES
+ #define ALIGN_SECTIONS_IN_FILE
+ #define PEI_DEFAULT_TARGET_SUBSYSTEM	IMAGE_SUBSYSTEM_EFI_APPLICATION
+ #define PEI_FORCE_MINIMUM_ALIGNMENT
+ 
+ #include "coff-i386.c"
Index: efi-app-ia64.c
===================================================================
RCS file: efi-app-ia64.c
diff -N efi-app-ia64.c
*** /dev/null	Tue May  5 13:32:27 1998
--- efi-app-ia64.c	Mon Apr 17 20:26:38 2000
***************
*** 0 ****
--- 1,35 ----
+ /* BFD back-end for HP/Intel IA-64 EFI application files.
+    Copyright 1999 Free Software Foundation, Inc.
+    Contributed by David Mosberger <davidm@hpl.hp.com>
+ 
+ This file is part of BFD, the Binary File Descriptor library.
+ 
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ 
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ GNU General Public License for more details.
+ 
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
+ 
+ #include "bfd.h"
+ #include "sysdep.h"
+ 
+ #define TARGET_SYM bfd_efi_app_ia64_vec
+ #define TARGET_NAME "efi-app-ia64"
+ #define COFF_IMAGE_WITH_PE
+ #define COFF_WITH_PE
+ #define COFF_WITH_PEP64
+ #define PCRELOFFSET true
+ #define TARGET_UNDERSCORE '_'
+ #define COFF_LONG_SECTION_NAMES
+ #define PEI_DEFAULT_TARGET_SUBSYSTEM	IMAGE_SUBSYSTEM_EFI_APPLICATION
+ #define PEI_FORCE_MINIMUM_ALIGNMENT
+ 
+ #include "coff-ia64.c"
Index: libpei.h
===================================================================
RCS file: /cvs/src/src/bfd/libpei.h,v
retrieving revision 1.4
diff -p -r1.4 libpei.h
*** libpei.h	2000/02/28 18:56:11	1.4
--- libpei.h	2000/04/18 03:26:38
*************** PE/PEI rearrangement (and code added): D
*** 192,197 ****
--- 192,227 ----
  #define PUT_SCNHDR_LNNOPTR bfd_h_put_32
  #endif
  
+ #ifdef COFF_WITH_PEP64
+ 
+ #define GET_OPTHDR_IMAGE_BASE bfd_h_get_64
+ #define PUT_OPTHDR_IMAGE_BASE bfd_h_put_64
+ #define GET_OPTHDR_SIZE_OF_STACK_RESERVE bfd_h_get_64
+ #define PUT_OPTHDR_SIZE_OF_STACK_RESERVE bfd_h_put_64
+ #define GET_OPTHDR_SIZE_OF_STACK_COMMIT bfd_h_get_64
+ #define PUT_OPTHDR_SIZE_OF_STACK_COMMIT bfd_h_put_64
+ #define GET_OPTHDR_SIZE_OF_HEAP_RESERVE bfd_h_get_64
+ #define PUT_OPTHDR_SIZE_OF_HEAP_RESERVE bfd_h_put_64
+ #define GET_OPTHDR_SIZE_OF_HEAP_COMMIT bfd_h_get_64
+ #define PUT_OPTHDR_SIZE_OF_HEAP_COMMIT bfd_h_put_64
+ #define GET_PDATA_ENTRY bfd_get_64
+ 
+ #else /* !COFF_WITH_PEP64 */
+ 
+ #define GET_OPTHDR_IMAGE_BASE bfd_h_get_32
+ #define PUT_OPTHDR_IMAGE_BASE bfd_h_put_32
+ #define GET_OPTHDR_SIZE_OF_STACK_RESERVE bfd_h_get_32
+ #define PUT_OPTHDR_SIZE_OF_STACK_RESERVE bfd_h_put_32
+ #define GET_OPTHDR_SIZE_OF_STACK_COMMIT bfd_h_get_32
+ #define PUT_OPTHDR_SIZE_OF_STACK_COMMIT bfd_h_put_32
+ #define GET_OPTHDR_SIZE_OF_HEAP_RESERVE bfd_h_get_32
+ #define PUT_OPTHDR_SIZE_OF_HEAP_RESERVE bfd_h_put_32
+ #define GET_OPTHDR_SIZE_OF_HEAP_COMMIT bfd_h_get_32
+ #define PUT_OPTHDR_SIZE_OF_HEAP_COMMIT bfd_h_put_32
+ #define GET_PDATA_ENTRY bfd_get_32
+ 
+ #endif /* !COFF_WITH_PEP64 */
+ 
  /* These functions are architecture dependent, and are in peicode.h:
     coff_swap_reloc_in
     int coff_swap_reloc_out
Index: peigen.c
===================================================================
RCS file: /cvs/src/src/bfd/peigen.c,v
retrieving revision 1.7
diff -p -r1.7 peigen.c
*** peigen.c	2000/02/28 18:56:11	1.7
--- peigen.c	2000/04/18 03:26:38
*************** _bfd_pei_swap_aouthdr_in (abfd, aouthdr_
*** 434,444 ****
      GET_AOUTHDR_ENTRY (abfd, (bfd_byte *) aouthdr_ext->entry);
    aouthdr_int->text_start =
      GET_AOUTHDR_TEXT_START (abfd, (bfd_byte *) aouthdr_ext->text_start);
    aouthdr_int->data_start =
      GET_AOUTHDR_DATA_START (abfd, (bfd_byte *) aouthdr_ext->data_start);
  
    a = &aouthdr_int->pe;
!   a->ImageBase = bfd_h_get_32 (abfd, (bfd_byte *)src->ImageBase);
    a->SectionAlignment = bfd_h_get_32 (abfd, (bfd_byte *)src->SectionAlignment);
    a->FileAlignment = bfd_h_get_32 (abfd, (bfd_byte *)src->FileAlignment);
    a->MajorOperatingSystemVersion =
--- 434,447 ----
      GET_AOUTHDR_ENTRY (abfd, (bfd_byte *) aouthdr_ext->entry);
    aouthdr_int->text_start =
      GET_AOUTHDR_TEXT_START (abfd, (bfd_byte *) aouthdr_ext->text_start);
+ #ifndef COFF_WITH_PEP64
+   /* PE32+ does not have data_start member! */
    aouthdr_int->data_start =
      GET_AOUTHDR_DATA_START (abfd, (bfd_byte *) aouthdr_ext->data_start);
+ #endif
  
    a = &aouthdr_int->pe;
!   a->ImageBase = GET_OPTHDR_IMAGE_BASE (abfd, (bfd_byte *)src->ImageBase);
    a->SectionAlignment = bfd_h_get_32 (abfd, (bfd_byte *)src->SectionAlignment);
    a->FileAlignment = bfd_h_get_32 (abfd, (bfd_byte *)src->FileAlignment);
    a->MajorOperatingSystemVersion =
*************** _bfd_pei_swap_aouthdr_in (abfd, aouthdr_
*** 455,464 ****
    a->CheckSum = bfd_h_get_32 (abfd, (bfd_byte *)src->CheckSum);
    a->Subsystem = bfd_h_get_16 (abfd, (bfd_byte *)src->Subsystem);
    a->DllCharacteristics = bfd_h_get_16 (abfd, (bfd_byte *)src->DllCharacteristics);
!   a->SizeOfStackReserve = bfd_h_get_32 (abfd, (bfd_byte *)src->SizeOfStackReserve);
!   a->SizeOfStackCommit = bfd_h_get_32 (abfd, (bfd_byte *)src->SizeOfStackCommit);
!   a->SizeOfHeapReserve = bfd_h_get_32 (abfd, (bfd_byte *)src->SizeOfHeapReserve);
!   a->SizeOfHeapCommit = bfd_h_get_32 (abfd, (bfd_byte *)src->SizeOfHeapCommit);
    a->LoaderFlags = bfd_h_get_32 (abfd, (bfd_byte *)src->LoaderFlags);
    a->NumberOfRvaAndSizes = bfd_h_get_32 (abfd, (bfd_byte *)src->NumberOfRvaAndSizes);
  
--- 458,467 ----
    a->CheckSum = bfd_h_get_32 (abfd, (bfd_byte *)src->CheckSum);
    a->Subsystem = bfd_h_get_16 (abfd, (bfd_byte *)src->Subsystem);
    a->DllCharacteristics = bfd_h_get_16 (abfd, (bfd_byte *)src->DllCharacteristics);
!   a->SizeOfStackReserve = GET_OPTHDR_SIZE_OF_STACK_RESERVE (abfd, (bfd_byte *)src->SizeOfStackReserve);
!   a->SizeOfStackCommit = GET_OPTHDR_SIZE_OF_STACK_COMMIT (abfd, (bfd_byte *)src->SizeOfStackCommit);
!   a->SizeOfHeapReserve = GET_OPTHDR_SIZE_OF_HEAP_RESERVE (abfd, (bfd_byte *)src->SizeOfHeapReserve);
!   a->SizeOfHeapCommit = GET_OPTHDR_SIZE_OF_HEAP_COMMIT (abfd, (bfd_byte *)src->SizeOfHeapCommit);
    a->LoaderFlags = bfd_h_get_32 (abfd, (bfd_byte *)src->LoaderFlags);
    a->NumberOfRvaAndSizes = bfd_h_get_32 (abfd, (bfd_byte *)src->NumberOfRvaAndSizes);
  
*************** _bfd_pei_swap_aouthdr_in (abfd, aouthdr_
*** 476,493 ****
--- 479,503 ----
    if (aouthdr_int->entry)
      {
        aouthdr_int->entry += a->ImageBase;
+ #ifndef COFF_WITH_PEP64
        aouthdr_int->entry &= 0xffffffff;
+ #endif
      }
    if (aouthdr_int->tsize) 
      {
        aouthdr_int->text_start += a->ImageBase;
+ #ifndef COFF_WITH_PEP64
        aouthdr_int->text_start &= 0xffffffff;
+ #endif
      }
+ #ifndef COFF_WITH_PEP64
+   /* PE32+ does not have data_start member! */
    if (aouthdr_int->dsize) 
      {
        aouthdr_int->data_start += a->ImageBase;
        aouthdr_int->data_start &= 0xffffffff;
      }
+ #endif
  
  #ifdef POWERPC_LE_PE
    /* These three fields are normally set up by ppc_relocate_section.
*************** _bfd_pei_swap_aouthdr_out (abfd, in, out
*** 532,541 ****
    struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *)in;
    struct internal_extra_pe_aouthdr *extra = &pe_data (abfd)->pe_opthdr;
    PEAOUTHDR *aouthdr_out = (PEAOUTHDR *)out;
  
!   bfd_vma sa = extra->SectionAlignment;
!   bfd_vma fa = extra->FileAlignment;
!   bfd_vma ib = extra->ImageBase ;
  
    if (aouthdr_in->tsize) 
      {
--- 542,569 ----
    struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *)in;
    struct internal_extra_pe_aouthdr *extra = &pe_data (abfd)->pe_opthdr;
    PEAOUTHDR *aouthdr_out = (PEAOUTHDR *)out;
+   bfd_vma sa, fa, ib;
+ 
+   /* The following definitely is required for EFI applications.
+      Perhaps it's needed for other PEI targets as well, but I don't
+      know that for a fact, so we play it safe here and tweak the
+      alignments only if PEI_FORCE_MINIMUM_ALIGNMENT is
+      defined. --davidm */
+ #ifdef PEI_FORCE_MINIMUM_ALIGNMENT
+   if (!extra->FileAlignment)
+     extra->FileAlignment = PE_DEF_FILE_ALIGNMENT;
+   if (!extra->SectionAlignment)
+     extra->SectionAlignment = PE_DEF_SECTION_ALIGNMENT;
+ #endif
+ 
+ #ifdef PEI_DEFAULT_TARGET_SUBSYSTEM
+   if (extra->Subsystem == IMAGE_SUBSYSTEM_UNKNOWN)
+     extra->Subsystem = PEI_DEFAULT_TARGET_SUBSYSTEM;
+ #endif
  
!   sa = extra->SectionAlignment;
!   fa = extra->FileAlignment;
!   ib = extra->ImageBase;
  
    if (aouthdr_in->tsize) 
      {
*************** _bfd_pei_swap_aouthdr_out (abfd, in, out
*** 633,644 ****
    PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start,
  			  (bfd_byte *) aouthdr_out->standard.text_start);
  
    PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
  			  (bfd_byte *) aouthdr_out->standard.data_start);
! 
  
!   bfd_h_put_32 (abfd, extra->ImageBase,
! 		(bfd_byte *) aouthdr_out->ImageBase);
    bfd_h_put_32 (abfd, extra->SectionAlignment,
  		(bfd_byte *) aouthdr_out->SectionAlignment);
    bfd_h_put_32 (abfd, extra->FileAlignment,
--- 661,674 ----
    PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start,
  			  (bfd_byte *) aouthdr_out->standard.text_start);
  
+ #ifndef COFF_WITH_PEP64
+   /* PE32+ does not have data_start member! */
    PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
  			  (bfd_byte *) aouthdr_out->standard.data_start);
! #endif
  
!   PUT_OPTHDR_IMAGE_BASE (abfd, extra->ImageBase,
! 			 (bfd_byte *) aouthdr_out->ImageBase);
    bfd_h_put_32 (abfd, extra->SectionAlignment,
  		(bfd_byte *) aouthdr_out->SectionAlignment);
    bfd_h_put_32 (abfd, extra->FileAlignment,
*************** _bfd_pei_swap_aouthdr_out (abfd, in, out
*** 667,680 ****
  		(bfd_byte *) aouthdr_out->Subsystem);
    bfd_h_put_16 (abfd, extra->DllCharacteristics,
  		(bfd_byte *) aouthdr_out->DllCharacteristics);
!   bfd_h_put_32 (abfd, extra->SizeOfStackReserve,
! 		(bfd_byte *) aouthdr_out->SizeOfStackReserve);
!   bfd_h_put_32 (abfd, extra->SizeOfStackCommit,
! 		(bfd_byte *) aouthdr_out->SizeOfStackCommit);
!   bfd_h_put_32 (abfd, extra->SizeOfHeapReserve,
! 		(bfd_byte *) aouthdr_out->SizeOfHeapReserve);
!   bfd_h_put_32 (abfd, extra->SizeOfHeapCommit,
! 		(bfd_byte *) aouthdr_out->SizeOfHeapCommit);
    bfd_h_put_32 (abfd, extra->LoaderFlags,
  		(bfd_byte *) aouthdr_out->LoaderFlags);
    bfd_h_put_32 (abfd, extra->NumberOfRvaAndSizes,
--- 697,710 ----
  		(bfd_byte *) aouthdr_out->Subsystem);
    bfd_h_put_16 (abfd, extra->DllCharacteristics,
  		(bfd_byte *) aouthdr_out->DllCharacteristics);
!   PUT_OPTHDR_SIZE_OF_STACK_RESERVE (abfd, extra->SizeOfStackReserve,
! 				    (bfd_byte *) aouthdr_out->SizeOfStackReserve);
!   PUT_OPTHDR_SIZE_OF_STACK_COMMIT (abfd, extra->SizeOfStackCommit,
! 				   (bfd_byte *) aouthdr_out->SizeOfStackCommit);
!   PUT_OPTHDR_SIZE_OF_HEAP_RESERVE (abfd, extra->SizeOfHeapReserve,
! 				   (bfd_byte *) aouthdr_out->SizeOfHeapReserve);
!   PUT_OPTHDR_SIZE_OF_HEAP_COMMIT (abfd, extra->SizeOfHeapCommit,
! 				  (bfd_byte *) aouthdr_out->SizeOfHeapCommit);
    bfd_h_put_32 (abfd, extra->LoaderFlags,
  		(bfd_byte *) aouthdr_out->LoaderFlags);
    bfd_h_put_32 (abfd, extra->NumberOfRvaAndSizes,
*************** pe_print_edata (abfd, vfile)
*** 1473,1490 ****
    return true;
  }
  
  static boolean
  pe_print_pdata (abfd, vfile)
       bfd  *abfd;
       PTR vfile;
  {
    FILE *file = (FILE *) vfile;
    bfd_byte *data = 0;
    asection *section = bfd_get_section_by_name (abfd, ".pdata");
    bfd_size_type datasize = 0;
    bfd_size_type i;
    bfd_size_type start, stop;
!   int onaline = 20;
  
    if (section == NULL
        || coff_section_data (abfd, section) == NULL
--- 1503,1529 ----
    return true;
  }
  
+ /* This really is architecture dependent.  On IA-64, a .pdata entry
+    consists of three dwords containing relative virtual addresses that
+    specify the start and end address of the code range the entry
+    covers and the address of the corresponding unwind info data.  */
  static boolean
  pe_print_pdata (abfd, vfile)
       bfd  *abfd;
       PTR vfile;
  {
+ #ifdef COFF_WITH_PEP64
+ # define PDATA_ROW_SIZE	(3*8)
+ #else
+ # define PDATA_ROW_SIZE	(5*4)
+ #endif
    FILE *file = (FILE *) vfile;
    bfd_byte *data = 0;
    asection *section = bfd_get_section_by_name (abfd, ".pdata");
    bfd_size_type datasize = 0;
    bfd_size_type i;
    bfd_size_type start, stop;
!   int onaline = PDATA_ROW_SIZE;
  
    if (section == NULL
        || coff_section_data (abfd, section) == NULL
*************** pe_print_pdata (abfd, vfile)
*** 1498,1507 ****
--- 1537,1551 ----
  
    fprintf (file,
  	   _("\nThe Function Table (interpreted .pdata section contents)\n"));
+ #ifdef COFF_WITH_PEP64
+   fprintf(file,
+ 	  _(" vma:\t\t\tBegin Address    End Address      Unwind Info\n"));
+ #else
    fprintf (file,
  	   _(" vma:\t\tBegin    End      EH       EH       PrologEnd  Exception\n"));
    fprintf (file,
  	   _("     \t\tAddress  Address  Handler  Data     Address    Mask\n"));
+ #endif
  
    if (bfd_section_size (abfd, section) == 0)
      return true;
*************** pe_print_pdata (abfd, vfile)
*** 1527,1540 ****
        bfd_vma prolog_end_addr;
        int em_data;
  
!       if (i + 20 > stop)
  	break;
  
!       begin_addr = bfd_get_32(abfd, data+i);
!       end_addr = bfd_get_32(abfd, data+i+4);
!       eh_handler = bfd_get_32(abfd, data+i+8);
!       eh_data = bfd_get_32(abfd, data+i+12);
!       prolog_end_addr = bfd_get_32(abfd, data+i+16);
        
        if (begin_addr == 0 && end_addr == 0 && eh_handler == 0
  	  && eh_data == 0 && prolog_end_addr == 0)
--- 1571,1584 ----
        bfd_vma prolog_end_addr;
        int em_data;
  
!       if (i + PDATA_ROW_SIZE > stop)
  	break;
  
!       begin_addr = GET_PDATA_ENTRY(abfd, data+i);
!       end_addr = GET_PDATA_ENTRY(abfd, data+i+4);
!       eh_handler = GET_PDATA_ENTRY(abfd, data+i+8);
!       eh_data = GET_PDATA_ENTRY(abfd, data+i+12);
!       prolog_end_addr = GET_PDATA_ENTRY(abfd, data+i+16);
        
        if (begin_addr == 0 && end_addr == 0 && eh_handler == 0
  	  && eh_data == 0 && prolog_end_addr == 0)
*************** pe_print_pdata (abfd, vfile)
*** 1543,1563 ****
  	  break;
  	}
  
-       fprintf (file,
- 	       " %08lx\t",
- 	       (unsigned long int) (i + section->vma));
- 
        em_data = ((eh_handler & 0x1) << 2) | (prolog_end_addr & 0x3);
!       eh_handler &= 0xfffffffc;
!       prolog_end_addr &= 0xfffffffc;
  
!       fprintf (file, "%08lx %08lx %08lx %08lx %08lx   %x",
! 	       begin_addr,
! 	       end_addr,
! 	       eh_handler,
! 	       eh_data,
! 	       prolog_end_addr,
! 	       em_data);
  
  #ifdef POWERPC_LE_PE
        if (eh_handler == 0 && eh_data != 0)
--- 1587,1607 ----
  	  break;
  	}
  
        em_data = ((eh_handler & 0x1) << 2) | (prolog_end_addr & 0x3);
!       eh_handler &= ~ (bfd_vma) 0x3;
!       prolog_end_addr &= ~ (bfd_vma) 0x3;
  
!       fputc (' ', file);
!       fprintf_vma (file, i + section->vma); fputc ('\t', file);
!       fprintf_vma (file, begin_addr); fputc (' ', file);
!       fprintf_vma (file, end_addr); fputc (' ', file);
!       fprintf_vma (file, eh_handler);
! #ifndef COFF_WITH_PEP64
!       fputc (' ', file);
!       fprintf_vma (file, eh_data); fputc (' ', file);
!       fprintf_vma (file, prolog_end_addr);
!       fprintf (file, "   %x", em_data);
! #endif
  
  #ifdef POWERPC_LE_PE
        if (eh_handler == 0 && eh_data != 0)
*************** static const char * const tbl[] =
*** 1603,1608 ****
--- 1647,1658 ----
  "HIGHLOW",
  "HIGHADJ",
  "MIPS_JMPADDR",
+ "SECTION",
+ "REL32",
+ "RESERVED1",
+ "MIPS_JMPADDR16",
+ "DIR64",
+ "HIGH3ADJ"
  "UNKNOWN",   /* MUST be last */
  };
  
*************** _bfd_pe_print_private_bfd_data_common (a
*** 1707,1712 ****
--- 1757,1763 ----
    int j;
    pe_data_type *pe = pe_data (abfd);
    struct internal_extra_pe_aouthdr *i = &pe->pe_opthdr;
+   const char *subsystem_name = NULL;
  
    /* The MS dumpbin program reportedly ands with 0xff0f before
       printing the characteristics field.  Not sure why.  No reason to
*************** _bfd_pe_print_private_bfd_data_common (a
*** 1744,1751 ****
    fprintf (file,"SizeOfImage\t\t%08lx\n", i->SizeOfImage);
    fprintf (file,"SizeOfHeaders\t\t%08lx\n", i->SizeOfHeaders);
    fprintf (file,"CheckSum\t\t%08lx\n", i->CheckSum);
!   fprintf (file,"Subsystem\t\t%08x\n", i->Subsystem);
!   fprintf (file,"DllCharacteristics\t%08x\n", i->DllCharacteristics);
    fprintf (file,"SizeOfStackReserve\t");
    fprintf_vma (file, i->SizeOfStackReserve);
    fprintf (file,"\nSizeOfStackCommit\t");
--- 1795,1834 ----
    fprintf (file,"SizeOfImage\t\t%08lx\n", i->SizeOfImage);
    fprintf (file,"SizeOfHeaders\t\t%08lx\n", i->SizeOfHeaders);
    fprintf (file,"CheckSum\t\t%08lx\n", i->CheckSum);
!   switch (i->Subsystem)
!     {
!     case IMAGE_SUBSYSTEM_UNKNOWN:
!       subsystem_name = "unspecified";
!       break;
!     case IMAGE_SUBSYSTEM_NATIVE:
!       subsystem_name = "NT native";
!       break;
!     case IMAGE_SUBSYSTEM_WINDOWS_GUI:
!       subsystem_name = "Windows GUI";
!       break;
!     case IMAGE_SUBSYSTEM_WINDOWS_CUI:
!       subsystem_name = "Windows CUI";
!       break;
!     case IMAGE_SUBSYSTEM_POSIX_CUI:
!       subsystem_name = "POSIX CUI";
!       break;
!     case IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:
!       subsystem_name = "Wince CUI";
!       break;
!     case IMAGE_SUBSYSTEM_EFI_APPLICATION:
!       subsystem_name = "EFI application";
!       break;
!     case IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:
!       subsystem_name = "EFI boot service driver";
!       break;
!     case IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
!       subsystem_name = "EFI runtime driver"; 
!       break;
!     }
!   fprintf (file,"Subsystem\t\t%08x", i->Subsystem);
!   if (subsystem_name)
!     fprintf (file, "\t(%s)", subsystem_name);
!   fprintf (file,"\nDllCharacteristics\t%08x\n", i->DllCharacteristics);
    fprintf (file,"SizeOfStackReserve\t");
    fprintf_vma (file, i->SizeOfStackReserve);
    fprintf (file,"\nSizeOfStackCommit\t");
Index: targets.c
===================================================================
RCS file: /cvs/src/src/bfd/targets.c,v
retrieving revision 1.15
diff -p -r1.15 targets.c
*** targets.c	2000/04/07 17:06:58	1.15
--- targets.c	2000/04/18 03:26:39
*************** extern const bfd_target arm_epoc_pei_lit
*** 505,510 ****
--- 505,512 ----
  extern const bfd_target arm_epoc_pei_big_vec;
  extern const bfd_target b_out_vec_big_host;
  extern const bfd_target b_out_vec_little_host;
+ extern const bfd_target bfd_efi_app_ia32_vec;
+ extern const bfd_target bfd_efi_app_ia64_vec;
  extern const bfd_target bfd_elf64_alpha_vec;
  extern const bfd_target bfd_elf32_avr_vec;
  extern const bfd_target bfd_elf32_bigarc_vec;
*************** const bfd_target * const bfd_target_vect
*** 688,693 ****
--- 690,700 ----
  	&aout_mips_little_vec,
  	&b_out_vec_big_host,
  	&b_out_vec_little_host,
+ 
+ 	&bfd_efi_app_ia32_vec,
+ #ifdef BFD64
+ 	&bfd_efi_app_ia64_vec,
+ #endif
  
  	/* This, and other vectors, may not be used in any *.mt configuration.
  	   But that does not mean they are unnecessary.  If configured with

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]