Bfd support for generating IA-64 EFI binaries.
authorJim Wilson <wilson@tuliptree.org>
Tue, 18 Apr 2000 04:03:16 +0000 (04:03 +0000)
committerJim Wilson <wilson@tuliptree.org>
Tue, 18 Apr 2000 04:03:16 +0000 (04:03 +0000)
* 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.
...

13 files changed:
bfd/ChangeLog
bfd/Makefile.am
bfd/Makefile.in
bfd/coff-ia64.c [new file with mode: 0644]
bfd/coffcode.h
bfd/config.bfd
bfd/configure
bfd/configure.in
bfd/efi-app-ia32.c [new file with mode: 0644]
bfd/efi-app-ia64.c [new file with mode: 0644]
bfd/libpei.h
bfd/peigen.c
bfd/targets.c

index a58eefbfcf18d9a02b95473da32c5d06b0c58cf5..cdc1b9492fa28f4a724f4191dac3b4d66a87e671 100644 (file)
@@ -1,3 +1,55 @@
+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.
+       
 2000-04-17  Timothy Wall  <twall@cygnus.com>
 
        * bfd-in2.h: Add prototypes for tic54x load page access.
index f5dd526f97db522d5768a2c58d123077908b2f2e..142fa6d1efc916042d1c386a60031aaaf0b91ad5 100644 (file)
@@ -385,6 +385,7 @@ BFD32_BACKENDS_CFILES = \
 BFD64_BACKENDS = \
        aout64.lo \
        coff-alpha.lo \
+       coff-ia64.lo \
        demo64.lo \
        elf64-alpha.lo \
        elf64-gen.lo \
@@ -397,6 +398,7 @@ BFD64_BACKENDS = \
 BFD64_BACKENDS_CFILES = \
        aout64.c \
        coff-alpha.c \
+       coff-ia64.c \
        demo64.c \
        elf64-alpha.c \
        elf64-gen.c \
@@ -1093,6 +1095,8 @@ coff-alpha.lo: coff-alpha.c $(INCDIR)/bfdlink.h $(INCDIR)/coff/internal.h \
   $(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 5e0e973fdd072150a632434ee5d26f9cae60acf7..1421bb23b92b84b65309cd95499ef521dbfbd52b 100644 (file)
@@ -504,6 +504,7 @@ BFD32_BACKENDS_CFILES = \
 BFD64_BACKENDS = \
        aout64.lo \
        coff-alpha.lo \
+       coff-ia64.lo \
        demo64.lo \
        elf64-alpha.lo \
        elf64-gen.lo \
@@ -517,6 +518,7 @@ BFD64_BACKENDS = \
 BFD64_BACKENDS_CFILES = \
        aout64.c \
        coff-alpha.c \
+       coff-ia64.c \
        demo64.c \
        elf64-alpha.c \
        elf64-gen.c \
@@ -1621,6 +1623,8 @@ coff-alpha.lo: coff-alpha.c $(INCDIR)/bfdlink.h $(INCDIR)/coff/internal.h \
   $(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 \
diff --git a/bfd/coff-ia64.c b/bfd/coff-ia64.c
new file mode 100644 (file)
index 0000000..df867e7
--- /dev/null
@@ -0,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 a6e8b088a10260afc0d64303ab04f77b05cc06c9..9474e9345f47850d6306b32ac77fc05b3ab5ed20 100644 (file)
@@ -1787,6 +1787,12 @@ coff_set_arch_mach_hook (abfd, filehdr)
       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:
@@ -2557,6 +2563,12 @@ coff_set_flags (abfd, magicp, flagsp)
       return true;
       break;
 #endif
+#ifdef IA64MAGIC
+    case bfd_arch_ia64:
+      *magicp = IA64MAGIC;
+      return true;
+      break;
+#endif
 #ifdef MC68MAGIC
     case bfd_arch_m68k:
 #ifdef APOLLOM68KMAGIC
@@ -3635,6 +3647,11 @@ coff_write_object_contents (abfd)
 #endif /* LYNXOS */
 #endif /* I386 */
 
+#if defined(IA64)
+#define __A_MAGIC_SET__
+    internal_a.magic = ZMAGIC;
+#endif /* IA64 */
+
 #if defined(SPARC)
 #define __A_MAGIC_SET__
 #if defined(LYNXOS)
index 3d290a4eaee41297c3afdea57c5422d6673141e5..eaaac05daa955e73d7a686dce4084e96817e214f 100644 (file)
@@ -303,7 +303,7 @@ case "${targ}" in
     ;;
   i[3456]86-*-linux-gnu*)
     targ_defvec=bfd_elf32_i386_vec
-    targ_selvecs=i386linux_vec
+    targ_selvecs="i386linux_vec bfd_efi_app_ia32_vec"
     ;;
   i[3456]86-*-lynxos*)
     targ_defvec=i386lynx_coff_vec
index 2f3ba7cfde641446d315b4b03da99ef4ba5dd2ce..feaae04c2b7f8795b3fb133bd462f29bb70c6b09 100755 (executable)
@@ -5107,6 +5107,9 @@ do
     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" ;;
@@ -5333,17 +5336,17 @@ for ac_hdr in unistd.h
 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
+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 5342 "configure"
+#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:5347: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }
+{ (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*
@@ -5372,12 +5375,12 @@ done
 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
+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 5381 "configure"
+#line 5384 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -5400,7 +5403,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:5404: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+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
@@ -5425,7 +5428,7 @@ fi
 done
 
 echo $ac_n "checking for working mmap""... $ac_c" 1>&6
-echo "configure:5429: checking for working mmap" >&5
+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
@@ -5433,7 +5436,7 @@ else
   ac_cv_func_mmap_fixed_mapped=no
 else
   cat > conftest.$ac_ext <<EOF
-#line 5437 "configure"
+#line 5440 "configure"
 #include "confdefs.h"
 
 /* Thanks to Mike Haertel and Jim Avera for this test.
@@ -5573,7 +5576,7 @@ main()
 }
 
 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
+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
@@ -5598,12 +5601,12 @@ fi
 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
+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 5607 "configure"
+#line 5610 "configure"
 #include "confdefs.h"
 /* System header to define __stub macros and hopefully few prototypes,
     which can conflict with char $ac_func(); below.  */
@@ -5626,7 +5629,7 @@ $ac_func();
 
 ; return 0; }
 EOF
-if { (eval echo configure:5630: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then
+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 3e3a689bcaef1c25e34e3e97b0eba67869b79871..e62fceec3a34f561525b9ff625274f1df3cfec00 100644 (file)
@@ -464,6 +464,9 @@ do
     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" ;;
diff --git a/bfd/efi-app-ia32.c b/bfd/efi-app-ia32.c
new file mode 100644 (file)
index 0000000..5784178
--- /dev/null
@@ -0,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"
diff --git a/bfd/efi-app-ia64.c b/bfd/efi-app-ia64.c
new file mode 100644 (file)
index 0000000..b3182dc
--- /dev/null
@@ -0,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 88f9f7382295b56a8c8edfa204bf33337d743817..db47e374818c95c104f8d37c13edc9ba54ac37da 100644 (file)
@@ -192,6 +192,36 @@ PE/PEI rearrangement (and code added): Donn Terry
 #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 639ea892565409b1c35b53d79b2dcec1985a2b20..aad3cd63ecb8949a24bbfae89c9b98598ed761ce 100644 (file)
@@ -434,11 +434,14 @@ _bfd_pei_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1)
     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 = bfd_h_get_32 (abfd, (bfd_byte *)src->ImageBase);
+  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 =
@@ -455,10 +458,10 @@ _bfd_pei_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1)
   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->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);
 
@@ -476,18 +479,25 @@ _bfd_pei_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1)
   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.
@@ -532,10 +542,28 @@ _bfd_pei_swap_aouthdr_out (abfd, in, out)
   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
 
-  bfd_vma sa = extra->SectionAlignment;
-  bfd_vma fa = extra->FileAlignment;
-  bfd_vma ib = extra->ImageBase ;
+#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) 
     {
@@ -633,12 +661,14 @@ _bfd_pei_swap_aouthdr_out (abfd, in, out)
   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
 
-
-  bfd_h_put_32 (abfd, extra->ImageBase,
-               (bfd_byte *) aouthdr_out->ImageBase);
+  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,
@@ -667,14 +697,14 @@ _bfd_pei_swap_aouthdr_out (abfd, in, out)
                (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);
+  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,
@@ -1473,18 +1503,27 @@ pe_print_edata (abfd, vfile)
   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 = 20;
+  int onaline = PDATA_ROW_SIZE;
 
   if (section == NULL
       || coff_section_data (abfd, section) == NULL
@@ -1498,10 +1537,15 @@ pe_print_pdata (abfd, vfile)
 
   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;
@@ -1527,14 +1571,14 @@ pe_print_pdata (abfd, vfile)
       bfd_vma prolog_end_addr;
       int em_data;
 
-      if (i + 20 > stop)
+      if (i + PDATA_ROW_SIZE > 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);
+      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)
@@ -1543,21 +1587,21 @@ pe_print_pdata (abfd, vfile)
          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);
+      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)
@@ -1603,6 +1647,12 @@ static const char * const tbl[] =
 "HIGHLOW",
 "HIGHADJ",
 "MIPS_JMPADDR",
+"SECTION",
+"REL32",
+"RESERVED1",
+"MIPS_JMPADDR16",
+"DIR64",
+"HIGH3ADJ"
 "UNKNOWN",   /* MUST be last */
 };
 
@@ -1707,6 +1757,7 @@ _bfd_pe_print_private_bfd_data_common (abfd, vfile)
   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
@@ -1744,8 +1795,40 @@ _bfd_pe_print_private_bfd_data_common (abfd, vfile)
   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);
+  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 e54eb29a717e04e0ca2e13754960e443760c8964..8217d56fd90c5017cc3034a4991713f20bdcd02b 100644 (file)
@@ -505,6 +505,8 @@ extern const bfd_target arm_epoc_pei_little_vec;
 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;
@@ -689,6 +691,11 @@ const bfd_target * const bfd_target_vector[] = {
        &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
           --enable-targets=all, objdump or gdb should be able to examine