Add arm-epoc-pe specific linker script
[deliverable/binutils-gdb.git] / bfd / peicode.h
index 8b669424f07ab44da8bdc8446542ca2bef7190c0..0b6bde4e44b7b1f4038c95f43bee5ff4f2fae664 100644 (file)
@@ -1,6 +1,6 @@
-/* Support for the generic parts of most COFF variants, for BFD.
-   Copyright 1995 Free Software Foundation, Inc.
-   Written by Cygnus Support.
+/* Support for the generic parts of PE/PEI, for BFD.
+   Copyright 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+   Written by Cygnus Solutions.
 
 This file is part of BFD, the Binary File Descriptor library.
 
@@ -21,152 +21,76 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 /*
 Most of this hacked by  Steve Chamberlain,
                        sac@cygnus.com
-*/
-
 
+PE/PEI rearrangement (and code added): Donn Terry
+                                       Softway Systems, Inc.
+*/
 
-#define coff_bfd_print_private_bfd_data pe_print_private_bfd_data
-#define coff_mkobject pe_mkobject
-#define coff_mkobject_hook pe_mkobject_hook
+/* Hey look, some documentation [and in a place you expect to find it]!
+
+   The main reference for the pei format is "Microsoft Portable Executable
+   and Common Object File Format Specification 4.1".  Get it if you need to
+   do some serious hacking on this code.
+
+   Another reference:
+   "Peering Inside the PE: A Tour of the Win32 Portable Executable
+   File Format", MSJ 1994, Volume 9.
+
+   The *sole* difference between the pe format and the pei format is that the
+   latter has an MSDOS 2.0 .exe header on the front that prints the message
+   "This app must be run under Windows." (or some such).
+   (FIXME: Whether that statement is *really* true or not is unknown.
+   Are there more subtle differences between pe and pei formats?
+   For now assume there aren't.  If you find one, then for God sakes
+   document it here!)
+
+   The Microsoft docs use the word "image" instead of "executable" because
+   the former can also refer to a DLL (shared library).  Confusion can arise
+   because the `i' in `pei' also refers to "image".  The `pe' format can
+   also create images (i.e. executables), it's just that to run on a win32
+   system you need to use the pei format.
+
+   FIXME: Please add more docs here so the next poor fool that has to hack
+   on this code has a chance of getting something accomplished without
+   wasting too much time.
+*/
 
-#ifndef GET_FCN_LNNOPTR
-#define GET_FCN_LNNOPTR(abfd, ext) \
-     bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
-#endif
+#include "libpei.h"
 
-#ifndef GET_FCN_ENDNDX
-#define GET_FCN_ENDNDX(abfd, ext)  \
-       bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
+static boolean (*pe_saved_coff_bfd_print_private_bfd_data)
+    PARAMS ((bfd *, PTR)) =
+#ifndef coff_bfd_print_private_bfd_data
+     NULL;
+#else
+     coff_bfd_print_private_bfd_data;
+#undef coff_bfd_print_private_bfd_data
 #endif
 
-#ifndef PUT_FCN_LNNOPTR
-#define PUT_FCN_LNNOPTR(abfd, in, ext)  bfd_h_put_32(abfd,  in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_lnnoptr)
-#endif
-#ifndef PUT_FCN_ENDNDX
-#define PUT_FCN_ENDNDX(abfd, in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_sym.x_fcnary.x_fcn.x_endndx)
-#endif
-#ifndef GET_LNSZ_LNNO
-#define GET_LNSZ_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_lnno)
-#endif
-#ifndef GET_LNSZ_SIZE
-#define GET_LNSZ_SIZE(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_misc.x_lnsz.x_size)
-#endif
-#ifndef PUT_LNSZ_LNNO
-#define PUT_LNSZ_LNNO(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_sym.x_misc.x_lnsz.x_lnno)
-#endif
-#ifndef PUT_LNSZ_SIZE
-#define PUT_LNSZ_SIZE(abfd, in, ext) bfd_h_put_16(abfd, in, (bfd_byte*) ext->x_sym.x_misc.x_lnsz.x_size)
-#endif
-#ifndef GET_SCN_SCNLEN
-#define GET_SCN_SCNLEN(abfd,  ext) bfd_h_get_32(abfd, (bfd_byte *) ext->x_scn.x_scnlen)
-#endif
-#ifndef GET_SCN_NRELOC
-#define GET_SCN_NRELOC(abfd,  ext) bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nreloc)
-#endif
-#ifndef GET_SCN_NLINNO
-#define GET_SCN_NLINNO(abfd, ext)  bfd_h_get_16(abfd, (bfd_byte *)ext->x_scn.x_nlinno)
-#endif
-#ifndef PUT_SCN_SCNLEN
-#define PUT_SCN_SCNLEN(abfd,in, ext) bfd_h_put_32(abfd, in, (bfd_byte *) ext->x_scn.x_scnlen)
-#endif
-#ifndef PUT_SCN_NRELOC
-#define PUT_SCN_NRELOC(abfd,in, ext) bfd_h_put_16(abfd, in, (bfd_byte *)ext->x_scn.x_nreloc)
-#endif
-#ifndef PUT_SCN_NLINNO
-#define PUT_SCN_NLINNO(abfd,in, ext)  bfd_h_put_16(abfd,in, (bfd_byte  *) ext->x_scn.x_nlinno)
-#endif
-#ifndef GET_LINENO_LNNO
-#define GET_LINENO_LNNO(abfd, ext) bfd_h_get_16(abfd, (bfd_byte *) (ext->l_lnno));
-#endif
-#ifndef PUT_LINENO_LNNO
-#define PUT_LINENO_LNNO(abfd,val, ext) bfd_h_put_16(abfd,val,  (bfd_byte *) (ext->l_lnno));
-#endif
+static boolean pe_print_private_bfd_data PARAMS ((bfd *, PTR));
+#define coff_bfd_print_private_bfd_data pe_print_private_bfd_data
 
-/* The f_symptr field in the filehdr is sometimes 64 bits.  */
-#ifndef GET_FILEHDR_SYMPTR
-#define GET_FILEHDR_SYMPTR bfd_h_get_32
-#endif
-#ifndef PUT_FILEHDR_SYMPTR
-#define PUT_FILEHDR_SYMPTR bfd_h_put_32
-#endif
 
-/* Some fields in the aouthdr are sometimes 64 bits.  */
-#ifndef GET_AOUTHDR_TSIZE
-#define GET_AOUTHDR_TSIZE bfd_h_get_32
-#endif
-#ifndef PUT_AOUTHDR_TSIZE
-#define PUT_AOUTHDR_TSIZE bfd_h_put_32
-#endif
-#ifndef GET_AOUTHDR_DSIZE
-#define GET_AOUTHDR_DSIZE bfd_h_get_32
-#endif
-#ifndef PUT_AOUTHDR_DSIZE
-#define PUT_AOUTHDR_DSIZE bfd_h_put_32
-#endif
-#ifndef GET_AOUTHDR_BSIZE
-#define GET_AOUTHDR_BSIZE bfd_h_get_32
-#endif
-#ifndef PUT_AOUTHDR_BSIZE
-#define PUT_AOUTHDR_BSIZE bfd_h_put_32
-#endif
-#ifndef GET_AOUTHDR_ENTRY
-#define GET_AOUTHDR_ENTRY bfd_h_get_32
-#endif
-#ifndef PUT_AOUTHDR_ENTRY
-#define PUT_AOUTHDR_ENTRY bfd_h_put_32
-#endif
-#ifndef GET_AOUTHDR_TEXT_START
-#define GET_AOUTHDR_TEXT_START bfd_h_get_32
-#endif
-#ifndef PUT_AOUTHDR_TEXT_START
-#define PUT_AOUTHDR_TEXT_START bfd_h_put_32
-#endif
-#ifndef GET_AOUTHDR_DATA_START
-#define GET_AOUTHDR_DATA_START bfd_h_get_32
-#endif
-#ifndef PUT_AOUTHDR_DATA_START
-#define PUT_AOUTHDR_DATA_START bfd_h_put_32
+static boolean (*pe_saved_coff_bfd_copy_private_bfd_data)
+    PARAMS ((bfd *, bfd *)) =
+#ifndef coff_bfd_copy_private_bfd_data
+     NULL;
+#else
+     coff_bfd_copy_private_bfd_data;
+#undef coff_bfd_copy_private_bfd_data
 #endif
 
-/* Some fields in the scnhdr are sometimes 64 bits.  */
-#ifndef GET_SCNHDR_PADDR
-#define GET_SCNHDR_PADDR bfd_h_get_32
-#endif
-#ifndef PUT_SCNHDR_PADDR
-#define PUT_SCNHDR_PADDR bfd_h_put_32
-#endif
-#ifndef GET_SCNHDR_VADDR
-#define GET_SCNHDR_VADDR bfd_h_get_32
-#endif
-#ifndef PUT_SCNHDR_VADDR
-#define PUT_SCNHDR_VADDR bfd_h_put_32
-#endif
-#ifndef GET_SCNHDR_SIZE
-#define GET_SCNHDR_SIZE bfd_h_get_32
-#endif
-#ifndef PUT_SCNHDR_SIZE
-#define PUT_SCNHDR_SIZE bfd_h_put_32
-#endif
-#ifndef GET_SCNHDR_SCNPTR
-#define GET_SCNHDR_SCNPTR bfd_h_get_32
-#endif
-#ifndef PUT_SCNHDR_SCNPTR
-#define PUT_SCNHDR_SCNPTR bfd_h_put_32
-#endif
-#ifndef GET_SCNHDR_RELPTR
-#define GET_SCNHDR_RELPTR bfd_h_get_32
-#endif
-#ifndef PUT_SCNHDR_RELPTR
-#define PUT_SCNHDR_RELPTR bfd_h_put_32
-#endif
-#ifndef GET_SCNHDR_LNNOPTR
-#define GET_SCNHDR_LNNOPTR bfd_h_get_32
-#endif
-#ifndef PUT_SCNHDR_LNNOPTR
-#define PUT_SCNHDR_LNNOPTR bfd_h_put_32
-#endif
+static boolean pe_bfd_copy_private_bfd_data PARAMS ((bfd *, bfd *));
+#define coff_bfd_copy_private_bfd_data pe_bfd_copy_private_bfd_data
 
+#define coff_mkobject      pe_mkobject
+#define coff_mkobject_hook pe_mkobject_hook
 
+static void coff_swap_reloc_in PARAMS ((bfd *, PTR, PTR));
+static unsigned int coff_swap_reloc_out PARAMS ((bfd *, PTR, PTR));
+static void coff_swap_filehdr_in PARAMS ((bfd *, PTR, PTR));
+static void coff_swap_scnhdr_in PARAMS ((bfd *, PTR, PTR));
+static boolean pe_mkobject PARAMS ((bfd *));
+static PTR pe_mkobject_hook PARAMS ((bfd *, PTR, PTR));
 
 /**********************************************************************/
 
@@ -213,7 +137,7 @@ coff_swap_reloc_out (abfd, src, dst)
 #ifdef SWAP_OUT_RELOC_EXTRA
   SWAP_OUT_RELOC_EXTRA(abfd,reloc_src, reloc_dst);
 #endif
-  return sizeof(struct external_reloc);
+  return RELSZ;
 }
 
 
@@ -233,17 +157,27 @@ coff_swap_filehdr_in (abfd, src, dst)
   filehdr_dst->f_flags = bfd_h_get_16(abfd, (bfd_byte *)filehdr_src-> f_flags);
   filehdr_dst->f_symptr = bfd_h_get_32 (abfd, (bfd_byte *) filehdr_src->f_symptr);
 
-  /* Other people's tools sometimes generate headers
-     with an nsyms but a zero symptr. */
-  if (filehdr_dst->f_nsyms && filehdr_dst->f_symptr)
-    {
-      filehdr_dst->f_flags |= HAS_SYMS;
-    }
-  else 
+#ifdef COFF_IMAGE_WITH_PE
+  /* There are really two magic numbers involved; the magic number
+     that says this is a NT executable (PEI) and the magic number that
+     determines the architecture.  The former is DOSMAGIC, stored in
+     the e_magic field.  The latter is stored in the f_magic field.
+     If the NT magic number isn't valid, the architecture magic number
+     could be mimicked by some other field (specifically, the number
+     of relocs in section 3).  Since this routine can only be called
+     correctly for a PEI file, check the e_magic number here, and, if
+     it doesn't match, clobber the f_magic number so that we don't get
+     a false match.  */
+  if (bfd_h_get_16 (abfd, (bfd_byte *) filehdr_src->e_magic) != DOSMAGIC)
+    filehdr_dst->f_magic = -1;
+#endif
+
+  /* Other people's tools sometimes generate headers with an nsyms but
+     a zero symptr.  */
+  if (filehdr_dst->f_nsyms != 0 && filehdr_dst->f_symptr == 0)
     {
-      filehdr_dst->f_symptr = 0;
       filehdr_dst->f_nsyms = 0;
-      filehdr_dst->f_flags &= ~HAS_SYMS;
+      filehdr_dst->f_flags |= F_LSYMS;
     }
 
   filehdr_dst->f_opthdr = bfd_h_get_16(abfd, 
@@ -251,700 +185,17 @@ coff_swap_filehdr_in (abfd, src, dst)
 }
 
 #ifdef COFF_IMAGE_WITH_PE
-
-static  unsigned int
-coff_swap_filehdr_out (abfd, in, out)
-     bfd       *abfd;
-     PTR       in;
-     PTR       out;
-{
-  int idx;
-  struct internal_filehdr *filehdr_in = (struct internal_filehdr *)in;
-  FILHDR *filehdr_out = (FILHDR *)out;
-
-  if (pe_data (abfd)->has_reloc_section)
-    filehdr_in->f_flags &= ~F_RELFLG;
-
-  if (pe_data (abfd)->dll)
-    filehdr_in->f_flags |= F_DLL;
-
-  filehdr_in->pe.e_magic    = DOSMAGIC;
-  filehdr_in->pe.e_cblp     = 0x90;
-  filehdr_in->pe.e_cp       = 0x3;
-  filehdr_in->pe.e_crlc     = 0x0;
-  filehdr_in->pe.e_cparhdr  = 0x4;
-  filehdr_in->pe.e_minalloc = 0x0;
-  filehdr_in->pe.e_maxalloc = 0xffff;
-  filehdr_in->pe.e_ss       = 0x0;
-  filehdr_in->pe.e_sp       = 0xb8;
-  filehdr_in->pe.e_csum     = 0x0;
-  filehdr_in->pe.e_ip       = 0x0;
-  filehdr_in->pe.e_cs       = 0x0;
-  filehdr_in->pe.e_lfarlc   = 0x40;
-  filehdr_in->pe.e_ovno     = 0x0;
-
-  for (idx=0; idx < 4; idx++)
-    filehdr_in->pe.e_res[idx] = 0x0;
-
-  filehdr_in->pe.e_oemid   = 0x0;
-  filehdr_in->pe.e_oeminfo = 0x0;
-
-  for (idx=0; idx < 10; idx++)
-    filehdr_in->pe.e_res2[idx] = 0x0;
-
-  filehdr_in->pe.e_lfanew = 0x80;
-
-  /* this next collection of data are mostly just characters.  It appears
-     to be constant within the headers put on NT exes */
-  filehdr_in->pe.dos_message[0]  = 0x0eba1f0e;
-  filehdr_in->pe.dos_message[1]  = 0xcd09b400;
-  filehdr_in->pe.dos_message[2]  = 0x4c01b821;
-  filehdr_in->pe.dos_message[3]  = 0x685421cd;
-  filehdr_in->pe.dos_message[4]  = 0x70207369;
-  filehdr_in->pe.dos_message[5]  = 0x72676f72;
-  filehdr_in->pe.dos_message[6]  = 0x63206d61;
-  filehdr_in->pe.dos_message[7]  = 0x6f6e6e61;
-  filehdr_in->pe.dos_message[8]  = 0x65622074;
-  filehdr_in->pe.dos_message[9]  = 0x6e757220;
-  filehdr_in->pe.dos_message[10] = 0x206e6920;
-  filehdr_in->pe.dos_message[11] = 0x20534f44;
-  filehdr_in->pe.dos_message[12] = 0x65646f6d;
-  filehdr_in->pe.dos_message[13] = 0x0a0d0d2e;
-  filehdr_in->pe.dos_message[14] = 0x24;
-  filehdr_in->pe.dos_message[15] = 0x0;
-  filehdr_in->pe.nt_signature = NT_SIGNATURE;
-
-
-
-  bfd_h_put_16(abfd, filehdr_in->f_magic, (bfd_byte *) filehdr_out->f_magic);
-  bfd_h_put_16(abfd, filehdr_in->f_nscns, (bfd_byte *) filehdr_out->f_nscns);
-
-  bfd_h_put_32(abfd, time (0), (bfd_byte *) filehdr_out->f_timdat);
-  PUT_FILEHDR_SYMPTR (abfd, (bfd_vma) filehdr_in->f_symptr,
-                     (bfd_byte *) filehdr_out->f_symptr);
-  bfd_h_put_32(abfd, filehdr_in->f_nsyms, (bfd_byte *) filehdr_out->f_nsyms);
-  bfd_h_put_16(abfd, filehdr_in->f_opthdr, (bfd_byte *) filehdr_out->f_opthdr);
-  bfd_h_put_16(abfd, filehdr_in->f_flags, (bfd_byte *) filehdr_out->f_flags);
-
-  /* put in extra dos header stuff.  This data remains essentially
-     constant, it just has to be tacked on to the beginning of all exes 
-     for NT */
-  bfd_h_put_16(abfd, filehdr_in->pe.e_magic, (bfd_byte *) filehdr_out->e_magic);
-  bfd_h_put_16(abfd, filehdr_in->pe.e_cblp, (bfd_byte *) filehdr_out->e_cblp);
-  bfd_h_put_16(abfd, filehdr_in->pe.e_cp, (bfd_byte *) filehdr_out->e_cp);
-  bfd_h_put_16(abfd, filehdr_in->pe.e_crlc, (bfd_byte *) filehdr_out->e_crlc);
-  bfd_h_put_16(abfd, filehdr_in->pe.e_cparhdr, 
-              (bfd_byte *) filehdr_out->e_cparhdr);
-  bfd_h_put_16(abfd, filehdr_in->pe.e_minalloc, 
-              (bfd_byte *) filehdr_out->e_minalloc);
-  bfd_h_put_16(abfd, filehdr_in->pe.e_maxalloc, 
-              (bfd_byte *) filehdr_out->e_maxalloc);
-  bfd_h_put_16(abfd, filehdr_in->pe.e_ss, (bfd_byte *) filehdr_out->e_ss);
-  bfd_h_put_16(abfd, filehdr_in->pe.e_sp, (bfd_byte *) filehdr_out->e_sp);
-  bfd_h_put_16(abfd, filehdr_in->pe.e_csum, (bfd_byte *) filehdr_out->e_csum);
-  bfd_h_put_16(abfd, filehdr_in->pe.e_ip, (bfd_byte *) filehdr_out->e_ip);
-  bfd_h_put_16(abfd, filehdr_in->pe.e_cs, (bfd_byte *) filehdr_out->e_cs);
-  bfd_h_put_16(abfd, filehdr_in->pe.e_lfarlc, (bfd_byte *) filehdr_out->e_lfarlc);
-  bfd_h_put_16(abfd, filehdr_in->pe.e_ovno, (bfd_byte *) filehdr_out->e_ovno);
-  {
-    int idx;
-    for (idx=0; idx < 4; idx++)
-      bfd_h_put_16(abfd, filehdr_in->pe.e_res[idx], 
-                  (bfd_byte *) filehdr_out->e_res[idx]);
-  }
-  bfd_h_put_16(abfd, filehdr_in->pe.e_oemid, (bfd_byte *) filehdr_out->e_oemid);
-  bfd_h_put_16(abfd, filehdr_in->pe.e_oeminfo,
-              (bfd_byte *) filehdr_out->e_oeminfo);
-  {
-    int idx;
-    for (idx=0; idx < 10; idx++)
-      bfd_h_put_16(abfd, filehdr_in->pe.e_res2[idx],
-                  (bfd_byte *) filehdr_out->e_res2[idx]);
-  }
-  bfd_h_put_32(abfd, filehdr_in->pe.e_lfanew, (bfd_byte *) filehdr_out->e_lfanew);
-
-  {
-    int idx;
-    for (idx=0; idx < 16; idx++)
-      bfd_h_put_32(abfd, filehdr_in->pe.dos_message[idx],
-                  (bfd_byte *) filehdr_out->dos_message[idx]);
-  }
-
-  /* also put in the NT signature */
-  bfd_h_put_32(abfd, filehdr_in->pe.nt_signature, 
-              (bfd_byte *) filehdr_out->nt_signature);
-
-
-
-
-  return sizeof(FILHDR);
-}
+#define coff_swap_filehdr_out _bfd_pei_only_swap_filehdr_out
 #else
-
-static  unsigned int
-coff_swap_filehdr_out (abfd, in, out)
-     bfd       *abfd;
-     PTR       in;
-     PTR       out;
-{
-  struct internal_filehdr *filehdr_in = (struct internal_filehdr *)in;
-  FILHDR *filehdr_out = (FILHDR *)out;
-
-  bfd_h_put_16(abfd, filehdr_in->f_magic, (bfd_byte *) filehdr_out->f_magic);
-  bfd_h_put_16(abfd, filehdr_in->f_nscns, (bfd_byte *) filehdr_out->f_nscns);
-  bfd_h_put_32(abfd, filehdr_in->f_timdat, (bfd_byte *) filehdr_out->f_timdat);
-  PUT_FILEHDR_SYMPTR (abfd, (bfd_vma) filehdr_in->f_symptr,
-                     (bfd_byte *) filehdr_out->f_symptr);
-  bfd_h_put_32(abfd, filehdr_in->f_nsyms, (bfd_byte *) filehdr_out->f_nsyms);
-  bfd_h_put_16(abfd, filehdr_in->f_opthdr, (bfd_byte *) filehdr_out->f_opthdr);
-  bfd_h_put_16(abfd, filehdr_in->f_flags, (bfd_byte *) filehdr_out->f_flags);
-
-  return sizeof(FILHDR);
-}
-
+#define coff_swap_filehdr_out _bfd_pe_only_swap_filehdr_out
 #endif
 
 
 static void
-coff_swap_sym_in (abfd, ext1, in1)
+coff_swap_scnhdr_in (abfd, ext, in)
      bfd            *abfd;
-     PTR ext1;
-     PTR in1;
-{
-  SYMENT *ext = (SYMENT *)ext1;
-  struct internal_syment      *in = (struct internal_syment *)in1;
-
-  if( ext->e.e_name[0] == 0) {
-    in->_n._n_n._n_zeroes = 0;
-    in->_n._n_n._n_offset = bfd_h_get_32(abfd, (bfd_byte *) ext->e.e.e_offset);
-  }
-  else {
-#if SYMNMLEN != E_SYMNMLEN
-    -> Error, we need to cope with truncating or extending SYMNMLEN!;
-#else
-    memcpy(in->_n._n_name, ext->e.e_name, SYMNMLEN);
-#endif
-  }
-
-  in->n_value = bfd_h_get_32(abfd, (bfd_byte *) ext->e_value); 
-  in->n_scnum = bfd_h_get_16(abfd, (bfd_byte *) ext->e_scnum);
-  if (sizeof(ext->e_type) == 2){
-    in->n_type = bfd_h_get_16(abfd, (bfd_byte *) ext->e_type);
-  }
-  else {
-    in->n_type = bfd_h_get_32(abfd, (bfd_byte *) ext->e_type);
-  }
-  in->n_sclass = bfd_h_get_8(abfd, ext->e_sclass);
-  in->n_numaux = bfd_h_get_8(abfd, ext->e_numaux);
-
-  /* The section symbols for the .idata$ sections have class 68, which MS
-     documentation indicates is a section symbol.  The problem is that the
-     value field in the symbol is simply a copy of the .idata section's flags
-     rather than something useful.  When these symbols are encountered, change
-     the value to 0 and the section number to 1 so that they will be handled
-     somewhat correctly in the bfd code. */
-  if (in->n_sclass == 0x68) {
-    in->n_value = 0x0;
-    in->n_scnum = 1;
-    /* I have tried setting the class to 3 and using the following to set
-       the section number.  This will put the address of the pointer to the
-       string kernel32.dll at addresses 0 and 0x10 off start of idata section
-       which is not correct */
-    /*    if (strcmp (in->_n._n_name, ".idata$4") == 0) */
-    /*      in->n_scnum = 3; */
-    /*    else */
-    /*      in->n_scnum = 2; */
-  }
-
-#ifdef coff_swap_sym_in_hook
-  coff_swap_sym_in_hook(abfd, ext1, in1);
-#endif
-}
-
-static unsigned int
-coff_swap_sym_out (abfd, inp, extp)
-     bfd       *abfd;
-     PTR       inp;
-     PTR       extp;
-{
-  struct internal_syment *in = (struct internal_syment *)inp;
-  SYMENT *ext =(SYMENT *)extp;
-  if(in->_n._n_name[0] == 0) {
-    bfd_h_put_32(abfd, 0, (bfd_byte *) ext->e.e.e_zeroes);
-    bfd_h_put_32(abfd, in->_n._n_n._n_offset, (bfd_byte *)  ext->e.e.e_offset);
-  }
-  else {
-#if SYMNMLEN != E_SYMNMLEN
-    -> Error, we need to cope with truncating or extending SYMNMLEN!;
-#else
-    memcpy(ext->e.e_name, in->_n._n_name, SYMNMLEN);
-#endif
-  }
-
-  bfd_h_put_32(abfd,  in->n_value , (bfd_byte *) ext->e_value);
-  bfd_h_put_16(abfd,  in->n_scnum , (bfd_byte *) ext->e_scnum);
-  if (sizeof(ext->e_type) == 2)
-    {
-      bfd_h_put_16(abfd,  in->n_type , (bfd_byte *) ext->e_type);
-    }
-  else
-    {
-      bfd_h_put_32(abfd,  in->n_type , (bfd_byte *) ext->e_type);
-    }
-  bfd_h_put_8(abfd,  in->n_sclass , ext->e_sclass);
-  bfd_h_put_8(abfd,  in->n_numaux , ext->e_numaux);
-
-  return sizeof(SYMENT);
-}
-
-static void
-coff_swap_aux_in (abfd, ext1, type, class, indx, numaux, in1)
-     bfd            *abfd;
-     PTR             ext1;
-     int             type;
-     int             class;
-     int             indx;
-     int             numaux;
-     PTR             in1;
-{
-  AUXENT    *ext = (AUXENT *)ext1;
-  union internal_auxent *in = (union internal_auxent *)in1;
-
-  switch (class) {
-  case C_FILE:
-    if (ext->x_file.x_fname[0] == 0) {
-      in->x_file.x_n.x_zeroes = 0;
-      in->x_file.x_n.x_offset = 
-       bfd_h_get_32(abfd, (bfd_byte *) ext->x_file.x_n.x_offset);
-    } else {
-#if FILNMLEN != E_FILNMLEN
-      -> Error, we need to cope with truncating or extending FILNMLEN!;
-#else
-      memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
-#endif
-    }
-    return;
-
-
-  case C_STAT:
-#ifdef C_LEAFSTAT
-  case C_LEAFSTAT:
-#endif
-  case C_HIDDEN:
-    if (type == T_NULL) {
-      in->x_scn.x_scnlen = GET_SCN_SCNLEN(abfd, ext);
-      in->x_scn.x_nreloc = GET_SCN_NRELOC(abfd, ext);
-      in->x_scn.x_nlinno = GET_SCN_NLINNO(abfd, ext);
-      return;
-    }
-    break;
-  }
-
-  in->x_sym.x_tagndx.l = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_tagndx);
-#ifndef NO_TVNDX
-  in->x_sym.x_tvndx = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_tvndx);
-#endif
-
-  if (class == C_BLOCK || ISFCN (type) || ISTAG (class))
-    {
-      in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR (abfd, ext);
-      in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX (abfd, ext);
-    }
-  else
-    {
-#if DIMNUM != E_DIMNUM
- #error we need to cope with truncating or extending DIMNUM
-#endif
-      in->x_sym.x_fcnary.x_ary.x_dimen[0] =
-       bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
-      in->x_sym.x_fcnary.x_ary.x_dimen[1] =
-       bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
-      in->x_sym.x_fcnary.x_ary.x_dimen[2] =
-       bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
-      in->x_sym.x_fcnary.x_ary.x_dimen[3] =
-       bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
-    }
-
-  if (ISFCN(type)) {
-    in->x_sym.x_misc.x_fsize = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_misc.x_fsize);
-  }
-  else {
-    in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO(abfd, ext);
-    in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE(abfd, ext);
-  }
-}
-
-static unsigned int
-coff_swap_aux_out (abfd, inp, type, class, indx, numaux, extp)
-     bfd   *abfd;
-     PTR       inp;
-     int   type;
-     int   class;
-     int   indx;
-     int   numaux;
-     PTR       extp;
-{
-  union internal_auxent *in = (union internal_auxent *)inp;
-  AUXENT *ext = (AUXENT *)extp;
-
-  memset((PTR)ext, 0, AUXESZ);
-  switch (class) {
-  case C_FILE:
-    if (in->x_file.x_fname[0] == 0) {
-      bfd_h_put_32(abfd, 0, (bfd_byte *) ext->x_file.x_n.x_zeroes);
-      bfd_h_put_32(abfd,
-             in->x_file.x_n.x_offset,
-             (bfd_byte *) ext->x_file.x_n.x_offset);
-    }
-    else {
-#if FILNMLEN != E_FILNMLEN
-      -> Error, we need to cope with truncating or extending FILNMLEN!;
-#else
-      memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
-#endif
-    }
-    return sizeof (AUXENT);
-
-
-  case C_STAT:
-#ifdef C_LEAFSTAT
-  case C_LEAFSTAT:
-#endif
-  case C_HIDDEN:
-    if (type == T_NULL) {
-      PUT_SCN_SCNLEN(abfd, in->x_scn.x_scnlen, ext);
-      PUT_SCN_NRELOC(abfd, in->x_scn.x_nreloc, ext);
-      PUT_SCN_NLINNO(abfd, in->x_scn.x_nlinno, ext);
-      return sizeof (AUXENT);
-    }
-    break;
-  }
-
-  bfd_h_put_32(abfd, in->x_sym.x_tagndx.l, (bfd_byte *) ext->x_sym.x_tagndx);
-#ifndef NO_TVNDX
-  bfd_h_put_16(abfd, in->x_sym.x_tvndx , (bfd_byte *) ext->x_sym.x_tvndx);
-#endif
-
-  if (class == C_BLOCK || ISFCN (type) || ISTAG (class))
-    {
-      PUT_FCN_LNNOPTR(abfd,  in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
-      PUT_FCN_ENDNDX(abfd,  in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
-    }
-  else
-    {
-#if DIMNUM != E_DIMNUM
- #error we need to cope with truncating or extending DIMNUM
-#endif
-      bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
-                   (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
-      bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
-                   (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
-      bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
-                   (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
-      bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
-                   (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
-    }
-
-  if (ISFCN (type))
-    bfd_h_put_32 (abfd, in->x_sym.x_misc.x_fsize,
-            (bfd_byte *)  ext->x_sym.x_misc.x_fsize);
-  else
-    {
-      PUT_LNSZ_LNNO (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext);
-      PUT_LNSZ_SIZE (abfd, in->x_sym.x_misc.x_lnsz.x_size, ext);
-    }
-
-  return sizeof(AUXENT);
-}
-
-
-static void
-coff_swap_lineno_in (abfd, ext1, in1)
-     bfd            *abfd;
-     PTR ext1;
-     PTR in1;
-{
-  LINENO *ext = (LINENO *)ext1;
-  struct internal_lineno      *in = (struct internal_lineno *)in1;
-
-  in->l_addr.l_symndx = bfd_h_get_32(abfd, (bfd_byte *) ext->l_addr.l_symndx);
-  in->l_lnno = GET_LINENO_LNNO(abfd, ext);
-}
-
-static unsigned int
-coff_swap_lineno_out (abfd, inp, outp)
-     bfd       *abfd;
-     PTR       inp;
-     PTR       outp;
-{
-  struct internal_lineno *in = (struct internal_lineno *)inp;
-  struct external_lineno *ext = (struct external_lineno *)outp;
-  bfd_h_put_32(abfd, in->l_addr.l_symndx, (bfd_byte *)
-         ext->l_addr.l_symndx);
-
-  PUT_LINENO_LNNO (abfd, in->l_lnno, ext);
-  return sizeof(struct external_lineno);
-}
-
-
-
-static void
-coff_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1)
-     bfd            *abfd;
-     PTR aouthdr_ext1;
-     PTR aouthdr_int1;
-{
-  struct internal_extra_pe_aouthdr *a;
-  PEAOUTHDR *src = (PEAOUTHDR *)(aouthdr_ext1);
-  AOUTHDR        *aouthdr_ext = (AOUTHDR *) aouthdr_ext1;
-  struct internal_aouthdr *aouthdr_int = (struct internal_aouthdr *)aouthdr_int1;
-
-  aouthdr_int->magic = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->magic);
-  aouthdr_int->vstamp = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->vstamp);
-  aouthdr_int->tsize =
-    GET_AOUTHDR_TSIZE (abfd, (bfd_byte *) aouthdr_ext->tsize);
-  aouthdr_int->dsize =
-    GET_AOUTHDR_DSIZE (abfd, (bfd_byte *) aouthdr_ext->dsize);
-  aouthdr_int->bsize =
-    GET_AOUTHDR_BSIZE (abfd, (bfd_byte *) aouthdr_ext->bsize);
-  aouthdr_int->entry =
-    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, src->ImageBase);
-  a->SectionAlignment = bfd_h_get_32 (abfd, src->SectionAlignment);
-  a->FileAlignment = bfd_h_get_32 (abfd, src->FileAlignment);
-  a->MajorOperatingSystemVersion = 
-    bfd_h_get_16 (abfd, src->MajorOperatingSystemVersion);
-  a->MinorOperatingSystemVersion = 
-    bfd_h_get_16 (abfd, src->MinorOperatingSystemVersion);
-  a->MajorImageVersion = bfd_h_get_16 (abfd, src->MajorImageVersion);
-  a->MinorImageVersion = bfd_h_get_16 (abfd, src->MinorImageVersion);
-  a->MajorSubsystemVersion = bfd_h_get_16 (abfd, src->MajorSubsystemVersion);
-  a->MinorSubsystemVersion = bfd_h_get_16 (abfd, src->MinorSubsystemVersion);
-  a->Reserved1 = bfd_h_get_32 (abfd, src->Reserved1);
-  a->SizeOfImage = bfd_h_get_32 (abfd, src->SizeOfImage);
-  a->SizeOfHeaders = bfd_h_get_32 (abfd, src->SizeOfHeaders);
-  a->CheckSum = bfd_h_get_32 (abfd, src->CheckSum);
-  a->Subsystem = bfd_h_get_16 (abfd, src->Subsystem);
-  a->DllCharacteristics = bfd_h_get_16 (abfd, src->DllCharacteristics);
-  a->SizeOfStackReserve = bfd_h_get_32 (abfd, src->SizeOfStackReserve);
-  a->SizeOfStackCommit = bfd_h_get_32 (abfd, src->SizeOfStackCommit);
-  a->SizeOfHeapReserve = bfd_h_get_32 (abfd, src->SizeOfHeapReserve);
-  a->SizeOfHeapCommit = bfd_h_get_32 (abfd, src->SizeOfHeapCommit);
-  a->LoaderFlags = bfd_h_get_32 (abfd, src->LoaderFlags);
-  a->NumberOfRvaAndSizes = bfd_h_get_32 (abfd, src->NumberOfRvaAndSizes);
-
-  {
-    int idx;
-    for (idx=0; idx < 16; idx++)
-      {
-       a->DataDirectory[idx].VirtualAddress =
-         bfd_h_get_32 (abfd, src->DataDirectory[idx][0]);
-       a->DataDirectory[idx].Size =
-         bfd_h_get_32 (abfd, src->DataDirectory[idx][1]);
-      }
-  }
-
-  if (aouthdr_int->entry)
-    aouthdr_int->entry += a->ImageBase;
-  if (aouthdr_int->tsize) 
-    aouthdr_int->text_start += a->ImageBase;
-  if (aouthdr_int->dsize) 
-    aouthdr_int->data_start += a->ImageBase;
-}
-
-
-static void add_data_entry (abfd, aout, idx, name, base)
-     bfd *abfd;
-     struct internal_extra_pe_aouthdr *aout;
-     int idx;
-     char *name;
-     bfd_vma base;
-{
-  asection *sec = bfd_get_section_by_name (abfd, name);
-
-  /* add import directory information if it exists */
-  if (sec != NULL)
-    {
-      aout->DataDirectory[idx].VirtualAddress = sec->lma - base;
-      aout->DataDirectory[idx].Size = sec->_cooked_size;
-      sec->flags |= SEC_DATA;
-    }
-}
-
-static unsigned int
-coff_swap_aouthdr_out (abfd, in, out)
-     bfd       *abfd;
-     PTR       in;
-     PTR       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 = extra->SectionAlignment;
-  bfd_vma fa = extra->FileAlignment;
-  bfd_vma ib = extra->ImageBase ;
-
-  if (aouthdr_in->tsize) 
-    aouthdr_in->text_start -= ib;
-  if (aouthdr_in->dsize) 
-    aouthdr_in->data_start -= ib;
-  if (aouthdr_in->entry) 
-    aouthdr_in->entry -= ib;
-
-#define FA(x)  (((x) + fa -1 ) & (- fa))
-#define SA(x)  (((x) + sa -1 ) & (- sa))
-
-  /* We like to have the sizes aligned */
-
-  aouthdr_in->bsize = FA (aouthdr_in->bsize);
-
-
-  extra->NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
-
-  /* first null out all data directory entries .. */
-  memset (extra->DataDirectory, sizeof (extra->DataDirectory), 0);
-
-  add_data_entry (abfd, extra, 0, ".edata", ib);
-  add_data_entry (abfd, extra, 1, ".idata", ib);
-  add_data_entry (abfd, extra, 2, ".rsrc" ,ib);
-
-#ifdef POWERPC_LE_PE
-  /* FIXME: do other PE platforms use this? */
-  add_data_entry (abfd, extra, 3, ".pdata" ,ib);
-#endif
-
-  add_data_entry (abfd, extra, 5, ".reloc", ib);
-
-#ifdef POWERPC_LE_PE
-  /* On the PPC NT system, this field is set up as follows. It is
-     not an "officially" reserved field, so it currently has no title.
-     first_thunk_address is idata$5, and the thunk_size is the size
-     of the idata$5 chunk of the idata section.
-  */
-  extra->DataDirectory[12].VirtualAddress = first_thunk_address;
-  extra->DataDirectory[12].Size = thunk_size;
-
-  /* On the PPC NT system, the size of the directory entry is not the
-     size of the entire section. It's actually offset to the end of 
-     the idata$3 component of the idata section. This is the size of
-     the entire import table. (also known as the start of idata$4)
-  */
-  extra->DataDirectory[1].Size = import_table_size;
-#endif
-
-  {
-    asection *sec;
-    bfd_vma dsize= 0;
-    bfd_vma isize = SA(abfd->sections->filepos);
-    bfd_vma tsize= 0;
-#ifdef PPC
-    isize = 0;
-#endif
-    for (sec = abfd->sections; sec; sec = sec->next)
-      {
-       int rounded = FA(sec->_raw_size);
-       if (sec->flags & SEC_DATA) 
-         dsize += rounded;
-       if (sec->flags & SEC_CODE)
-         tsize += rounded;
-       isize += SA(rounded);
-      }
-
-    aouthdr_in->dsize = dsize;
-    aouthdr_in->tsize = tsize;
-    extra->SizeOfImage = isize;
-  }
-
-  extra->SizeOfHeaders = abfd->sections->filepos;
-  bfd_h_put_16(abfd, aouthdr_in->magic, (bfd_byte *) aouthdr_out->standard.magic);
-
-#ifdef POWERPC_LE_PE
-  /* this little piece of magic sets the "linker version" field to 2.60 */
-  bfd_h_put_16(abfd, 2  + 60 * 256, (bfd_byte *) aouthdr_out->standard.vstamp);
-#else
-  /* this little piece of magic sets the "linker version" field to 2.55 */
-  bfd_h_put_16(abfd, 2  + 55 * 256, (bfd_byte *) aouthdr_out->standard.vstamp);
-#endif
-
-  PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, (bfd_byte *) aouthdr_out->standard.tsize);
-  PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, (bfd_byte *) aouthdr_out->standard.dsize);
-  PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, (bfd_byte *) aouthdr_out->standard.bsize);
-  PUT_AOUTHDR_ENTRY (abfd, aouthdr_in->entry, (bfd_byte *) aouthdr_out->standard.entry);
-  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,
-               (bfd_byte *) aouthdr_out->FileAlignment);
-  bfd_h_put_16 (abfd, extra->MajorOperatingSystemVersion,
-               (bfd_byte *) aouthdr_out->MajorOperatingSystemVersion);
-  bfd_h_put_16 (abfd, extra->MinorOperatingSystemVersion,
-               (bfd_byte *) aouthdr_out->MinorOperatingSystemVersion);
-  bfd_h_put_16 (abfd, extra->MajorImageVersion,
-               (bfd_byte *) aouthdr_out->MajorImageVersion);
-  bfd_h_put_16 (abfd, extra->MinorImageVersion,
-               (bfd_byte *) aouthdr_out->MinorImageVersion);
-  bfd_h_put_16 (abfd, extra->MajorSubsystemVersion,
-               (bfd_byte *) aouthdr_out->MajorSubsystemVersion);
-  bfd_h_put_16 (abfd, extra->MinorSubsystemVersion,
-               (bfd_byte *) aouthdr_out->MinorSubsystemVersion);
-  bfd_h_put_32 (abfd, extra->Reserved1,
-               (bfd_byte *) aouthdr_out->Reserved1);
-  bfd_h_put_32 (abfd, extra->SizeOfImage,
-               (bfd_byte *) aouthdr_out->SizeOfImage);
-  bfd_h_put_32 (abfd, extra->SizeOfHeaders,
-               (bfd_byte *) aouthdr_out->SizeOfHeaders);
-  bfd_h_put_32 (abfd, extra->CheckSum,
-               (bfd_byte *) aouthdr_out->CheckSum);
-  bfd_h_put_16 (abfd, extra->Subsystem,
-               (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,
-               (bfd_byte *) aouthdr_out->NumberOfRvaAndSizes);
-  {
-    int idx;
-    for (idx=0; idx < 16; idx++)
-      {
-       bfd_h_put_32 (abfd, extra->DataDirectory[idx].VirtualAddress,
-                     (bfd_byte *) aouthdr_out->DataDirectory[idx][0]);
-       bfd_h_put_32 (abfd, extra->DataDirectory[idx].Size,
-                     (bfd_byte *) aouthdr_out->DataDirectory[idx][1]);
-      }
-  }
-
-  return sizeof(AOUTHDR);
-}
-
-static void
-    coff_swap_scnhdr_in (abfd, ext, in)
-      bfd            *abfd;
-  PTR       ext;
-  PTR       in;
+     PTR            ext;
+     PTR            in;
 {
   SCNHDR *scnhdr_ext = (SCNHDR *) ext;
   struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
@@ -964,533 +215,37 @@ static void
     GET_SCNHDR_LNNOPTR (abfd, (bfd_byte *) scnhdr_ext->s_lnnoptr);
   scnhdr_int->s_flags = bfd_h_get_32(abfd, (bfd_byte *) scnhdr_ext->s_flags);
 
-  scnhdr_int->s_nreloc = bfd_h_get_16(abfd, (bfd_byte *) scnhdr_ext->s_nreloc);
-  scnhdr_int->s_nlnno = bfd_h_get_16(abfd, (bfd_byte *) scnhdr_ext->s_nlnno);
+  /* MS handles overflow of line numbers by carrying into the reloc
+     field (it appears).  Since it's supposed to be zero for PE
+     *IMAGE* format, that's safe.  This is still a bit iffy.  */
+#ifdef COFF_IMAGE_WITH_PE
+  scnhdr_int->s_nlnno =
+    (bfd_h_get_16 (abfd, (bfd_byte *) scnhdr_ext->s_nlnno)
+     + (bfd_h_get_16 (abfd, (bfd_byte *) scnhdr_ext->s_nreloc) << 16));
+  scnhdr_int->s_nreloc = 0;
+#else
+  scnhdr_int->s_nreloc = bfd_h_get_16 (abfd,
+                                      (bfd_byte *) scnhdr_ext->s_nreloc);
+  scnhdr_int->s_nlnno = bfd_h_get_16 (abfd,
+                                     (bfd_byte *) scnhdr_ext->s_nlnno);
+#endif
 
   if (scnhdr_int->s_vaddr != 0) 
     {
       scnhdr_int->s_vaddr += pe_data (abfd)->pe_opthdr.ImageBase;
+      scnhdr_int->s_vaddr &= 0xffffffff;
     }
-  if (strcmp (scnhdr_int->s_name, _BSS) == 0) 
-    {
-      scnhdr_int->s_size = scnhdr_int->s_paddr;
-      scnhdr_int->s_paddr = 0;
-    }
-}
-
-static unsigned int
-coff_swap_scnhdr_out (abfd, in, out)
-     bfd       *abfd;
-     PTR       in;
-     PTR       out;
-{
-  struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *)in;
-  SCNHDR *scnhdr_ext = (SCNHDR *)out;
-  unsigned int ret = sizeof (SCNHDR);
-  bfd_vma ps;
-  bfd_vma ss;
-
-  memcpy(scnhdr_ext->s_name, scnhdr_int->s_name, sizeof(scnhdr_int->s_name));
-
-  PUT_SCNHDR_VADDR (abfd, 
-                   (scnhdr_int->s_vaddr 
-                    - pe_data(abfd)->pe_opthdr.ImageBase),
-                   (bfd_byte *) scnhdr_ext->s_vaddr);
-
-  /* NT wants the size data to be rounded up to the next NT_FILE_ALIGNMENT
-     value except for the BSS section, its s_size should be 0 */
-
-
-  if (strcmp (scnhdr_int->s_name, _BSS) == 0) 
-    {
-      ps = scnhdr_int->s_size;
-      ss = 0;
-    }
-  else
-    {
-      ps = scnhdr_int->s_paddr;
-      ss = scnhdr_int->s_size;
-    }
-
-  PUT_SCNHDR_SIZE (abfd, ss,
-                  (bfd_byte *) scnhdr_ext->s_size);
-
-
-  PUT_SCNHDR_PADDR (abfd, ps, (bfd_byte *) scnhdr_ext->s_paddr);
-
-  PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr,
-                    (bfd_byte *) scnhdr_ext->s_scnptr);
-  PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr,
-                    (bfd_byte *) scnhdr_ext->s_relptr);
-  PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr,
-                     (bfd_byte *) scnhdr_ext->s_lnnoptr);
-
-  /* Extra flags must be set when dealing with NT.  All sections should also
-     have the IMAGE_SCN_MEM_READ (0x40000000) flag set.  In addition, the
-     .text section must have IMAGE_SCN_MEM_EXECUTE (0x20000000) and the data
-     sections (.idata, .data, .bss, .CRT) must have IMAGE_SCN_MEM_WRITE set
-     (this is especially important when dealing with the .idata section since
-     the addresses for routines from .dlls must be overwritten).  If .reloc
-     section data is ever generated, we must add IMAGE_SCN_MEM_DISCARDABLE
-     (0x02000000).  Also, the resource data should also be read and
-     writable.  */
-
-  /* FIXME: alignment is also encoded in this field, at least on ppc (krk) */
-  /* FIXME: even worse, I don't see how to get the original alignment field*/
-  /*        back...                                                        */
-
-  {
-    int flags = scnhdr_int->s_flags;
-    if (strcmp (scnhdr_int->s_name, ".data")  == 0 ||
-       strcmp (scnhdr_int->s_name, ".CRT")   == 0 ||
-       strcmp (scnhdr_int->s_name, ".rsrc")  == 0 ||
-       strcmp (scnhdr_int->s_name, ".bss")   == 0)
-      flags |= IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE;
-    else if (strcmp (scnhdr_int->s_name, ".text") == 0)
-      flags |= IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_EXECUTE;
-    else if (strcmp (scnhdr_int->s_name, ".reloc") == 0)
-      flags = SEC_DATA| IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE;
-    else if (strcmp (scnhdr_int->s_name, ".idata") == 0)
-      flags = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | SEC_DATA;     
-    else if (strcmp (scnhdr_int->s_name, ".rdata") == 0
-            || strcmp (scnhdr_int->s_name, ".edata") == 0)
-      flags =  IMAGE_SCN_MEM_READ | SEC_DATA;     
-    /* ppc-nt additions */
-    else if (strcmp (scnhdr_int->s_name, ".pdata") == 0)
-      flags = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_4BYTES |
-                         IMAGE_SCN_MEM_READ ;
-    /* Remember this field is a max of 8 chars, so the null is _not_ there
-       for an 8 character name like ".reldata". (yep. Stupid bug) */
-    else if (strncmp (scnhdr_int->s_name, ".reldata", strlen(".reldata")) == 0)
-      flags =  IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_8BYTES |
-              IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE ;
-    else if (strcmp (scnhdr_int->s_name, ".ydata") == 0)
-      flags =  IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_8BYTES |
-              IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE ;
-    else if (strcmp (scnhdr_int->s_name, ".drectve") == 0)
-      flags =  IMAGE_SCN_LNK_INFO | IMAGE_SCN_LNK_REMOVE ;
-    /* end of ppc-nt additions */
-
-    bfd_h_put_32(abfd, flags, (bfd_byte *) scnhdr_ext->s_flags);
-  }
-
-  if (scnhdr_int->s_nlnno <= 0xffff)
-    bfd_h_put_16(abfd, scnhdr_int->s_nlnno, (bfd_byte *) scnhdr_ext->s_nlnno);
-  else
-    {
-      (*_bfd_error_handler) ("%s: line number overflow: 0x%lx > 0xffff",
-                            bfd_get_filename (abfd),
-                            scnhdr_int->s_nlnno);
-      bfd_set_error (bfd_error_file_truncated);
-      bfd_h_put_16 (abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nlnno);
-      ret = 0;
-    }
-  if (scnhdr_int->s_nreloc <= 0xffff)
-    bfd_h_put_16(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc);
-  else
-    {
-      (*_bfd_error_handler) ("%s: reloc overflow: 0x%lx > 0xffff",
-                            bfd_get_filename (abfd),
-                            scnhdr_int->s_nreloc);
-      bfd_set_error (bfd_error_file_truncated);
-      bfd_h_put_16 (abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nreloc);
-      ret = 0;
-    }
-  return ret;
-}
-
-static char * dir_names[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] = 
-{
-  "Export Directory [.edata]",
-  "Import Directory [parts of .idata]",
-  "Resource Directory [.rsrc]",
-  "Exception Directory [.pdata]",
-  "Security Directory",
-  "Base Relocation Directory [.reloc]",
-  "Debug Directory",
-  "Description Directory",
-  "Special Directory",
-  "Thread Storage Directory [.tls]",
-  "Load Configuration Directory",
-  "Bound Import Directory",
-  "Import Address Table Directory",
-  "Reserved",
-  "Reserved",
-  "Reserved"
-};
-
-/**********************************************************************/
-static boolean
-pe_print_idata(abfd, vfile)
-     bfd*abfd;
-     void *vfile;
-{
-  FILE *file = vfile;
-  bfd_byte *data = 0;
-  asection *section = bfd_get_section_by_name (abfd, ".idata");
-
-#ifdef POWERPC_LE_PE
-  asection *rel_section = bfd_get_section_by_name (abfd, ".reldata");
-#endif
-
-  bfd_size_type datasize = 0;
-  bfd_size_type i;
-  bfd_size_type start, stop;
-  int onaline = 20;
-  bfd_vma addr_value;
-  bfd_vma loadable_toc_address;
-  bfd_vma toc_address;
-  bfd_vma start_address;
-
-  pe_data_type *pe = pe_data (abfd);
-  struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
-
-  if (section == 0)
-    return true;
-
-#ifdef POWERPC_LE_PE
-  if (rel_section != 0 && bfd_section_size (abfd, rel_section) != 0)
-    {
-      /* The toc address can be found by taking the starting address,
-        which on the PPC locates a function descriptor. The descriptor
-        consists of the function code starting address followed by the
-        address of the toc. The starting address we get from the bfd,
-        and the descriptor is supposed to be in the .reldata section. 
-      */
-
-      bfd_byte *data = 0;
-      int offset;
-      data = (bfd_byte *) bfd_malloc ((size_t) bfd_section_size (abfd, 
-                                                                rel_section));
-      if (data == NULL && bfd_section_size (abfd, rel_section) != 0)
-       return false;
-      datasize = bfd_section_size (abfd, rel_section);
-  
-      bfd_get_section_contents (abfd, 
-                               rel_section, 
-                               (PTR) data, 0, 
-                               bfd_section_size (abfd, rel_section));
-
-      offset = abfd->start_address - rel_section->vma;
-
-      start_address = bfd_get_32(abfd, data+offset);
-      loadable_toc_address = bfd_get_32(abfd, data+offset+4);
-      toc_address = loadable_toc_address - 32768;
-      fprintf(file,
-             "\nFunction descriptor located at the start address:\n");
-      fprintf (file,
-              " %04lx code-base %08lx toc (loadable) %08lx toc (actual) %08lx\n", 
-              (unsigned long int) (abfd->start_address),
-              start_address, loadable_toc_address, toc_address);
-    }
-  else
-    {
-      loadable_toc_address = 0; 
-      toc_address = 0; 
-      start_address = 0;
-    }
-#endif
-
-  fprintf(file,
-         "\nThe Import Tables (interpreted .idata section contents)\n");
-  fprintf(file,
-         " vma:    Hint    Time      Forward  DLL       First\n");
-  fprintf(file,
-         "         Table   Stamp     Chain    Name      Thunk\n");
-
-  if (bfd_section_size (abfd, section) == 0)
-    return true;
-
-  data = (bfd_byte *) bfd_malloc ((size_t) bfd_section_size (abfd, section));
-  datasize = bfd_section_size (abfd, section);
-  if (data == NULL && datasize != 0)
-    return false;
-
-  bfd_get_section_contents (abfd, 
-                           section, 
-                           (PTR) data, 0, 
-                           bfd_section_size (abfd, section));
-
-  start = 0;
-
-  stop = bfd_section_size (abfd, section);
-
-  for (i = start; i < stop; i += onaline)
-    {
-      bfd_vma hint_addr;
-      bfd_vma time_stamp;
-      bfd_vma forward_chain;
-      bfd_vma dll_name;
-      bfd_vma first_thunk;
-      int idx;
-      int j;
-      char *dll;
-      int adj = extra->ImageBase - section->vma;
-
-      fprintf (file,
-              " %04lx\t", 
-              (unsigned long int) (i + section->vma));
-      
-      if (i+20 > stop)
-       {
-         /* check stuff */
-         ;
-       }
-      
-      hint_addr = bfd_get_32(abfd, data+i);
-      time_stamp = bfd_get_32(abfd, data+i+4);
-      forward_chain = bfd_get_32(abfd, data+i+8);
-      dll_name = bfd_get_32(abfd, data+i+12);
-      first_thunk = bfd_get_32(abfd, data+i+16);
-      
-      fprintf(file, "%08lx %08lx %08lx %08lx %08lx\n",
-             hint_addr,
-             time_stamp,
-             forward_chain,
-             dll_name,
-             first_thunk);
-
-      if (hint_addr ==0)
-       {
-         break;
-       }
-
-      /* the image base is present in the section->vma */
-      dll = data + dll_name + adj;
-      fprintf(file, "\n\tDLL Name: %s\n", dll);
-      fprintf(file, "\tvma:  Ordinal  Member-Name\n");
-
-      idx = hint_addr + adj;
-
-      for (j=0;j<stop;j+=4)
-       {
-         int ordinal;
-         char *member_name;
-         bfd_vma member = bfd_get_32(abfd, data + idx + j);
-         if (member == 0)
-           break;
-         ordinal = bfd_get_16(abfd,
-                              data + member + adj);
-         member_name = data + member + adj + 2;
-         fprintf(file, "\t%04lx\t %4d  %s\n",
-                 member, ordinal, member_name);
-       }
-
-      if (hint_addr != first_thunk) 
-       {
-         int differ = 0;
-         int idx2;
-
-         idx2 = first_thunk + adj;
-
-         for (j=0;j<stop;j+=4)
-           {
-             int ordinal;
-             char *member_name;
-             bfd_vma hint_member = bfd_get_32(abfd, data + idx + j);
-             bfd_vma iat_member = bfd_get_32(abfd, data + idx2 + j);
-             if (hint_member != iat_member)
-               {
-                 if (differ == 0)
-                   {
-                     fprintf(file, 
-                             "\tThe Import Address Table (difference found)\n");
-                     fprintf(file, "\tvma:  Ordinal  Member-Name\n");
-                     differ = 1;
-                   }
-                 if (iat_member == 0)
-                   {
-                     fprintf(file,
-                             "\t>>> Ran out of IAT members!\n");
-                   }
-                 else 
-                   {
-                     ordinal = bfd_get_16(abfd,
-                                          data + iat_member + adj);
-                     member_name = data + iat_member + adj + 2;
-                     fprintf(file, "\t%04lx\t %4d  %s\n",
-                             iat_member, ordinal, member_name);
-                   }
-                 break;
-               }
-             if (hint_member == 0)
-               break;
-           }
-         if (differ == 0)
-           {
-             fprintf(file,
-                     "\tThe Import Address Table is identical\n");
-           }
-       }
-
-      fprintf(file, "\n");
-
-    }
-
-
-  free (data);
-}
-static boolean
-pe_print_pdata(abfd, vfile)
-     bfd*abfd;
-     void *vfile;
-{
-  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;
-  bfd_vma addr_value;
-
-  if (section == 0)
-    return true;
-
-  fprintf(file,
-         "\nThe Function Table (interpreted .pdata section contents)\n");
-  fprintf(file,
-         " vma:   Begin    End      EH       EH       PrologEnd\n");
-  fprintf(file,
-         "        Address  Address  Handler  Data     Address\n");
-
-  if (bfd_section_size (abfd, section) == 0)
-    return true;
-
-  data = (bfd_byte *) bfd_malloc ((size_t) bfd_section_size (abfd, section));
-  datasize = bfd_section_size (abfd, section);
-  if (data == NULL && datasize != 0)
-    return false;
-
-  bfd_get_section_contents (abfd, 
-                           section, 
-                           (PTR) data, 0, 
-                           bfd_section_size (abfd, section));
 
-  start = 0;
-
-  stop = bfd_section_size (abfd, section);
-
-  for (i = start; i < stop; i += onaline)
+  /* If this section holds uninitialized data, use the virtual size
+     (stored in s_paddr) instead of the physical size.  */
+  if ((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0)
     {
-      bfd_vma begin_addr;
-      bfd_vma end_addr;
-      bfd_vma eh_handler;
-      bfd_vma eh_data;
-      bfd_vma prolog_end_addr;
-
-      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)
-       {
-         /* We are probably into the padding of the
-            section now */
-         break;
-       }
-
-      fprintf (file,
-              " %04lx\t", 
-              (unsigned long int) (i + section->vma));
-
-      fprintf(file, "%08lx %08lx %08lx %08lx %08lx",
-             begin_addr,
-             end_addr,
-             eh_handler,
-             eh_data,
-             prolog_end_addr);
-
-#ifdef POWERPC_LE_PE
-      if (eh_handler == 0 && eh_data != 0)
-       {
-         /* Special bits here, although the meaning may */
-         /* be a little mysterious. The only one I know */
-         /* for sure is 0x03.                           */
-         /* Code Significance                           */
-         /* 0x00 None                                   */
-         /* 0x01 Register Save Millicode                */
-         /* 0x02 Register Restore Millicode             */
-         /* 0x03 Glue Code Sequence                     */
-         switch (eh_data)
-           {
-           case 0x01:
-             fprintf(file, " Register save millicode");
-             break;
-           case 0x02:
-             fprintf(file, " Register restore millicode");
-             break;
-           case 0x03:
-             fprintf(file, " Glue code sequence");
-             break;
-           default:
-             break;
-           }
-       }
-#endif    
-      fprintf(file, "\n");
-    }
-
-  free (data);
-}
-
-static boolean
-pe_print_private_bfd_data (abfd, vfile)
-     bfd *abfd;
-     PTR vfile;
-{
-  FILE *file = (FILE *) vfile;
-  int j;
-  pe_data_type *pe = pe_data (abfd);
-  struct internal_extra_pe_aouthdr *i = &pe->pe_opthdr;
-
-  fprintf (file,"\nImageBase\t\t");
-  fprintf_vma (file, i->ImageBase);
-  fprintf (file,"\nSectionAlignment\t");
-  fprintf_vma (file, i->SectionAlignment);
-  fprintf (file,"\nFileAlignment\t\t");
-  fprintf_vma (file, i->FileAlignment);
-  fprintf (file,"\nMajorOSystemVersion\t%d\n", i->MajorOperatingSystemVersion);
-  fprintf (file,"MinorOSystemVersion\t%d\n", i->MinorOperatingSystemVersion);
-  fprintf (file,"MajorImageVersion\t%d\n", i->MajorImageVersion);
-  fprintf (file,"MinorImageVersion\t%d\n", i->MinorImageVersion);
-  fprintf (file,"MajorSubsystemVersion\t%d\n", i->MajorSubsystemVersion);
-  fprintf (file,"MinorSubsystemVersion\t%d\n", i->MinorSubsystemVersion);
-  fprintf (file,"Reserved1\t\t%08lx\n", i->Reserved1);
-  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");
-  fprintf_vma (file, i->SizeOfStackCommit);
-  fprintf (file,"\nSizeOfHeapReserve\t");
-  fprintf_vma (file, i->SizeOfHeapReserve);
-  fprintf (file,"\nSizeOfHeapCommit\t");
-  fprintf_vma (file, i->SizeOfHeapCommit);
-  fprintf (file,"\nLoaderFlags\t\t%08lx\n", i->LoaderFlags);
-  fprintf (file,"NumberOfRvaAndSizes\t%08lx\n", i->NumberOfRvaAndSizes);
-
-  fprintf (file,"\nThe Data Directory\n");
-  for (j = 0; j < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; j++) 
-    {
-      fprintf (file, "Entry %1x ", j);
-      fprintf_vma (file, i->DataDirectory[j].VirtualAddress);
-      fprintf (file, " %08lx ", i->DataDirectory[j].Size);
-      fprintf (file, "%s\n", dir_names[j]);
+      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
+         section.  */
     }
-
-  pe_print_idata(abfd, vfile);
-  pe_print_pdata(abfd, vfile);
-
-  return true;
 }
 
 static boolean
@@ -1507,6 +262,8 @@ pe_mkobject (abfd)
   pe = pe_data (abfd);
 
   pe->coff.pe = 1;
+
+  /* in_reloc_p is architecture dependent.  */
   pe->in_reloc_p = in_reloc_p;
   return true;
 }
@@ -1516,7 +273,7 @@ static PTR
 pe_mkobject_hook (abfd, filehdr, aouthdr)
      bfd * abfd;
      PTR filehdr;
-     PTR aouthdr;
+     PTR aouthdr ATTRIBUTE_UNUSED;
 {
   struct internal_filehdr *internal_f = (struct internal_filehdr *) filehdr;
   pe_data_type *pe;
@@ -1537,39 +294,70 @@ pe_mkobject_hook (abfd, filehdr, aouthdr)
   pe->coff.local_auxesz = AUXESZ;
   pe->coff.local_linesz = LINESZ;
 
+  pe->coff.timestamp = internal_f->f_timdat;
+
   obj_raw_syment_count (abfd) =
     obj_conv_table_size (abfd) =
       internal_f->f_nsyms;
 
   pe->real_flags = internal_f->f_flags;
 
+  if ((internal_f->f_flags & F_DLL) != 0)
+    pe->dll = 1;
+
+  if ((internal_f->f_flags & IMAGE_FILE_DEBUG_STRIPPED) == 0)
+    abfd->flags |= HAS_DEBUG;
+
 #ifdef COFF_IMAGE_WITH_PE
   if (aouthdr) 
-    {
-      pe->pe_opthdr = ((struct internal_aouthdr *)aouthdr)->pe;
-    }
+    pe->pe_opthdr = ((struct internal_aouthdr *)aouthdr)->pe;
 #endif
 
+#ifdef ARM 
+  if (! _bfd_coff_arm_set_private_flags (abfd, internal_f->f_flags))
+    coff_data (abfd) ->flags = 0;
+#endif
+  
   return (PTR) pe;
 }
 
+static boolean
+pe_print_private_bfd_data (abfd, vfile)
+     bfd *abfd;
+     PTR vfile;
+{
+  FILE *file = (FILE *) vfile;
 
+  if (!_bfd_pe_print_private_bfd_data_common (abfd, vfile))
+    return false;
+
+  if (pe_saved_coff_bfd_print_private_bfd_data != NULL)
+    {
+      fputc ('\n', file);
+
+      return pe_saved_coff_bfd_print_private_bfd_data (abfd, vfile);
+    }
+
+  return true;
+}
 
 /* Copy any private info we understand from the input bfd
    to the output bfd.  */
 
-#define coff_bfd_copy_private_bfd_data pe_bfd_copy_private_bfd_data
-
 static boolean
 pe_bfd_copy_private_bfd_data (ibfd, obfd)
      bfd *ibfd, *obfd;
 {
-  /* One day we may try to grok other private data.  */
-  if (ibfd->xvec->flavour != bfd_target_coff_flavour
-      || obfd->xvec->flavour != bfd_target_coff_flavour)
-    return true;
+  if (!_bfd_pe_bfd_copy_private_bfd_data_common (ibfd, obfd))
+    return false;
 
-  pe_data(obfd)->pe_opthdr = pe_data (ibfd)->pe_opthdr;
+  if (pe_saved_coff_bfd_copy_private_bfd_data)
+    return pe_saved_coff_bfd_copy_private_bfd_data (ibfd, obfd);
 
   return true;
 }
+
+#define coff_bfd_copy_private_section_data \
+  _bfd_pe_bfd_copy_private_section_data
+
+#define coff_get_symbol_info _bfd_pe_get_symbol_info
This page took 0.038684 seconds and 4 git commands to generate.