Home | History | Annotate | Line # | Download | only in bfd
peXXigen.c revision 1.1.1.7.4.1
      1 /* Support for the generic parts of PE/PEI; the common executable parts.
      2    Copyright (C) 1995-2019 Free Software Foundation, Inc.
      3    Written by Cygnus Solutions.
      4 
      5    This file is part of BFD, the Binary File Descriptor library.
      6 
      7    This program is free software; you can redistribute it and/or modify
      8    it under the terms of the GNU General Public License as published by
      9    the Free Software Foundation; either version 3 of the License, or
     10    (at your option) any later version.
     11 
     12    This program is distributed in the hope that it will be useful,
     13    but WITHOUT ANY WARRANTY; without even the implied warranty of
     14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15    GNU General Public License for more details.
     16 
     17    You should have received a copy of the GNU General Public License
     18    along with this program; if not, write to the Free Software
     19    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
     20    MA 02110-1301, USA.  */
     21 
     22 
     23 /* Most of this hacked by Steve Chamberlain <sac (at) cygnus.com>.
     24 
     25    PE/PEI rearrangement (and code added): Donn Terry
     26 					  Softway Systems, Inc.  */
     27 
     28 /* Hey look, some documentation [and in a place you expect to find it]!
     29 
     30    The main reference for the pei format is "Microsoft Portable Executable
     31    and Common Object File Format Specification 4.1".  Get it if you need to
     32    do some serious hacking on this code.
     33 
     34    Another reference:
     35    "Peering Inside the PE: A Tour of the Win32 Portable Executable
     36    File Format", MSJ 1994, Volume 9.
     37 
     38    The *sole* difference between the pe format and the pei format is that the
     39    latter has an MSDOS 2.0 .exe header on the front that prints the message
     40    "This app must be run under Windows." (or some such).
     41    (FIXME: Whether that statement is *really* true or not is unknown.
     42    Are there more subtle differences between pe and pei formats?
     43    For now assume there aren't.  If you find one, then for God sakes
     44    document it here!)
     45 
     46    The Microsoft docs use the word "image" instead of "executable" because
     47    the former can also refer to a DLL (shared library).  Confusion can arise
     48    because the `i' in `pei' also refers to "image".  The `pe' format can
     49    also create images (i.e. executables), it's just that to run on a win32
     50    system you need to use the pei format.
     51 
     52    FIXME: Please add more docs here so the next poor fool that has to hack
     53    on this code has a chance of getting something accomplished without
     54    wasting too much time.  */
     55 
     56 /* This expands into COFF_WITH_pe, COFF_WITH_pep, or COFF_WITH_pex64
     57    depending on whether we're compiling for straight PE or PE+.  */
     58 #define COFF_WITH_XX
     59 
     60 #include "sysdep.h"
     61 #include "bfd.h"
     62 #include "libbfd.h"
     63 #include "coff/internal.h"
     64 #include "bfdver.h"
     65 #include "libiberty.h"
     66 #ifdef HAVE_WCHAR_H
     67 #include <wchar.h>
     68 #endif
     69 #ifdef HAVE_WCTYPE_H
     70 #include <wctype.h>
     71 #endif
     72 
     73 /* NOTE: it's strange to be including an architecture specific header
     74    in what's supposed to be general (to PE/PEI) code.  However, that's
     75    where the definitions are, and they don't vary per architecture
     76    within PE/PEI, so we get them from there.  FIXME: The lack of
     77    variance is an assumption which may prove to be incorrect if new
     78    PE/PEI targets are created.  */
     79 #if defined COFF_WITH_pex64
     80 # include "coff/x86_64.h"
     81 #elif defined COFF_WITH_pep
     82 # include "coff/ia64.h"
     83 #else
     84 # include "coff/i386.h"
     85 #endif
     86 
     87 #include "coff/pe.h"
     88 #include "libcoff.h"
     89 #include "libpei.h"
     90 #include "safe-ctype.h"
     91 
     92 #if defined COFF_WITH_pep || defined COFF_WITH_pex64
     93 # undef AOUTSZ
     94 # define AOUTSZ		PEPAOUTSZ
     95 # define PEAOUTHDR	PEPAOUTHDR
     96 #endif
     97 
     98 #define HighBitSet(val)      ((val) & 0x80000000)
     99 #define SetHighBit(val)      ((val) | 0x80000000)
    100 #define WithoutHighBit(val)  ((val) & 0x7fffffff)
    101 
    102 /* FIXME: This file has various tests of POWERPC_LE_PE.  Those tests
    103    worked when the code was in peicode.h, but no longer work now that
    104    the code is in peigen.c.  PowerPC NT is said to be dead.  If
    105    anybody wants to revive the code, you will have to figure out how
    106    to handle those issues.  */
    107 
    108 void
    110 _bfd_XXi_swap_sym_in (bfd * abfd, void * ext1, void * in1)
    111 {
    112   SYMENT *ext = (SYMENT *) ext1;
    113   struct internal_syment *in = (struct internal_syment *) in1;
    114 
    115   if (ext->e.e_name[0] == 0)
    116     {
    117       in->_n._n_n._n_zeroes = 0;
    118       in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e.e.e_offset);
    119     }
    120   else
    121     memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN);
    122 
    123   in->n_value = H_GET_32 (abfd, ext->e_value);
    124   in->n_scnum = (short) H_GET_16 (abfd, ext->e_scnum);
    125 
    126   if (sizeof (ext->e_type) == 2)
    127     in->n_type = H_GET_16 (abfd, ext->e_type);
    128   else
    129     in->n_type = H_GET_32 (abfd, ext->e_type);
    130 
    131   in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
    132   in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
    133 
    134 #ifndef STRICT_PE_FORMAT
    135   /* This is for Gnu-created DLLs.  */
    136 
    137   /* The section symbols for the .idata$ sections have class 0x68
    138      (C_SECTION), which MS documentation indicates is a section
    139      symbol.  Unfortunately, the value field in the symbol is simply a
    140      copy of the .idata section's flags rather than something useful.
    141      When these symbols are encountered, change the value to 0 so that
    142      they will be handled somewhat correctly in the bfd code.  */
    143   if (in->n_sclass == C_SECTION)
    144     {
    145       char namebuf[SYMNMLEN + 1];
    146       const char *name = NULL;
    147 
    148       in->n_value = 0x0;
    149 
    150       /* Create synthetic empty sections as needed.  DJ */
    151       if (in->n_scnum == 0)
    152 	{
    153 	  asection *sec;
    154 
    155 	  name = _bfd_coff_internal_syment_name (abfd, in, namebuf);
    156 	  if (name == NULL)
    157 	    {
    158 	      _bfd_error_handler (_("%pB: unable to find name for empty section"),
    159 				  abfd);
    160 	      bfd_set_error (bfd_error_invalid_target);
    161 	      return;
    162 	    }
    163 
    164 	  sec = bfd_get_section_by_name (abfd, name);
    165 	  if (sec != NULL)
    166 	    in->n_scnum = sec->target_index;
    167 	}
    168 
    169       if (in->n_scnum == 0)
    170 	{
    171 	  int unused_section_number = 0;
    172 	  asection *sec;
    173 	  flagword flags;
    174 
    175 	  for (sec = abfd->sections; sec; sec = sec->next)
    176 	    if (unused_section_number <= sec->target_index)
    177 	      unused_section_number = sec->target_index + 1;
    178 
    179 	  if (name == namebuf)
    180 	    {
    181 	      name = (const char *) bfd_alloc (abfd, strlen (namebuf) + 1);
    182 	      if (name == NULL)
    183 		{
    184 		  _bfd_error_handler (_("%pB: out of memory creating name for empty section"),
    185 				      abfd);
    186 		  return;
    187 		}
    188 	      strcpy ((char *) name, namebuf);
    189 	    }
    190 
    191 	  flags = SEC_HAS_CONTENTS | SEC_ALLOC | SEC_DATA | SEC_LOAD;
    192 	  sec = bfd_make_section_anyway_with_flags (abfd, name, flags);
    193 	  if (sec == NULL)
    194 	    {
    195 	      _bfd_error_handler (_("%pB: unable to create fake empty section"),
    196 				  abfd);
    197 	      return;
    198 	    }
    199 
    200 	  sec->vma = 0;
    201 	  sec->lma = 0;
    202 	  sec->size = 0;
    203 	  sec->filepos = 0;
    204 	  sec->rel_filepos = 0;
    205 	  sec->reloc_count = 0;
    206 	  sec->line_filepos = 0;
    207 	  sec->lineno_count = 0;
    208 	  sec->userdata = NULL;
    209 	  sec->next = NULL;
    210 	  sec->alignment_power = 2;
    211 
    212 	  sec->target_index = unused_section_number;
    213 
    214 	  in->n_scnum = unused_section_number;
    215 	}
    216       in->n_sclass = C_STAT;
    217     }
    218 #endif
    219 
    220 #ifdef coff_swap_sym_in_hook
    221   /* This won't work in peigen.c, but since it's for PPC PE, it's not
    222      worth fixing.  */
    223   coff_swap_sym_in_hook (abfd, ext1, in1);
    224 #endif
    225 }
    226 
    227 static bfd_boolean
    228 abs_finder (bfd * abfd ATTRIBUTE_UNUSED, asection * sec, void * data)
    229 {
    230   bfd_vma abs_val = * (bfd_vma *) data;
    231 
    232   return (sec->vma <= abs_val) && ((sec->vma + (1ULL << 32)) > abs_val);
    233 }
    234 
    235 unsigned int
    236 _bfd_XXi_swap_sym_out (bfd * abfd, void * inp, void * extp)
    237 {
    238   struct internal_syment *in = (struct internal_syment *) inp;
    239   SYMENT *ext = (SYMENT *) extp;
    240 
    241   if (in->_n._n_name[0] == 0)
    242     {
    243       H_PUT_32 (abfd, 0, ext->e.e.e_zeroes);
    244       H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e.e.e_offset);
    245     }
    246   else
    247     memcpy (ext->e.e_name, in->_n._n_name, SYMNMLEN);
    248 
    249   /* The PE32 and PE32+ formats only use 4 bytes to hold the value of a
    250      symbol.  This is a problem on 64-bit targets where we can generate
    251      absolute symbols with values >= 1^32.  We try to work around this
    252      problem by finding a section whose base address is sufficient to
    253      reduce the absolute value to < 1^32, and then transforming the
    254      symbol into a section relative symbol.  This of course is a hack.  */
    255   if (sizeof (in->n_value) > 4
    256       /* The strange computation of the shift amount is here in order to
    257 	 avoid a compile time warning about the comparison always being
    258 	 false.  It does not matter if this test fails to work as expected
    259 	 as the worst that can happen is that some absolute symbols are
    260 	 needlessly converted into section relative symbols.  */
    261       && in->n_value > ((1ULL << (sizeof (in->n_value) > 4 ? 32 : 31)) - 1)
    262       && in->n_scnum == N_ABS)
    263     {
    264       asection * sec;
    265 
    266       sec = bfd_sections_find_if (abfd, abs_finder, & in->n_value);
    267       if (sec)
    268 	{
    269 	  in->n_value -= sec->vma;
    270 	  in->n_scnum = sec->target_index;
    271 	}
    272       /* else: FIXME: The value is outside the range of any section.  This
    273 	 happens for __image_base__ and __ImageBase and maybe some other
    274 	 symbols as well.  We should find a way to handle these values.  */
    275     }
    276 
    277   H_PUT_32 (abfd, in->n_value, ext->e_value);
    278   H_PUT_16 (abfd, in->n_scnum, ext->e_scnum);
    279 
    280   if (sizeof (ext->e_type) == 2)
    281     H_PUT_16 (abfd, in->n_type, ext->e_type);
    282   else
    283     H_PUT_32 (abfd, in->n_type, ext->e_type);
    284 
    285   H_PUT_8 (abfd, in->n_sclass, ext->e_sclass);
    286   H_PUT_8 (abfd, in->n_numaux, ext->e_numaux);
    287 
    288   return SYMESZ;
    289 }
    290 
    291 void
    292 _bfd_XXi_swap_aux_in (bfd *	abfd,
    293 		      void *	ext1,
    294 		      int       type,
    295 		      int       in_class,
    296 		      int	indx ATTRIBUTE_UNUSED,
    297 		      int	numaux ATTRIBUTE_UNUSED,
    298 		      void *	in1)
    299 {
    300   AUXENT *ext = (AUXENT *) ext1;
    301   union internal_auxent *in = (union internal_auxent *) in1;
    302 
    303   /* PR 17521: Make sure that all fields in the aux structure
    304      are initialised.  */
    305   memset (in, 0, sizeof * in);
    306   switch (in_class)
    307     {
    308     case C_FILE:
    309       if (ext->x_file.x_fname[0] == 0)
    310 	{
    311 	  in->x_file.x_n.x_zeroes = 0;
    312 	  in->x_file.x_n.x_offset = H_GET_32 (abfd, ext->x_file.x_n.x_offset);
    313 	}
    314       else
    315 	memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
    316       return;
    317 
    318     case C_STAT:
    319     case C_LEAFSTAT:
    320     case C_HIDDEN:
    321       if (type == T_NULL)
    322 	{
    323 	  in->x_scn.x_scnlen = GET_SCN_SCNLEN (abfd, ext);
    324 	  in->x_scn.x_nreloc = GET_SCN_NRELOC (abfd, ext);
    325 	  in->x_scn.x_nlinno = GET_SCN_NLINNO (abfd, ext);
    326 	  in->x_scn.x_checksum = H_GET_32 (abfd, ext->x_scn.x_checksum);
    327 	  in->x_scn.x_associated = H_GET_16 (abfd, ext->x_scn.x_associated);
    328 	  in->x_scn.x_comdat = H_GET_8 (abfd, ext->x_scn.x_comdat);
    329 	  return;
    330 	}
    331       break;
    332     }
    333 
    334   in->x_sym.x_tagndx.l = H_GET_32 (abfd, ext->x_sym.x_tagndx);
    335   in->x_sym.x_tvndx = H_GET_16 (abfd, ext->x_sym.x_tvndx);
    336 
    337   if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
    338       || ISTAG (in_class))
    339     {
    340       in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR (abfd, ext);
    341       in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX (abfd, ext);
    342     }
    343   else
    344     {
    345       in->x_sym.x_fcnary.x_ary.x_dimen[0] =
    346 	H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
    347       in->x_sym.x_fcnary.x_ary.x_dimen[1] =
    348 	H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
    349       in->x_sym.x_fcnary.x_ary.x_dimen[2] =
    350 	H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
    351       in->x_sym.x_fcnary.x_ary.x_dimen[3] =
    352 	H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
    353     }
    354 
    355   if (ISFCN (type))
    356     {
    357       in->x_sym.x_misc.x_fsize = H_GET_32 (abfd, ext->x_sym.x_misc.x_fsize);
    358     }
    359   else
    360     {
    361       in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO (abfd, ext);
    362       in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE (abfd, ext);
    363     }
    364 }
    365 
    366 unsigned int
    367 _bfd_XXi_swap_aux_out (bfd *  abfd,
    368 		       void * inp,
    369 		       int    type,
    370 		       int    in_class,
    371 		       int    indx ATTRIBUTE_UNUSED,
    372 		       int    numaux ATTRIBUTE_UNUSED,
    373 		       void * extp)
    374 {
    375   union internal_auxent *in = (union internal_auxent *) inp;
    376   AUXENT *ext = (AUXENT *) extp;
    377 
    378   memset (ext, 0, AUXESZ);
    379 
    380   switch (in_class)
    381     {
    382     case C_FILE:
    383       if (in->x_file.x_fname[0] == 0)
    384 	{
    385 	  H_PUT_32 (abfd, 0, ext->x_file.x_n.x_zeroes);
    386 	  H_PUT_32 (abfd, in->x_file.x_n.x_offset, ext->x_file.x_n.x_offset);
    387 	}
    388       else
    389 	memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
    390 
    391       return AUXESZ;
    392 
    393     case C_STAT:
    394     case C_LEAFSTAT:
    395     case C_HIDDEN:
    396       if (type == T_NULL)
    397 	{
    398 	  PUT_SCN_SCNLEN (abfd, in->x_scn.x_scnlen, ext);
    399 	  PUT_SCN_NRELOC (abfd, in->x_scn.x_nreloc, ext);
    400 	  PUT_SCN_NLINNO (abfd, in->x_scn.x_nlinno, ext);
    401 	  H_PUT_32 (abfd, in->x_scn.x_checksum, ext->x_scn.x_checksum);
    402 	  H_PUT_16 (abfd, in->x_scn.x_associated, ext->x_scn.x_associated);
    403 	  H_PUT_8 (abfd, in->x_scn.x_comdat, ext->x_scn.x_comdat);
    404 	  return AUXESZ;
    405 	}
    406       break;
    407     }
    408 
    409   H_PUT_32 (abfd, in->x_sym.x_tagndx.l, ext->x_sym.x_tagndx);
    410   H_PUT_16 (abfd, in->x_sym.x_tvndx, ext->x_sym.x_tvndx);
    411 
    412   if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
    413       || ISTAG (in_class))
    414     {
    415       PUT_FCN_LNNOPTR (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr,  ext);
    416       PUT_FCN_ENDNDX  (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
    417     }
    418   else
    419     {
    420       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
    421 		ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
    422       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
    423 		ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
    424       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
    425 		ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
    426       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
    427 		ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
    428     }
    429 
    430   if (ISFCN (type))
    431     H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_sym.x_misc.x_fsize);
    432   else
    433     {
    434       PUT_LNSZ_LNNO (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext);
    435       PUT_LNSZ_SIZE (abfd, in->x_sym.x_misc.x_lnsz.x_size, ext);
    436     }
    437 
    438   return AUXESZ;
    439 }
    440 
    441 void
    442 _bfd_XXi_swap_lineno_in (bfd * abfd, void * ext1, void * in1)
    443 {
    444   LINENO *ext = (LINENO *) ext1;
    445   struct internal_lineno *in = (struct internal_lineno *) in1;
    446 
    447   in->l_addr.l_symndx = H_GET_32 (abfd, ext->l_addr.l_symndx);
    448   in->l_lnno = GET_LINENO_LNNO (abfd, ext);
    449 }
    450 
    451 unsigned int
    452 _bfd_XXi_swap_lineno_out (bfd * abfd, void * inp, void * outp)
    453 {
    454   struct internal_lineno *in = (struct internal_lineno *) inp;
    455   struct external_lineno *ext = (struct external_lineno *) outp;
    456   H_PUT_32 (abfd, in->l_addr.l_symndx, ext->l_addr.l_symndx);
    457 
    458   PUT_LINENO_LNNO (abfd, in->l_lnno, ext);
    459   return LINESZ;
    460 }
    461 
    462 void
    463 _bfd_XXi_swap_aouthdr_in (bfd * abfd,
    464 			  void * aouthdr_ext1,
    465 			  void * aouthdr_int1)
    466 {
    467   PEAOUTHDR * src = (PEAOUTHDR *) aouthdr_ext1;
    468   AOUTHDR * aouthdr_ext = (AOUTHDR *) aouthdr_ext1;
    469   struct internal_aouthdr *aouthdr_int
    470     = (struct internal_aouthdr *) aouthdr_int1;
    471   struct internal_extra_pe_aouthdr *a = &aouthdr_int->pe;
    472 
    473   aouthdr_int->magic = H_GET_16 (abfd, aouthdr_ext->magic);
    474   aouthdr_int->vstamp = H_GET_16 (abfd, aouthdr_ext->vstamp);
    475   aouthdr_int->tsize = GET_AOUTHDR_TSIZE (abfd, aouthdr_ext->tsize);
    476   aouthdr_int->dsize = GET_AOUTHDR_DSIZE (abfd, aouthdr_ext->dsize);
    477   aouthdr_int->bsize = GET_AOUTHDR_BSIZE (abfd, aouthdr_ext->bsize);
    478   aouthdr_int->entry = GET_AOUTHDR_ENTRY (abfd, aouthdr_ext->entry);
    479   aouthdr_int->text_start =
    480     GET_AOUTHDR_TEXT_START (abfd, aouthdr_ext->text_start);
    481 
    482 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
    483   /* PE32+ does not have data_start member!  */
    484   aouthdr_int->data_start =
    485     GET_AOUTHDR_DATA_START (abfd, aouthdr_ext->data_start);
    486   a->BaseOfData = aouthdr_int->data_start;
    487 #endif
    488 
    489   a->Magic = aouthdr_int->magic;
    490   a->MajorLinkerVersion = H_GET_8 (abfd, aouthdr_ext->vstamp);
    491   a->MinorLinkerVersion = H_GET_8 (abfd, aouthdr_ext->vstamp + 1);
    492   a->SizeOfCode = aouthdr_int->tsize ;
    493   a->SizeOfInitializedData = aouthdr_int->dsize ;
    494   a->SizeOfUninitializedData = aouthdr_int->bsize ;
    495   a->AddressOfEntryPoint = aouthdr_int->entry;
    496   a->BaseOfCode = aouthdr_int->text_start;
    497   a->ImageBase = GET_OPTHDR_IMAGE_BASE (abfd, src->ImageBase);
    498   a->SectionAlignment = H_GET_32 (abfd, src->SectionAlignment);
    499   a->FileAlignment = H_GET_32 (abfd, src->FileAlignment);
    500   a->MajorOperatingSystemVersion =
    501     H_GET_16 (abfd, src->MajorOperatingSystemVersion);
    502   a->MinorOperatingSystemVersion =
    503     H_GET_16 (abfd, src->MinorOperatingSystemVersion);
    504   a->MajorImageVersion = H_GET_16 (abfd, src->MajorImageVersion);
    505   a->MinorImageVersion = H_GET_16 (abfd, src->MinorImageVersion);
    506   a->MajorSubsystemVersion = H_GET_16 (abfd, src->MajorSubsystemVersion);
    507   a->MinorSubsystemVersion = H_GET_16 (abfd, src->MinorSubsystemVersion);
    508   a->Reserved1 = H_GET_32 (abfd, src->Reserved1);
    509   a->SizeOfImage = H_GET_32 (abfd, src->SizeOfImage);
    510   a->SizeOfHeaders = H_GET_32 (abfd, src->SizeOfHeaders);
    511   a->CheckSum = H_GET_32 (abfd, src->CheckSum);
    512   a->Subsystem = H_GET_16 (abfd, src->Subsystem);
    513   a->DllCharacteristics = H_GET_16 (abfd, src->DllCharacteristics);
    514   a->SizeOfStackReserve =
    515     GET_OPTHDR_SIZE_OF_STACK_RESERVE (abfd, src->SizeOfStackReserve);
    516   a->SizeOfStackCommit =
    517     GET_OPTHDR_SIZE_OF_STACK_COMMIT (abfd, src->SizeOfStackCommit);
    518   a->SizeOfHeapReserve =
    519     GET_OPTHDR_SIZE_OF_HEAP_RESERVE (abfd, src->SizeOfHeapReserve);
    520   a->SizeOfHeapCommit =
    521     GET_OPTHDR_SIZE_OF_HEAP_COMMIT (abfd, src->SizeOfHeapCommit);
    522   a->LoaderFlags = H_GET_32 (abfd, src->LoaderFlags);
    523   a->NumberOfRvaAndSizes = H_GET_32 (abfd, src->NumberOfRvaAndSizes);
    524 
    525   {
    526     int idx;
    527 
    528     /* PR 17512: Corrupt PE binaries can cause seg-faults.  */
    529     if (a->NumberOfRvaAndSizes > IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
    530       {
    531 	/* xgettext:c-format */
    532 	_bfd_error_handler
    533 	  (_("%pB: aout header specifies an invalid number of data-directory entries: %ld"),
    534 	   abfd, a->NumberOfRvaAndSizes);
    535 	bfd_set_error (bfd_error_bad_value);
    536 
    537 	/* Paranoia: If the number is corrupt, then assume that the
    538 	   actual entries themselves might be corrupt as well.  */
    539 	a->NumberOfRvaAndSizes = 0;
    540       }
    541 
    542     for (idx = 0; idx < a->NumberOfRvaAndSizes; idx++)
    543       {
    544 	/* If data directory is empty, rva also should be 0.  */
    545 	int size =
    546 	  H_GET_32 (abfd, src->DataDirectory[idx][1]);
    547 
    548 	a->DataDirectory[idx].Size = size;
    549 
    550 	if (size)
    551 	  a->DataDirectory[idx].VirtualAddress =
    552 	    H_GET_32 (abfd, src->DataDirectory[idx][0]);
    553 	else
    554 	  a->DataDirectory[idx].VirtualAddress = 0;
    555       }
    556 
    557     while (idx < IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
    558       {
    559 	a->DataDirectory[idx].Size = 0;
    560 	a->DataDirectory[idx].VirtualAddress = 0;
    561 	idx ++;
    562       }
    563   }
    564 
    565   if (aouthdr_int->entry)
    566     {
    567       aouthdr_int->entry += a->ImageBase;
    568 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
    569       aouthdr_int->entry &= 0xffffffff;
    570 #endif
    571     }
    572 
    573   if (aouthdr_int->tsize)
    574     {
    575       aouthdr_int->text_start += a->ImageBase;
    576 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
    577       aouthdr_int->text_start &= 0xffffffff;
    578 #endif
    579     }
    580 
    581 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
    582   /* PE32+ does not have data_start member!  */
    583   if (aouthdr_int->dsize)
    584     {
    585       aouthdr_int->data_start += a->ImageBase;
    586       aouthdr_int->data_start &= 0xffffffff;
    587     }
    588 #endif
    589 
    590 #ifdef POWERPC_LE_PE
    591   /* These three fields are normally set up by ppc_relocate_section.
    592      In the case of reading a file in, we can pick them up from the
    593      DataDirectory.  */
    594   first_thunk_address = a->DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress;
    595   thunk_size = a->DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size;
    596   import_table_size = a->DataDirectory[PE_IMPORT_TABLE].Size;
    597 #endif
    598 }
    599 
    600 /* A support function for below.  */
    601 
    602 static void
    603 add_data_entry (bfd * abfd,
    604 		struct internal_extra_pe_aouthdr *aout,
    605 		int idx,
    606 		char *name,
    607 		bfd_vma base)
    608 {
    609   asection *sec = bfd_get_section_by_name (abfd, name);
    610 
    611   /* Add import directory information if it exists.  */
    612   if ((sec != NULL)
    613       && (coff_section_data (abfd, sec) != NULL)
    614       && (pei_section_data (abfd, sec) != NULL))
    615     {
    616       /* If data directory is empty, rva also should be 0.  */
    617       int size = pei_section_data (abfd, sec)->virt_size;
    618       aout->DataDirectory[idx].Size = size;
    619 
    620       if (size)
    621 	{
    622 	  aout->DataDirectory[idx].VirtualAddress =
    623 	    (sec->vma - base) & 0xffffffff;
    624 	  sec->flags |= SEC_DATA;
    625 	}
    626     }
    627 }
    628 
    629 unsigned int
    630 _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out)
    631 {
    632   struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *) in;
    633   pe_data_type *pe = pe_data (abfd);
    634   struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
    635   PEAOUTHDR *aouthdr_out = (PEAOUTHDR *) out;
    636   bfd_vma sa, fa, ib;
    637   IMAGE_DATA_DIRECTORY idata2, idata5, tls;
    638 
    639   sa = extra->SectionAlignment;
    640   fa = extra->FileAlignment;
    641   ib = extra->ImageBase;
    642 
    643   idata2 = pe->pe_opthdr.DataDirectory[PE_IMPORT_TABLE];
    644   idata5 = pe->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE];
    645   tls = pe->pe_opthdr.DataDirectory[PE_TLS_TABLE];
    646 
    647   if (aouthdr_in->tsize)
    648     {
    649       aouthdr_in->text_start -= ib;
    650 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
    651       aouthdr_in->text_start &= 0xffffffff;
    652 #endif
    653     }
    654 
    655   if (aouthdr_in->dsize)
    656     {
    657       aouthdr_in->data_start -= ib;
    658 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
    659       aouthdr_in->data_start &= 0xffffffff;
    660 #endif
    661     }
    662 
    663   if (aouthdr_in->entry)
    664     {
    665       aouthdr_in->entry -= ib;
    666 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
    667       aouthdr_in->entry &= 0xffffffff;
    668 #endif
    669     }
    670 
    671 #define FA(x) (((x) + fa -1 ) & (- fa))
    672 #define SA(x) (((x) + sa -1 ) & (- sa))
    673 
    674   /* We like to have the sizes aligned.  */
    675   aouthdr_in->bsize = FA (aouthdr_in->bsize);
    676 
    677   extra->NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
    678 
    679   add_data_entry (abfd, extra, PE_EXPORT_TABLE, ".edata", ib);
    680   add_data_entry (abfd, extra, PE_RESOURCE_TABLE, ".rsrc", ib);
    681   add_data_entry (abfd, extra, PE_EXCEPTION_TABLE, ".pdata", ib);
    682 
    683   /* In theory we do not need to call add_data_entry for .idata$2 or
    684      .idata$5.  It will be done in bfd_coff_final_link where all the
    685      required information is available.  If however, we are not going
    686      to perform a final link, eg because we have been invoked by objcopy
    687      or strip, then we need to make sure that these Data Directory
    688      entries are initialised properly.
    689 
    690      So - we copy the input values into the output values, and then, if
    691      a final link is going to be performed, it can overwrite them.  */
    692   extra->DataDirectory[PE_IMPORT_TABLE]  = idata2;
    693   extra->DataDirectory[PE_IMPORT_ADDRESS_TABLE] = idata5;
    694   extra->DataDirectory[PE_TLS_TABLE] = tls;
    695 
    696   if (extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress == 0)
    697     /* Until other .idata fixes are made (pending patch), the entry for
    698        .idata is needed for backwards compatibility.  FIXME.  */
    699     add_data_entry (abfd, extra, PE_IMPORT_TABLE, ".idata", ib);
    700 
    701   /* For some reason, the virtual size (which is what's set by
    702      add_data_entry) for .reloc is not the same as the size recorded
    703      in this slot by MSVC; it doesn't seem to cause problems (so far),
    704      but since it's the best we've got, use it.  It does do the right
    705      thing for .pdata.  */
    706   if (pe->has_reloc_section)
    707     add_data_entry (abfd, extra, PE_BASE_RELOCATION_TABLE, ".reloc", ib);
    708 
    709   {
    710     asection *sec;
    711     bfd_vma hsize = 0;
    712     bfd_vma dsize = 0;
    713     bfd_vma isize = 0;
    714     bfd_vma tsize = 0;
    715 
    716     for (sec = abfd->sections; sec; sec = sec->next)
    717       {
    718 	int rounded = FA (sec->size);
    719 
    720 	/* The first non-zero section filepos is the header size.
    721 	   Sections without contents will have a filepos of 0.  */
    722 	if (hsize == 0)
    723 	  hsize = sec->filepos;
    724 	if (sec->flags & SEC_DATA)
    725 	  dsize += rounded;
    726 	if (sec->flags & SEC_CODE)
    727 	  tsize += rounded;
    728 	/* The image size is the total VIRTUAL size (which is what is
    729 	   in the virt_size field).  Files have been seen (from MSVC
    730 	   5.0 link.exe) where the file size of the .data segment is
    731 	   quite small compared to the virtual size.  Without this
    732 	   fix, strip munges the file.
    733 
    734 	   FIXME: We need to handle holes between sections, which may
    735 	   happpen when we covert from another format.  We just use
    736 	   the virtual address and virtual size of the last section
    737 	   for the image size.  */
    738 	if (coff_section_data (abfd, sec) != NULL
    739 	    && pei_section_data (abfd, sec) != NULL)
    740 	  isize = (sec->vma - extra->ImageBase
    741 		   + SA (FA (pei_section_data (abfd, sec)->virt_size)));
    742       }
    743 
    744     aouthdr_in->dsize = dsize;
    745     aouthdr_in->tsize = tsize;
    746     extra->SizeOfHeaders = hsize;
    747     extra->SizeOfImage = isize;
    748   }
    749 
    750   H_PUT_16 (abfd, aouthdr_in->magic, aouthdr_out->standard.magic);
    751 
    752 /* e.g. 219510000 is linker version 2.19  */
    753 #define LINKER_VERSION ((short) (BFD_VERSION / 1000000))
    754 
    755   /* This piece of magic sets the "linker version" field to
    756      LINKER_VERSION.  */
    757   H_PUT_16 (abfd, (LINKER_VERSION / 100 + (LINKER_VERSION % 100) * 256),
    758 	    aouthdr_out->standard.vstamp);
    759 
    760   PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, aouthdr_out->standard.tsize);
    761   PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, aouthdr_out->standard.dsize);
    762   PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, aouthdr_out->standard.bsize);
    763   PUT_AOUTHDR_ENTRY (abfd, aouthdr_in->entry, aouthdr_out->standard.entry);
    764   PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start,
    765 			  aouthdr_out->standard.text_start);
    766 
    767 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
    768   /* PE32+ does not have data_start member!  */
    769   PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
    770 			  aouthdr_out->standard.data_start);
    771 #endif
    772 
    773   PUT_OPTHDR_IMAGE_BASE (abfd, extra->ImageBase, aouthdr_out->ImageBase);
    774   H_PUT_32 (abfd, extra->SectionAlignment, aouthdr_out->SectionAlignment);
    775   H_PUT_32 (abfd, extra->FileAlignment, aouthdr_out->FileAlignment);
    776   H_PUT_16 (abfd, extra->MajorOperatingSystemVersion,
    777 	    aouthdr_out->MajorOperatingSystemVersion);
    778   H_PUT_16 (abfd, extra->MinorOperatingSystemVersion,
    779 	    aouthdr_out->MinorOperatingSystemVersion);
    780   H_PUT_16 (abfd, extra->MajorImageVersion, aouthdr_out->MajorImageVersion);
    781   H_PUT_16 (abfd, extra->MinorImageVersion, aouthdr_out->MinorImageVersion);
    782   H_PUT_16 (abfd, extra->MajorSubsystemVersion,
    783 	    aouthdr_out->MajorSubsystemVersion);
    784   H_PUT_16 (abfd, extra->MinorSubsystemVersion,
    785 	    aouthdr_out->MinorSubsystemVersion);
    786   H_PUT_32 (abfd, extra->Reserved1, aouthdr_out->Reserved1);
    787   H_PUT_32 (abfd, extra->SizeOfImage, aouthdr_out->SizeOfImage);
    788   H_PUT_32 (abfd, extra->SizeOfHeaders, aouthdr_out->SizeOfHeaders);
    789   H_PUT_32 (abfd, extra->CheckSum, aouthdr_out->CheckSum);
    790   H_PUT_16 (abfd, extra->Subsystem, aouthdr_out->Subsystem);
    791   H_PUT_16 (abfd, extra->DllCharacteristics, aouthdr_out->DllCharacteristics);
    792   PUT_OPTHDR_SIZE_OF_STACK_RESERVE (abfd, extra->SizeOfStackReserve,
    793 				    aouthdr_out->SizeOfStackReserve);
    794   PUT_OPTHDR_SIZE_OF_STACK_COMMIT (abfd, extra->SizeOfStackCommit,
    795 				   aouthdr_out->SizeOfStackCommit);
    796   PUT_OPTHDR_SIZE_OF_HEAP_RESERVE (abfd, extra->SizeOfHeapReserve,
    797 				   aouthdr_out->SizeOfHeapReserve);
    798   PUT_OPTHDR_SIZE_OF_HEAP_COMMIT (abfd, extra->SizeOfHeapCommit,
    799 				  aouthdr_out->SizeOfHeapCommit);
    800   H_PUT_32 (abfd, extra->LoaderFlags, aouthdr_out->LoaderFlags);
    801   H_PUT_32 (abfd, extra->NumberOfRvaAndSizes,
    802 	    aouthdr_out->NumberOfRvaAndSizes);
    803   {
    804     int idx;
    805 
    806     for (idx = 0; idx < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; idx++)
    807       {
    808 	H_PUT_32 (abfd, extra->DataDirectory[idx].VirtualAddress,
    809 		  aouthdr_out->DataDirectory[idx][0]);
    810 	H_PUT_32 (abfd, extra->DataDirectory[idx].Size,
    811 		  aouthdr_out->DataDirectory[idx][1]);
    812       }
    813   }
    814 
    815   return AOUTSZ;
    816 }
    817 
    818 unsigned int
    819 _bfd_XXi_only_swap_filehdr_out (bfd * abfd, void * in, void * out)
    820 {
    821   int idx;
    822   struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
    823   struct external_PEI_filehdr *filehdr_out = (struct external_PEI_filehdr *) out;
    824 
    825   if (pe_data (abfd)->has_reloc_section
    826       || pe_data (abfd)->dont_strip_reloc)
    827     filehdr_in->f_flags &= ~F_RELFLG;
    828 
    829   if (pe_data (abfd)->dll)
    830     filehdr_in->f_flags |= F_DLL;
    831 
    832   filehdr_in->pe.e_magic    = IMAGE_DOS_SIGNATURE;
    833   filehdr_in->pe.e_cblp     = 0x90;
    834   filehdr_in->pe.e_cp       = 0x3;
    835   filehdr_in->pe.e_crlc     = 0x0;
    836   filehdr_in->pe.e_cparhdr  = 0x4;
    837   filehdr_in->pe.e_minalloc = 0x0;
    838   filehdr_in->pe.e_maxalloc = 0xffff;
    839   filehdr_in->pe.e_ss       = 0x0;
    840   filehdr_in->pe.e_sp       = 0xb8;
    841   filehdr_in->pe.e_csum     = 0x0;
    842   filehdr_in->pe.e_ip       = 0x0;
    843   filehdr_in->pe.e_cs       = 0x0;
    844   filehdr_in->pe.e_lfarlc   = 0x40;
    845   filehdr_in->pe.e_ovno     = 0x0;
    846 
    847   for (idx = 0; idx < 4; idx++)
    848     filehdr_in->pe.e_res[idx] = 0x0;
    849 
    850   filehdr_in->pe.e_oemid   = 0x0;
    851   filehdr_in->pe.e_oeminfo = 0x0;
    852 
    853   for (idx = 0; idx < 10; idx++)
    854     filehdr_in->pe.e_res2[idx] = 0x0;
    855 
    856   filehdr_in->pe.e_lfanew = 0x80;
    857 
    858   /* This next collection of data are mostly just characters.  It
    859      appears to be constant within the headers put on NT exes.  */
    860   filehdr_in->pe.dos_message[0]  = 0x0eba1f0e;
    861   filehdr_in->pe.dos_message[1]  = 0xcd09b400;
    862   filehdr_in->pe.dos_message[2]  = 0x4c01b821;
    863   filehdr_in->pe.dos_message[3]  = 0x685421cd;
    864   filehdr_in->pe.dos_message[4]  = 0x70207369;
    865   filehdr_in->pe.dos_message[5]  = 0x72676f72;
    866   filehdr_in->pe.dos_message[6]  = 0x63206d61;
    867   filehdr_in->pe.dos_message[7]  = 0x6f6e6e61;
    868   filehdr_in->pe.dos_message[8]  = 0x65622074;
    869   filehdr_in->pe.dos_message[9]  = 0x6e757220;
    870   filehdr_in->pe.dos_message[10] = 0x206e6920;
    871   filehdr_in->pe.dos_message[11] = 0x20534f44;
    872   filehdr_in->pe.dos_message[12] = 0x65646f6d;
    873   filehdr_in->pe.dos_message[13] = 0x0a0d0d2e;
    874   filehdr_in->pe.dos_message[14] = 0x24;
    875   filehdr_in->pe.dos_message[15] = 0x0;
    876   filehdr_in->pe.nt_signature = IMAGE_NT_SIGNATURE;
    877 
    878   H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->f_magic);
    879   H_PUT_16 (abfd, filehdr_in->f_nscns, filehdr_out->f_nscns);
    880 
    881   /* Use a real timestamp by default, unless the no-insert-timestamp
    882      option was chosen.  */
    883   if ((pe_data (abfd)->insert_timestamp))
    884     H_PUT_32 (abfd, time (0), filehdr_out->f_timdat);
    885   else
    886     H_PUT_32 (abfd, 0, filehdr_out->f_timdat);
    887 
    888   PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr,
    889 		      filehdr_out->f_symptr);
    890   H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->f_nsyms);
    891   H_PUT_16 (abfd, filehdr_in->f_opthdr, filehdr_out->f_opthdr);
    892   H_PUT_16 (abfd, filehdr_in->f_flags, filehdr_out->f_flags);
    893 
    894   /* Put in extra dos header stuff.  This data remains essentially
    895      constant, it just has to be tacked on to the beginning of all exes
    896      for NT.  */
    897   H_PUT_16 (abfd, filehdr_in->pe.e_magic, filehdr_out->e_magic);
    898   H_PUT_16 (abfd, filehdr_in->pe.e_cblp, filehdr_out->e_cblp);
    899   H_PUT_16 (abfd, filehdr_in->pe.e_cp, filehdr_out->e_cp);
    900   H_PUT_16 (abfd, filehdr_in->pe.e_crlc, filehdr_out->e_crlc);
    901   H_PUT_16 (abfd, filehdr_in->pe.e_cparhdr, filehdr_out->e_cparhdr);
    902   H_PUT_16 (abfd, filehdr_in->pe.e_minalloc, filehdr_out->e_minalloc);
    903   H_PUT_16 (abfd, filehdr_in->pe.e_maxalloc, filehdr_out->e_maxalloc);
    904   H_PUT_16 (abfd, filehdr_in->pe.e_ss, filehdr_out->e_ss);
    905   H_PUT_16 (abfd, filehdr_in->pe.e_sp, filehdr_out->e_sp);
    906   H_PUT_16 (abfd, filehdr_in->pe.e_csum, filehdr_out->e_csum);
    907   H_PUT_16 (abfd, filehdr_in->pe.e_ip, filehdr_out->e_ip);
    908   H_PUT_16 (abfd, filehdr_in->pe.e_cs, filehdr_out->e_cs);
    909   H_PUT_16 (abfd, filehdr_in->pe.e_lfarlc, filehdr_out->e_lfarlc);
    910   H_PUT_16 (abfd, filehdr_in->pe.e_ovno, filehdr_out->e_ovno);
    911 
    912   for (idx = 0; idx < 4; idx++)
    913     H_PUT_16 (abfd, filehdr_in->pe.e_res[idx], filehdr_out->e_res[idx]);
    914 
    915   H_PUT_16 (abfd, filehdr_in->pe.e_oemid, filehdr_out->e_oemid);
    916   H_PUT_16 (abfd, filehdr_in->pe.e_oeminfo, filehdr_out->e_oeminfo);
    917 
    918   for (idx = 0; idx < 10; idx++)
    919     H_PUT_16 (abfd, filehdr_in->pe.e_res2[idx], filehdr_out->e_res2[idx]);
    920 
    921   H_PUT_32 (abfd, filehdr_in->pe.e_lfanew, filehdr_out->e_lfanew);
    922 
    923   for (idx = 0; idx < 16; idx++)
    924     H_PUT_32 (abfd, filehdr_in->pe.dos_message[idx],
    925 	      filehdr_out->dos_message[idx]);
    926 
    927   /* Also put in the NT signature.  */
    928   H_PUT_32 (abfd, filehdr_in->pe.nt_signature, filehdr_out->nt_signature);
    929 
    930   return FILHSZ;
    931 }
    932 
    933 unsigned int
    934 _bfd_XX_only_swap_filehdr_out (bfd * abfd, void * in, void * out)
    935 {
    936   struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
    937   FILHDR *filehdr_out = (FILHDR *) out;
    938 
    939   H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->f_magic);
    940   H_PUT_16 (abfd, filehdr_in->f_nscns, filehdr_out->f_nscns);
    941   H_PUT_32 (abfd, filehdr_in->f_timdat, filehdr_out->f_timdat);
    942   PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr, filehdr_out->f_symptr);
    943   H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->f_nsyms);
    944   H_PUT_16 (abfd, filehdr_in->f_opthdr, filehdr_out->f_opthdr);
    945   H_PUT_16 (abfd, filehdr_in->f_flags, filehdr_out->f_flags);
    946 
    947   return FILHSZ;
    948 }
    949 
    950 unsigned int
    951 _bfd_XXi_swap_scnhdr_out (bfd * abfd, void * in, void * out)
    952 {
    953   struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
    954   SCNHDR *scnhdr_ext = (SCNHDR *) out;
    955   unsigned int ret = SCNHSZ;
    956   bfd_vma ps;
    957   bfd_vma ss;
    958 
    959   memcpy (scnhdr_ext->s_name, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
    960 
    961   PUT_SCNHDR_VADDR (abfd,
    962 		    ((scnhdr_int->s_vaddr
    963 		      - pe_data (abfd)->pe_opthdr.ImageBase)
    964 		     & 0xffffffff),
    965 		    scnhdr_ext->s_vaddr);
    966 
    967   /* NT wants the size data to be rounded up to the next
    968      NT_FILE_ALIGNMENT, but zero if it has no content (as in .bss,
    969      sometimes).  */
    970   if ((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0)
    971     {
    972       if (bfd_pei_p (abfd))
    973 	{
    974 	  ps = scnhdr_int->s_size;
    975 	  ss = 0;
    976 	}
    977       else
    978        {
    979 	 ps = 0;
    980 	 ss = scnhdr_int->s_size;
    981        }
    982     }
    983   else
    984     {
    985       if (bfd_pei_p (abfd))
    986 	ps = scnhdr_int->s_paddr;
    987       else
    988 	ps = 0;
    989 
    990       ss = scnhdr_int->s_size;
    991     }
    992 
    993   PUT_SCNHDR_SIZE (abfd, ss,
    994 		   scnhdr_ext->s_size);
    995 
    996   /* s_paddr in PE is really the virtual size.  */
    997   PUT_SCNHDR_PADDR (abfd, ps, scnhdr_ext->s_paddr);
    998 
    999   PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr,
   1000 		     scnhdr_ext->s_scnptr);
   1001   PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr,
   1002 		     scnhdr_ext->s_relptr);
   1003   PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr,
   1004 		      scnhdr_ext->s_lnnoptr);
   1005 
   1006   {
   1007     /* Extra flags must be set when dealing with PE.  All sections should also
   1008        have the IMAGE_SCN_MEM_READ (0x40000000) flag set.  In addition, the
   1009        .text section must have IMAGE_SCN_MEM_EXECUTE (0x20000000) and the data
   1010        sections (.idata, .data, .bss, .CRT) must have IMAGE_SCN_MEM_WRITE set
   1011        (this is especially important when dealing with the .idata section since
   1012        the addresses for routines from .dlls must be overwritten).  If .reloc
   1013        section data is ever generated, we must add IMAGE_SCN_MEM_DISCARDABLE
   1014        (0x02000000).  Also, the resource data should also be read and
   1015        writable.  */
   1016 
   1017     /* FIXME: Alignment is also encoded in this field, at least on PPC and
   1018        ARM-WINCE.  Although - how do we get the original alignment field
   1019        back ?  */
   1020 
   1021     typedef struct
   1022     {
   1023       char section_name[SCNNMLEN];
   1024       unsigned long	must_have;
   1025     }
   1026     pe_required_section_flags;
   1027 
   1028     pe_required_section_flags known_sections [] =
   1029       {
   1030 	{ ".arch",  IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_ALIGN_8BYTES },
   1031 	{ ".bss",   IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
   1032 	{ ".data",  IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
   1033 	{ ".edata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
   1034 	{ ".idata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
   1035 	{ ".pdata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
   1036 	{ ".rdata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
   1037 	{ ".reloc", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE },
   1038 	{ ".rsrc",  IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
   1039 	{ ".text" , IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE },
   1040 	{ ".tls",   IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
   1041 	{ ".xdata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
   1042       };
   1043 
   1044     pe_required_section_flags * p;
   1045 
   1046     /* We have defaulted to adding the IMAGE_SCN_MEM_WRITE flag, but now
   1047        we know exactly what this specific section wants so we remove it
   1048        and then allow the must_have field to add it back in if necessary.
   1049        However, we don't remove IMAGE_SCN_MEM_WRITE flag from .text if the
   1050        default WP_TEXT file flag has been cleared.  WP_TEXT may be cleared
   1051        by ld --enable-auto-import (if auto-import is actually needed),
   1052        by ld --omagic, or by obcopy --writable-text.  */
   1053 
   1054     for (p = known_sections;
   1055 	 p < known_sections + ARRAY_SIZE (known_sections);
   1056 	 p++)
   1057       if (memcmp (scnhdr_int->s_name, p->section_name, SCNNMLEN) == 0)
   1058 	{
   1059 	  if (memcmp (scnhdr_int->s_name, ".text", sizeof ".text")
   1060 	      || (bfd_get_file_flags (abfd) & WP_TEXT))
   1061 	    scnhdr_int->s_flags &= ~IMAGE_SCN_MEM_WRITE;
   1062 	  scnhdr_int->s_flags |= p->must_have;
   1063 	  break;
   1064 	}
   1065 
   1066     H_PUT_32 (abfd, scnhdr_int->s_flags, scnhdr_ext->s_flags);
   1067   }
   1068 
   1069   if (coff_data (abfd)->link_info
   1070       && ! bfd_link_relocatable (coff_data (abfd)->link_info)
   1071       && ! bfd_link_pic (coff_data (abfd)->link_info)
   1072       && memcmp (scnhdr_int->s_name, ".text", sizeof ".text") == 0)
   1073     {
   1074       /* By inference from looking at MS output, the 32 bit field
   1075 	 which is the combination of the number_of_relocs and
   1076 	 number_of_linenos is used for the line number count in
   1077 	 executables.  A 16-bit field won't do for cc1.  The MS
   1078 	 document says that the number of relocs is zero for
   1079 	 executables, but the 17-th bit has been observed to be there.
   1080 	 Overflow is not an issue: a 4G-line program will overflow a
   1081 	 bunch of other fields long before this!  */
   1082       H_PUT_16 (abfd, (scnhdr_int->s_nlnno & 0xffff), scnhdr_ext->s_nlnno);
   1083       H_PUT_16 (abfd, (scnhdr_int->s_nlnno >> 16), scnhdr_ext->s_nreloc);
   1084     }
   1085   else
   1086     {
   1087       if (scnhdr_int->s_nlnno <= 0xffff)
   1088 	H_PUT_16 (abfd, scnhdr_int->s_nlnno, scnhdr_ext->s_nlnno);
   1089       else
   1090 	{
   1091 	  /* xgettext:c-format */
   1092 	  _bfd_error_handler (_("%pB: line number overflow: 0x%lx > 0xffff"),
   1093 			      abfd, scnhdr_int->s_nlnno);
   1094 	  bfd_set_error (bfd_error_file_truncated);
   1095 	  H_PUT_16 (abfd, 0xffff, scnhdr_ext->s_nlnno);
   1096 	  ret = 0;
   1097 	}
   1098 
   1099       /* Although we could encode 0xffff relocs here, we do not, to be
   1100 	 consistent with other parts of bfd. Also it lets us warn, as
   1101 	 we should never see 0xffff here w/o having the overflow flag
   1102 	 set.  */
   1103       if (scnhdr_int->s_nreloc < 0xffff)
   1104 	H_PUT_16 (abfd, scnhdr_int->s_nreloc, scnhdr_ext->s_nreloc);
   1105       else
   1106 	{
   1107 	  /* PE can deal with large #s of relocs, but not here.  */
   1108 	  H_PUT_16 (abfd, 0xffff, scnhdr_ext->s_nreloc);
   1109 	  scnhdr_int->s_flags |= IMAGE_SCN_LNK_NRELOC_OVFL;
   1110 	  H_PUT_32 (abfd, scnhdr_int->s_flags, scnhdr_ext->s_flags);
   1111 	}
   1112     }
   1113   return ret;
   1114 }
   1115 
   1116 void
   1117 _bfd_XXi_swap_debugdir_in (bfd * abfd, void * ext1, void * in1)
   1118 {
   1119   struct external_IMAGE_DEBUG_DIRECTORY *ext = (struct external_IMAGE_DEBUG_DIRECTORY *) ext1;
   1120   struct internal_IMAGE_DEBUG_DIRECTORY *in = (struct internal_IMAGE_DEBUG_DIRECTORY *) in1;
   1121 
   1122   in->Characteristics = H_GET_32(abfd, ext->Characteristics);
   1123   in->TimeDateStamp = H_GET_32(abfd, ext->TimeDateStamp);
   1124   in->MajorVersion = H_GET_16(abfd, ext->MajorVersion);
   1125   in->MinorVersion = H_GET_16(abfd, ext->MinorVersion);
   1126   in->Type = H_GET_32(abfd, ext->Type);
   1127   in->SizeOfData = H_GET_32(abfd, ext->SizeOfData);
   1128   in->AddressOfRawData = H_GET_32(abfd, ext->AddressOfRawData);
   1129   in->PointerToRawData = H_GET_32(abfd, ext->PointerToRawData);
   1130 }
   1131 
   1132 unsigned int
   1133 _bfd_XXi_swap_debugdir_out (bfd * abfd, void * inp, void * extp)
   1134 {
   1135   struct external_IMAGE_DEBUG_DIRECTORY *ext = (struct external_IMAGE_DEBUG_DIRECTORY *) extp;
   1136   struct internal_IMAGE_DEBUG_DIRECTORY *in = (struct internal_IMAGE_DEBUG_DIRECTORY *) inp;
   1137 
   1138   H_PUT_32(abfd, in->Characteristics, ext->Characteristics);
   1139   H_PUT_32(abfd, in->TimeDateStamp, ext->TimeDateStamp);
   1140   H_PUT_16(abfd, in->MajorVersion, ext->MajorVersion);
   1141   H_PUT_16(abfd, in->MinorVersion, ext->MinorVersion);
   1142   H_PUT_32(abfd, in->Type, ext->Type);
   1143   H_PUT_32(abfd, in->SizeOfData, ext->SizeOfData);
   1144   H_PUT_32(abfd, in->AddressOfRawData, ext->AddressOfRawData);
   1145   H_PUT_32(abfd, in->PointerToRawData, ext->PointerToRawData);
   1146 
   1147   return sizeof (struct external_IMAGE_DEBUG_DIRECTORY);
   1148 }
   1149 
   1150 CODEVIEW_INFO *
   1151 _bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length, CODEVIEW_INFO *cvinfo)
   1152 {
   1153   char buffer[256+1];
   1154 
   1155   if (bfd_seek (abfd, where, SEEK_SET) != 0)
   1156     return NULL;
   1157 
   1158   if (bfd_bread (buffer, 256, abfd) < 4)
   1159     return NULL;
   1160 
   1161   /* Ensure null termination of filename.  */
   1162   buffer[256] = '\0';
   1163 
   1164   cvinfo->CVSignature = H_GET_32 (abfd, buffer);
   1165   cvinfo->Age = 0;
   1166 
   1167   if ((cvinfo->CVSignature == CVINFO_PDB70_CVSIGNATURE)
   1168       && (length > sizeof (CV_INFO_PDB70)))
   1169     {
   1170       CV_INFO_PDB70 *cvinfo70 = (CV_INFO_PDB70 *)(buffer);
   1171 
   1172       cvinfo->Age = H_GET_32(abfd, cvinfo70->Age);
   1173 
   1174       /* A GUID consists of 4,2,2 byte values in little-endian order, followed
   1175 	 by 8 single bytes.  Byte swap them so we can conveniently treat the GUID
   1176 	 as 16 bytes in big-endian order.  */
   1177       bfd_putb32 (bfd_getl32 (cvinfo70->Signature), cvinfo->Signature);
   1178       bfd_putb16 (bfd_getl16 (&(cvinfo70->Signature[4])), &(cvinfo->Signature[4]));
   1179       bfd_putb16 (bfd_getl16 (&(cvinfo70->Signature[6])), &(cvinfo->Signature[6]));
   1180       memcpy (&(cvinfo->Signature[8]), &(cvinfo70->Signature[8]), 8);
   1181 
   1182       cvinfo->SignatureLength = CV_INFO_SIGNATURE_LENGTH;
   1183       // cvinfo->PdbFileName = cvinfo70->PdbFileName;
   1184 
   1185       return cvinfo;
   1186     }
   1187   else if ((cvinfo->CVSignature == CVINFO_PDB20_CVSIGNATURE)
   1188 	   && (length > sizeof (CV_INFO_PDB20)))
   1189     {
   1190       CV_INFO_PDB20 *cvinfo20 = (CV_INFO_PDB20 *)(buffer);
   1191       cvinfo->Age = H_GET_32(abfd, cvinfo20->Age);
   1192       memcpy (cvinfo->Signature, cvinfo20->Signature, 4);
   1193       cvinfo->SignatureLength = 4;
   1194       // cvinfo->PdbFileName = cvinfo20->PdbFileName;
   1195 
   1196       return cvinfo;
   1197     }
   1198 
   1199   return NULL;
   1200 }
   1201 
   1202 unsigned int
   1203 _bfd_XXi_write_codeview_record (bfd * abfd, file_ptr where, CODEVIEW_INFO *cvinfo)
   1204 {
   1205   const bfd_size_type size = sizeof (CV_INFO_PDB70) + 1;
   1206   bfd_size_type written;
   1207   CV_INFO_PDB70 *cvinfo70;
   1208   char * buffer;
   1209 
   1210   if (bfd_seek (abfd, where, SEEK_SET) != 0)
   1211     return 0;
   1212 
   1213   buffer = xmalloc (size);
   1214   cvinfo70 = (CV_INFO_PDB70 *) buffer;
   1215   H_PUT_32 (abfd, CVINFO_PDB70_CVSIGNATURE, cvinfo70->CvSignature);
   1216 
   1217   /* Byte swap the GUID from 16 bytes in big-endian order to 4,2,2 byte values
   1218      in little-endian order, followed by 8 single bytes.  */
   1219   bfd_putl32 (bfd_getb32 (cvinfo->Signature), cvinfo70->Signature);
   1220   bfd_putl16 (bfd_getb16 (&(cvinfo->Signature[4])), &(cvinfo70->Signature[4]));
   1221   bfd_putl16 (bfd_getb16 (&(cvinfo->Signature[6])), &(cvinfo70->Signature[6]));
   1222   memcpy (&(cvinfo70->Signature[8]), &(cvinfo->Signature[8]), 8);
   1223 
   1224   H_PUT_32 (abfd, cvinfo->Age, cvinfo70->Age);
   1225   cvinfo70->PdbFileName[0] = '\0';
   1226 
   1227   written = bfd_bwrite (buffer, size, abfd);
   1228 
   1229   free (buffer);
   1230 
   1231   return written == size ? size : 0;
   1232 }
   1233 
   1234 static char * dir_names[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] =
   1235 {
   1236   N_("Export Directory [.edata (or where ever we found it)]"),
   1237   N_("Import Directory [parts of .idata]"),
   1238   N_("Resource Directory [.rsrc]"),
   1239   N_("Exception Directory [.pdata]"),
   1240   N_("Security Directory"),
   1241   N_("Base Relocation Directory [.reloc]"),
   1242   N_("Debug Directory"),
   1243   N_("Description Directory"),
   1244   N_("Special Directory"),
   1245   N_("Thread Storage Directory [.tls]"),
   1246   N_("Load Configuration Directory"),
   1247   N_("Bound Import Directory"),
   1248   N_("Import Address Table Directory"),
   1249   N_("Delay Import Directory"),
   1250   N_("CLR Runtime Header"),
   1251   N_("Reserved")
   1252 };
   1253 
   1254 #ifdef POWERPC_LE_PE
   1255 /* The code for the PPC really falls in the "architecture dependent"
   1256    category.  However, it's not clear that anyone will ever care, so
   1257    we're ignoring the issue for now; if/when PPC matters, some of this
   1258    may need to go into peicode.h, or arguments passed to enable the
   1259    PPC- specific code.  */
   1260 #endif
   1261 
   1262 static bfd_boolean
   1263 pe_print_idata (bfd * abfd, void * vfile)
   1264 {
   1265   FILE *file = (FILE *) vfile;
   1266   bfd_byte *data;
   1267   asection *section;
   1268   bfd_signed_vma adj;
   1269 
   1270 #ifdef POWERPC_LE_PE
   1271   asection *rel_section = bfd_get_section_by_name (abfd, ".reldata");
   1272 #endif
   1273 
   1274   bfd_size_type datasize = 0;
   1275   bfd_size_type dataoff;
   1276   bfd_size_type i;
   1277   int onaline = 20;
   1278 
   1279   pe_data_type *pe = pe_data (abfd);
   1280   struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
   1281 
   1282   bfd_vma addr;
   1283 
   1284   addr = extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress;
   1285 
   1286   if (addr == 0 && extra->DataDirectory[PE_IMPORT_TABLE].Size == 0)
   1287     {
   1288       /* Maybe the extra header isn't there.  Look for the section.  */
   1289       section = bfd_get_section_by_name (abfd, ".idata");
   1290       if (section == NULL)
   1291 	return TRUE;
   1292 
   1293       addr = section->vma;
   1294       datasize = section->size;
   1295       if (datasize == 0)
   1296 	return TRUE;
   1297     }
   1298   else
   1299     {
   1300       addr += extra->ImageBase;
   1301       for (section = abfd->sections; section != NULL; section = section->next)
   1302 	{
   1303 	  datasize = section->size;
   1304 	  if (addr >= section->vma && addr < section->vma + datasize)
   1305 	    break;
   1306 	}
   1307 
   1308       if (section == NULL)
   1309 	{
   1310 	  fprintf (file,
   1311 		   _("\nThere is an import table, but the section containing it could not be found\n"));
   1312 	  return TRUE;
   1313 	}
   1314       else if (!(section->flags & SEC_HAS_CONTENTS))
   1315 	{
   1316 	  fprintf (file,
   1317 		   _("\nThere is an import table in %s, but that section has no contents\n"),
   1318 		   section->name);
   1319 	  return TRUE;
   1320 	}
   1321     }
   1322 
   1323   /* xgettext:c-format */
   1324   fprintf (file, _("\nThere is an import table in %s at 0x%lx\n"),
   1325 	   section->name, (unsigned long) addr);
   1326 
   1327   dataoff = addr - section->vma;
   1328 
   1329 #ifdef POWERPC_LE_PE
   1330   if (rel_section != 0 && rel_section->size != 0)
   1331     {
   1332       /* The toc address can be found by taking the starting address,
   1333 	 which on the PPC locates a function descriptor. The
   1334 	 descriptor consists of the function code starting address
   1335 	 followed by the address of the toc. The starting address we
   1336 	 get from the bfd, and the descriptor is supposed to be in the
   1337 	 .reldata section.  */
   1338 
   1339       bfd_vma loadable_toc_address;
   1340       bfd_vma toc_address;
   1341       bfd_vma start_address;
   1342       bfd_byte *data;
   1343       bfd_vma offset;
   1344 
   1345       if (!bfd_malloc_and_get_section (abfd, rel_section, &data))
   1346 	{
   1347 	  if (data != NULL)
   1348 	    free (data);
   1349 	  return FALSE;
   1350 	}
   1351 
   1352       offset = abfd->start_address - rel_section->vma;
   1353 
   1354       if (offset >= rel_section->size || offset + 8 > rel_section->size)
   1355 	{
   1356 	  if (data != NULL)
   1357 	    free (data);
   1358 	  return FALSE;
   1359 	}
   1360 
   1361       start_address = bfd_get_32 (abfd, data + offset);
   1362       loadable_toc_address = bfd_get_32 (abfd, data + offset + 4);
   1363       toc_address = loadable_toc_address - 32768;
   1364 
   1365       fprintf (file,
   1366 	       _("\nFunction descriptor located at the start address: %04lx\n"),
   1367 	       (unsigned long int) (abfd->start_address));
   1368       fprintf (file,
   1369 	       /* xgettext:c-format */
   1370 	       _("\tcode-base %08lx toc (loadable/actual) %08lx/%08lx\n"),
   1371 	       start_address, loadable_toc_address, toc_address);
   1372       if (data != NULL)
   1373 	free (data);
   1374     }
   1375   else
   1376     {
   1377       fprintf (file,
   1378 	       _("\nNo reldata section! Function descriptor not decoded.\n"));
   1379     }
   1380 #endif
   1381 
   1382   fprintf (file,
   1383 	   _("\nThe Import Tables (interpreted %s section contents)\n"),
   1384 	   section->name);
   1385   fprintf (file,
   1386 	   _("\
   1387  vma:            Hint    Time      Forward  DLL       First\n\
   1388                  Table   Stamp     Chain    Name      Thunk\n"));
   1389 
   1390   /* Read the whole section.  Some of the fields might be before dataoff.  */
   1391   if (!bfd_malloc_and_get_section (abfd, section, &data))
   1392     {
   1393       if (data != NULL)
   1394 	free (data);
   1395       return FALSE;
   1396     }
   1397 
   1398   adj = section->vma - extra->ImageBase;
   1399 
   1400   /* Print all image import descriptors.  */
   1401   for (i = dataoff; i + onaline <= datasize; i += onaline)
   1402     {
   1403       bfd_vma hint_addr;
   1404       bfd_vma time_stamp;
   1405       bfd_vma forward_chain;
   1406       bfd_vma dll_name;
   1407       bfd_vma first_thunk;
   1408       int idx = 0;
   1409       bfd_size_type j;
   1410       char *dll;
   1411 
   1412       /* Print (i + extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress).  */
   1413       fprintf (file, " %08lx\t", (unsigned long) (i + adj));
   1414       hint_addr = bfd_get_32 (abfd, data + i);
   1415       time_stamp = bfd_get_32 (abfd, data + i + 4);
   1416       forward_chain = bfd_get_32 (abfd, data + i + 8);
   1417       dll_name = bfd_get_32 (abfd, data + i + 12);
   1418       first_thunk = bfd_get_32 (abfd, data + i + 16);
   1419 
   1420       fprintf (file, "%08lx %08lx %08lx %08lx %08lx\n",
   1421 	       (unsigned long) hint_addr,
   1422 	       (unsigned long) time_stamp,
   1423 	       (unsigned long) forward_chain,
   1424 	       (unsigned long) dll_name,
   1425 	       (unsigned long) first_thunk);
   1426 
   1427       if (hint_addr == 0 && first_thunk == 0)
   1428 	break;
   1429 
   1430       if (dll_name - adj >= section->size)
   1431 	break;
   1432 
   1433       dll = (char *) data + dll_name - adj;
   1434       /* PR 17512 file: 078-12277-0.004.  */
   1435       bfd_size_type maxlen = (char *)(data + datasize) - dll - 1;
   1436       fprintf (file, _("\n\tDLL Name: %.*s\n"), (int) maxlen, dll);
   1437 
   1438       /* PR 21546: When the Hint Address is zero,
   1439 	 we try the First Thunk instead.  */
   1440       if (hint_addr == 0)
   1441 	hint_addr = first_thunk;
   1442 
   1443       if (hint_addr != 0 && hint_addr - adj < datasize)
   1444 	{
   1445 	  bfd_byte *ft_data;
   1446 	  asection *ft_section;
   1447 	  bfd_vma ft_addr;
   1448 	  bfd_size_type ft_datasize;
   1449 	  int ft_idx;
   1450 	  int ft_allocated;
   1451 
   1452 	  fprintf (file, _("\tvma:  Hint/Ord Member-Name Bound-To\n"));
   1453 
   1454 	  idx = hint_addr - adj;
   1455 
   1456 	  ft_addr = first_thunk + extra->ImageBase;
   1457 	  ft_idx = first_thunk - adj;
   1458 	  ft_data = data + ft_idx;
   1459 	  ft_datasize = datasize - ft_idx;
   1460 	  ft_allocated = 0;
   1461 
   1462 	  if (first_thunk != hint_addr)
   1463 	    {
   1464 	      /* Find the section which contains the first thunk.  */
   1465 	      for (ft_section = abfd->sections;
   1466 		   ft_section != NULL;
   1467 		   ft_section = ft_section->next)
   1468 		{
   1469 		  if (ft_addr >= ft_section->vma
   1470 		      && ft_addr < ft_section->vma + ft_section->size)
   1471 		    break;
   1472 		}
   1473 
   1474 	      if (ft_section == NULL)
   1475 		{
   1476 		  fprintf (file,
   1477 		       _("\nThere is a first thunk, but the section containing it could not be found\n"));
   1478 		  continue;
   1479 		}
   1480 
   1481 	      /* Now check to see if this section is the same as our current
   1482 		 section.  If it is not then we will have to load its data in.  */
   1483 	      if (ft_section != section)
   1484 		{
   1485 		  ft_idx = first_thunk - (ft_section->vma - extra->ImageBase);
   1486 		  ft_datasize = ft_section->size - ft_idx;
   1487 		  ft_data = (bfd_byte *) bfd_malloc (ft_datasize);
   1488 		  if (ft_data == NULL)
   1489 		    continue;
   1490 
   1491 		  /* Read ft_datasize bytes starting at offset ft_idx.  */
   1492 		  if (!bfd_get_section_contents (abfd, ft_section, ft_data,
   1493 						 (bfd_vma) ft_idx, ft_datasize))
   1494 		    {
   1495 		      free (ft_data);
   1496 		      continue;
   1497 		    }
   1498 		  ft_allocated = 1;
   1499 		}
   1500 	    }
   1501 
   1502 	  /* Print HintName vector entries.  */
   1503 #ifdef COFF_WITH_pex64
   1504 	  for (j = 0; idx + j + 8 <= datasize; j += 8)
   1505 	    {
   1506 	      bfd_size_type amt;
   1507 	      unsigned long member = bfd_get_32 (abfd, data + idx + j);
   1508 	      unsigned long member_high = bfd_get_32 (abfd, data + idx + j + 4);
   1509 
   1510 	      if (!member && !member_high)
   1511 		break;
   1512 
   1513 	      amt = member - adj;
   1514 
   1515 	      if (HighBitSet (member_high))
   1516 		fprintf (file, "\t%lx%08lx\t %4lx%08lx  <none>",
   1517 			 member_high, member,
   1518 			 WithoutHighBit (member_high), member);
   1519 	      /* PR binutils/17512: Handle corrupt PE data.  */
   1520 	      else if (amt >= datasize || amt + 2 >= datasize)
   1521 		fprintf (file, _("\t<corrupt: 0x%04lx>"), member);
   1522 	      else
   1523 		{
   1524 		  int ordinal;
   1525 		  char *member_name;
   1526 
   1527 		  ordinal = bfd_get_16 (abfd, data + amt);
   1528 		  member_name = (char *) data + amt + 2;
   1529 		  fprintf (file, "\t%04lx\t %4d  %.*s",member, ordinal,
   1530 			   (int) (datasize - (amt + 2)), member_name);
   1531 		}
   1532 
   1533 	      /* If the time stamp is not zero, the import address
   1534 		 table holds actual addresses.  */
   1535 	      if (time_stamp != 0
   1536 		  && first_thunk != 0
   1537 		  && first_thunk != hint_addr
   1538 		  && j + 4 <= ft_datasize)
   1539 		fprintf (file, "\t%04lx",
   1540 			 (unsigned long) bfd_get_32 (abfd, ft_data + j));
   1541 	      fprintf (file, "\n");
   1542 	    }
   1543 #else
   1544 	  for (j = 0; idx + j + 4 <= datasize; j += 4)
   1545 	    {
   1546 	      bfd_size_type amt;
   1547 	      unsigned long member = bfd_get_32 (abfd, data + idx + j);
   1548 
   1549 	      /* Print single IMAGE_IMPORT_BY_NAME vector.  */
   1550 	      if (member == 0)
   1551 		break;
   1552 
   1553 	      amt = member - adj;
   1554 
   1555 	      if (HighBitSet (member))
   1556 		fprintf (file, "\t%04lx\t %4lu  <none>",
   1557 			 member, WithoutHighBit (member));
   1558 	      /* PR binutils/17512: Handle corrupt PE data.  */
   1559 	      else if (amt >= datasize || amt + 2 >= datasize)
   1560 		fprintf (file, _("\t<corrupt: 0x%04lx>"), member);
   1561 	      else
   1562 		{
   1563 		  int ordinal;
   1564 		  char *member_name;
   1565 
   1566 		  ordinal = bfd_get_16 (abfd, data + amt);
   1567 		  member_name = (char *) data + amt + 2;
   1568 		  fprintf (file, "\t%04lx\t %4d  %.*s",
   1569 			   member, ordinal,
   1570 			   (int) (datasize - (amt + 2)), member_name);
   1571 		}
   1572 
   1573 	      /* If the time stamp is not zero, the import address
   1574 		 table holds actual addresses.  */
   1575 	      if (time_stamp != 0
   1576 		  && first_thunk != 0
   1577 		  && first_thunk != hint_addr
   1578 		  && j + 4 <= ft_datasize)
   1579 		fprintf (file, "\t%04lx",
   1580 			 (unsigned long) bfd_get_32 (abfd, ft_data + j));
   1581 
   1582 	      fprintf (file, "\n");
   1583 	    }
   1584 #endif
   1585 	  if (ft_allocated)
   1586 	    free (ft_data);
   1587 	}
   1588 
   1589       fprintf (file, "\n");
   1590     }
   1591 
   1592   free (data);
   1593 
   1594   return TRUE;
   1595 }
   1596 
   1597 static bfd_boolean
   1598 pe_print_edata (bfd * abfd, void * vfile)
   1599 {
   1600   FILE *file = (FILE *) vfile;
   1601   bfd_byte *data;
   1602   asection *section;
   1603   bfd_size_type datasize = 0;
   1604   bfd_size_type dataoff;
   1605   bfd_size_type i;
   1606   bfd_vma       adj;
   1607   struct EDT_type
   1608   {
   1609     long export_flags;		/* Reserved - should be zero.  */
   1610     long time_stamp;
   1611     short major_ver;
   1612     short minor_ver;
   1613     bfd_vma name;		/* RVA - relative to image base.  */
   1614     long base;			/* Ordinal base.  */
   1615     unsigned long num_functions;/* Number in the export address table.  */
   1616     unsigned long num_names;	/* Number in the name pointer table.  */
   1617     bfd_vma eat_addr;		/* RVA to the export address table.  */
   1618     bfd_vma npt_addr;		/* RVA to the Export Name Pointer Table.  */
   1619     bfd_vma ot_addr;		/* RVA to the Ordinal Table.  */
   1620   } edt;
   1621 
   1622   pe_data_type *pe = pe_data (abfd);
   1623   struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
   1624 
   1625   bfd_vma addr;
   1626 
   1627   addr = extra->DataDirectory[PE_EXPORT_TABLE].VirtualAddress;
   1628 
   1629   if (addr == 0 && extra->DataDirectory[PE_EXPORT_TABLE].Size == 0)
   1630     {
   1631       /* Maybe the extra header isn't there.  Look for the section.  */
   1632       section = bfd_get_section_by_name (abfd, ".edata");
   1633       if (section == NULL)
   1634 	return TRUE;
   1635 
   1636       addr = section->vma;
   1637       dataoff = 0;
   1638       datasize = section->size;
   1639       if (datasize == 0)
   1640 	return TRUE;
   1641     }
   1642   else
   1643     {
   1644       addr += extra->ImageBase;
   1645 
   1646       for (section = abfd->sections; section != NULL; section = section->next)
   1647 	if (addr >= section->vma && addr < section->vma + section->size)
   1648 	  break;
   1649 
   1650       if (section == NULL)
   1651 	{
   1652 	  fprintf (file,
   1653 		   _("\nThere is an export table, but the section containing it could not be found\n"));
   1654 	  return TRUE;
   1655 	}
   1656       else if (!(section->flags & SEC_HAS_CONTENTS))
   1657 	{
   1658 	  fprintf (file,
   1659 		   _("\nThere is an export table in %s, but that section has no contents\n"),
   1660 		   section->name);
   1661 	  return TRUE;
   1662 	}
   1663 
   1664       dataoff = addr - section->vma;
   1665       datasize = extra->DataDirectory[PE_EXPORT_TABLE].Size;
   1666       if (dataoff > section->size
   1667 	  || datasize > section->size - dataoff)
   1668 	{
   1669 	  fprintf (file,
   1670 		   _("\nThere is an export table in %s, but it does not fit into that section\n"),
   1671 		   section->name);
   1672 	  return TRUE;
   1673 	}
   1674     }
   1675 
   1676   /* PR 17512: Handle corrupt PE binaries.  */
   1677   if (datasize < 40)
   1678     {
   1679       fprintf (file,
   1680 	       /* xgettext:c-format */
   1681 	       _("\nThere is an export table in %s, but it is too small (%d)\n"),
   1682 	       section->name, (int) datasize);
   1683       return TRUE;
   1684     }
   1685 
   1686   /* xgettext:c-format */
   1687   fprintf (file, _("\nThere is an export table in %s at 0x%lx\n"),
   1688 	   section->name, (unsigned long) addr);
   1689 
   1690   data = (bfd_byte *) bfd_malloc (datasize);
   1691   if (data == NULL)
   1692     return FALSE;
   1693 
   1694   if (! bfd_get_section_contents (abfd, section, data,
   1695 				  (file_ptr) dataoff, datasize))
   1696     return FALSE;
   1697 
   1698   /* Go get Export Directory Table.  */
   1699   edt.export_flags   = bfd_get_32 (abfd, data +	 0);
   1700   edt.time_stamp     = bfd_get_32 (abfd, data +	 4);
   1701   edt.major_ver	     = bfd_get_16 (abfd, data +	 8);
   1702   edt.minor_ver	     = bfd_get_16 (abfd, data + 10);
   1703   edt.name	     = bfd_get_32 (abfd, data + 12);
   1704   edt.base	     = bfd_get_32 (abfd, data + 16);
   1705   edt.num_functions  = bfd_get_32 (abfd, data + 20);
   1706   edt.num_names	     = bfd_get_32 (abfd, data + 24);
   1707   edt.eat_addr	     = bfd_get_32 (abfd, data + 28);
   1708   edt.npt_addr	     = bfd_get_32 (abfd, data + 32);
   1709   edt.ot_addr	     = bfd_get_32 (abfd, data + 36);
   1710 
   1711   adj = section->vma - extra->ImageBase + dataoff;
   1712 
   1713   /* Dump the EDT first.  */
   1714   fprintf (file,
   1715 	   _("\nThe Export Tables (interpreted %s section contents)\n\n"),
   1716 	   section->name);
   1717 
   1718   fprintf (file,
   1719 	   _("Export Flags \t\t\t%lx\n"), (unsigned long) edt.export_flags);
   1720 
   1721   fprintf (file,
   1722 	   _("Time/Date stamp \t\t%lx\n"), (unsigned long) edt.time_stamp);
   1723 
   1724   fprintf (file,
   1725 	   /* xgettext:c-format */
   1726 	   _("Major/Minor \t\t\t%d/%d\n"), edt.major_ver, edt.minor_ver);
   1727 
   1728   fprintf (file,
   1729 	   _("Name \t\t\t\t"));
   1730   bfd_fprintf_vma (abfd, file, edt.name);
   1731 
   1732   if ((edt.name >= adj) && (edt.name < adj + datasize))
   1733     fprintf (file, " %.*s\n",
   1734 	     (int) (datasize - (edt.name - adj)),
   1735 	     data + edt.name - adj);
   1736   else
   1737     fprintf (file, "(outside .edata section)\n");
   1738 
   1739   fprintf (file,
   1740 	   _("Ordinal Base \t\t\t%ld\n"), edt.base);
   1741 
   1742   fprintf (file,
   1743 	   _("Number in:\n"));
   1744 
   1745   fprintf (file,
   1746 	   _("\tExport Address Table \t\t%08lx\n"),
   1747 	   edt.num_functions);
   1748 
   1749   fprintf (file,
   1750 	   _("\t[Name Pointer/Ordinal] Table\t%08lx\n"), edt.num_names);
   1751 
   1752   fprintf (file,
   1753 	   _("Table Addresses\n"));
   1754 
   1755   fprintf (file,
   1756 	   _("\tExport Address Table \t\t"));
   1757   bfd_fprintf_vma (abfd, file, edt.eat_addr);
   1758   fprintf (file, "\n");
   1759 
   1760   fprintf (file,
   1761 	   _("\tName Pointer Table \t\t"));
   1762   bfd_fprintf_vma (abfd, file, edt.npt_addr);
   1763   fprintf (file, "\n");
   1764 
   1765   fprintf (file,
   1766 	   _("\tOrdinal Table \t\t\t"));
   1767   bfd_fprintf_vma (abfd, file, edt.ot_addr);
   1768   fprintf (file, "\n");
   1769 
   1770   /* The next table to find is the Export Address Table. It's basically
   1771      a list of pointers that either locate a function in this dll, or
   1772      forward the call to another dll. Something like:
   1773       typedef union
   1774       {
   1775 	long export_rva;
   1776 	long forwarder_rva;
   1777       } export_address_table_entry;  */
   1778 
   1779   fprintf (file,
   1780 	  _("\nExport Address Table -- Ordinal Base %ld\n"),
   1781 	  edt.base);
   1782 
   1783   /* PR 17512: Handle corrupt PE binaries.  */
   1784   /* PR 17512 file: 140-165018-0.004.  */
   1785   if (edt.eat_addr - adj >= datasize
   1786       /* PR 17512: file: 092b1829 */
   1787       || (edt.num_functions + 1) * 4 < edt.num_functions
   1788       || edt.eat_addr - adj + (edt.num_functions + 1) * 4 > datasize)
   1789     fprintf (file, _("\tInvalid Export Address Table rva (0x%lx) or entry count (0x%lx)\n"),
   1790 	     (long) edt.eat_addr,
   1791 	     (long) edt.num_functions);
   1792   else for (i = 0; i < edt.num_functions; ++i)
   1793     {
   1794       bfd_vma eat_member = bfd_get_32 (abfd,
   1795 				       data + edt.eat_addr + (i * 4) - adj);
   1796       if (eat_member == 0)
   1797 	continue;
   1798 
   1799       if (eat_member - adj <= datasize)
   1800 	{
   1801 	  /* This rva is to a name (forwarding function) in our section.  */
   1802 	  /* Should locate a function descriptor.  */
   1803 	  fprintf (file,
   1804 		   "\t[%4ld] +base[%4ld] %04lx %s -- %.*s\n",
   1805 		   (long) i,
   1806 		   (long) (i + edt.base),
   1807 		   (unsigned long) eat_member,
   1808 		   _("Forwarder RVA"),
   1809 		   (int)(datasize - (eat_member - adj)),
   1810 		   data + eat_member - adj);
   1811 	}
   1812       else
   1813 	{
   1814 	  /* Should locate a function descriptor in the reldata section.  */
   1815 	  fprintf (file,
   1816 		   "\t[%4ld] +base[%4ld] %04lx %s\n",
   1817 		   (long) i,
   1818 		   (long) (i + edt.base),
   1819 		   (unsigned long) eat_member,
   1820 		   _("Export RVA"));
   1821 	}
   1822     }
   1823 
   1824   /* The Export Name Pointer Table is paired with the Export Ordinal Table.  */
   1825   /* Dump them in parallel for clarity.  */
   1826   fprintf (file,
   1827 	   _("\n[Ordinal/Name Pointer] Table\n"));
   1828 
   1829   /* PR 17512: Handle corrupt PE binaries.  */
   1830   if (edt.npt_addr + (edt.num_names * 4) - adj >= datasize
   1831       /* PR 17512: file: bb68816e.  */
   1832       || edt.num_names * 4 < edt.num_names
   1833       || (data + edt.npt_addr - adj) < data)
   1834     /* xgettext:c-format */
   1835     fprintf (file, _("\tInvalid Name Pointer Table rva (0x%lx) or entry count (0x%lx)\n"),
   1836 	     (long) edt.npt_addr,
   1837 	     (long) edt.num_names);
   1838   /* PR 17512: file: 140-147171-0.004.  */
   1839   else if (edt.ot_addr + (edt.num_names * 2) - adj >= datasize
   1840 	   || data + edt.ot_addr - adj < data)
   1841     /* xgettext:c-format */
   1842     fprintf (file, _("\tInvalid Ordinal Table rva (0x%lx) or entry count (0x%lx)\n"),
   1843 	     (long) edt.ot_addr,
   1844 	     (long) edt.num_names);
   1845   else for (i = 0; i < edt.num_names; ++i)
   1846     {
   1847       bfd_vma  name_ptr;
   1848       bfd_vma  ord;
   1849 
   1850       ord = bfd_get_16 (abfd, data + edt.ot_addr + (i * 2) - adj);
   1851       name_ptr = bfd_get_32 (abfd, data + edt.npt_addr + (i * 4) - adj);
   1852 
   1853       if ((name_ptr - adj) >= datasize)
   1854 	{
   1855 	  /* xgettext:c-format */
   1856 	  fprintf (file, _("\t[%4ld] <corrupt offset: %lx>\n"),
   1857 		   (long) ord, (long) name_ptr);
   1858 	}
   1859       else
   1860 	{
   1861 	  char * name = (char *) data + name_ptr - adj;
   1862 
   1863 	  fprintf (file, "\t[%4ld] %.*s\n", (long) ord,
   1864 		   (int)((char *)(data + datasize) - name), name);
   1865 	}
   1866     }
   1867 
   1868   free (data);
   1869 
   1870   return TRUE;
   1871 }
   1872 
   1873 /* This really is architecture dependent.  On IA-64, a .pdata entry
   1874    consists of three dwords containing relative virtual addresses that
   1875    specify the start and end address of the code range the entry
   1876    covers and the address of the corresponding unwind info data.
   1877 
   1878    On ARM and SH-4, a compressed PDATA structure is used :
   1879    _IMAGE_CE_RUNTIME_FUNCTION_ENTRY, whereas MIPS is documented to use
   1880    _IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY.
   1881    See http://msdn2.microsoft.com/en-us/library/ms253988(VS.80).aspx .
   1882 
   1883    This is the version for uncompressed data.  */
   1884 
   1885 static bfd_boolean
   1886 pe_print_pdata (bfd * abfd, void * vfile)
   1887 {
   1888 #if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
   1889 # define PDATA_ROW_SIZE	(3 * 8)
   1890 #else
   1891 # define PDATA_ROW_SIZE	(5 * 4)
   1892 #endif
   1893   FILE *file = (FILE *) vfile;
   1894   bfd_byte *data = 0;
   1895   asection *section = bfd_get_section_by_name (abfd, ".pdata");
   1896   bfd_size_type datasize = 0;
   1897   bfd_size_type i;
   1898   bfd_size_type start, stop;
   1899   int onaline = PDATA_ROW_SIZE;
   1900 
   1901   if (section == NULL
   1902       || coff_section_data (abfd, section) == NULL
   1903       || pei_section_data (abfd, section) == NULL)
   1904     return TRUE;
   1905 
   1906   stop = pei_section_data (abfd, section)->virt_size;
   1907   if ((stop % onaline) != 0)
   1908     fprintf (file,
   1909 	     /* xgettext:c-format */
   1910 	     _("warning, .pdata section size (%ld) is not a multiple of %d\n"),
   1911 	     (long) stop, onaline);
   1912 
   1913   fprintf (file,
   1914 	   _("\nThe Function Table (interpreted .pdata section contents)\n"));
   1915 #if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
   1916   fprintf (file,
   1917 	   _(" vma:\t\t\tBegin Address    End Address      Unwind Info\n"));
   1918 #else
   1919   fprintf (file, _("\
   1920  vma:\t\tBegin    End      EH       EH       PrologEnd  Exception\n\
   1921      \t\tAddress  Address  Handler  Data     Address    Mask\n"));
   1922 #endif
   1923 
   1924   datasize = section->size;
   1925   if (datasize == 0)
   1926     return TRUE;
   1927 
   1928   /* PR 17512: file: 002-193900-0.004.  */
   1929   if (datasize < stop)
   1930     {
   1931       /* xgettext:c-format */
   1932       fprintf (file, _("Virtual size of .pdata section (%ld) larger than real size (%ld)\n"),
   1933 	       (long) stop, (long) datasize);
   1934       return FALSE;
   1935     }
   1936 
   1937   if (! bfd_malloc_and_get_section (abfd, section, &data))
   1938     {
   1939       if (data != NULL)
   1940 	free (data);
   1941       return FALSE;
   1942     }
   1943 
   1944   start = 0;
   1945 
   1946   for (i = start; i < stop; i += onaline)
   1947     {
   1948       bfd_vma begin_addr;
   1949       bfd_vma end_addr;
   1950       bfd_vma eh_handler;
   1951       bfd_vma eh_data;
   1952       bfd_vma prolog_end_addr;
   1953 #if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64)
   1954       int em_data;
   1955 #endif
   1956 
   1957       if (i + PDATA_ROW_SIZE > stop)
   1958 	break;
   1959 
   1960       begin_addr      = GET_PDATA_ENTRY (abfd, data + i	    );
   1961       end_addr	      = GET_PDATA_ENTRY (abfd, data + i +  4);
   1962       eh_handler      = GET_PDATA_ENTRY (abfd, data + i +  8);
   1963       eh_data	      = GET_PDATA_ENTRY (abfd, data + i + 12);
   1964       prolog_end_addr = GET_PDATA_ENTRY (abfd, data + i + 16);
   1965 
   1966       if (begin_addr == 0 && end_addr == 0 && eh_handler == 0
   1967 	  && eh_data == 0 && prolog_end_addr == 0)
   1968 	/* We are probably into the padding of the section now.  */
   1969 	break;
   1970 
   1971 #if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64)
   1972       em_data = ((eh_handler & 0x1) << 2) | (prolog_end_addr & 0x3);
   1973 #endif
   1974       eh_handler &= ~(bfd_vma) 0x3;
   1975       prolog_end_addr &= ~(bfd_vma) 0x3;
   1976 
   1977       fputc (' ', file);
   1978       bfd_fprintf_vma (abfd, file, i + section->vma); fputc ('\t', file);
   1979       bfd_fprintf_vma (abfd, file, begin_addr); fputc (' ', file);
   1980       bfd_fprintf_vma (abfd, file, end_addr); fputc (' ', file);
   1981       bfd_fprintf_vma (abfd, file, eh_handler);
   1982 #if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64)
   1983       fputc (' ', file);
   1984       bfd_fprintf_vma (abfd, file, eh_data); fputc (' ', file);
   1985       bfd_fprintf_vma (abfd, file, prolog_end_addr);
   1986       fprintf (file, "   %x", em_data);
   1987 #endif
   1988 
   1989 #ifdef POWERPC_LE_PE
   1990       if (eh_handler == 0 && eh_data != 0)
   1991 	{
   1992 	  /* Special bits here, although the meaning may be a little
   1993 	     mysterious. The only one I know for sure is 0x03
   1994 	     Code Significance
   1995 	     0x00 None
   1996 	     0x01 Register Save Millicode
   1997 	     0x02 Register Restore Millicode
   1998 	     0x03 Glue Code Sequence.  */
   1999 	  switch (eh_data)
   2000 	    {
   2001 	    case 0x01:
   2002 	      fprintf (file, _(" Register save millicode"));
   2003 	      break;
   2004 	    case 0x02:
   2005 	      fprintf (file, _(" Register restore millicode"));
   2006 	      break;
   2007 	    case 0x03:
   2008 	      fprintf (file, _(" Glue code sequence"));
   2009 	      break;
   2010 	    default:
   2011 	      break;
   2012 	    }
   2013 	}
   2014 #endif
   2015       fprintf (file, "\n");
   2016     }
   2017 
   2018   free (data);
   2019 
   2020   return TRUE;
   2021 #undef PDATA_ROW_SIZE
   2022 }
   2023 
   2024 typedef struct sym_cache
   2025 {
   2026   int	     symcount;
   2027   asymbol ** syms;
   2028 } sym_cache;
   2029 
   2030 static asymbol **
   2031 slurp_symtab (bfd *abfd, sym_cache *psc)
   2032 {
   2033   asymbol ** sy = NULL;
   2034   long storage;
   2035 
   2036   if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
   2037     {
   2038       psc->symcount = 0;
   2039       return NULL;
   2040     }
   2041 
   2042   storage = bfd_get_symtab_upper_bound (abfd);
   2043   if (storage < 0)
   2044     return NULL;
   2045   if (storage)
   2046     {
   2047       sy = (asymbol **) bfd_malloc (storage);
   2048       if (sy == NULL)
   2049 	return NULL;
   2050     }
   2051 
   2052   psc->symcount = bfd_canonicalize_symtab (abfd, sy);
   2053   if (psc->symcount < 0)
   2054     return NULL;
   2055   return sy;
   2056 }
   2057 
   2058 static const char *
   2059 my_symbol_for_address (bfd *abfd, bfd_vma func, sym_cache *psc)
   2060 {
   2061   int i;
   2062 
   2063   if (psc->syms == 0)
   2064     psc->syms = slurp_symtab (abfd, psc);
   2065 
   2066   for (i = 0; i < psc->symcount; i++)
   2067     {
   2068       if (psc->syms[i]->section->vma + psc->syms[i]->value == func)
   2069 	return psc->syms[i]->name;
   2070     }
   2071 
   2072   return NULL;
   2073 }
   2074 
   2075 static void
   2076 cleanup_syms (sym_cache *psc)
   2077 {
   2078   psc->symcount = 0;
   2079   free (psc->syms);
   2080   psc->syms = NULL;
   2081 }
   2082 
   2083 /* This is the version for "compressed" pdata.  */
   2084 
   2085 bfd_boolean
   2086 _bfd_XX_print_ce_compressed_pdata (bfd * abfd, void * vfile)
   2087 {
   2088 # define PDATA_ROW_SIZE	(2 * 4)
   2089   FILE *file = (FILE *) vfile;
   2090   bfd_byte *data = NULL;
   2091   asection *section = bfd_get_section_by_name (abfd, ".pdata");
   2092   bfd_size_type datasize = 0;
   2093   bfd_size_type i;
   2094   bfd_size_type start, stop;
   2095   int onaline = PDATA_ROW_SIZE;
   2096   struct sym_cache cache = {0, 0} ;
   2097 
   2098   if (section == NULL
   2099       || coff_section_data (abfd, section) == NULL
   2100       || pei_section_data (abfd, section) == NULL)
   2101     return TRUE;
   2102 
   2103   stop = pei_section_data (abfd, section)->virt_size;
   2104   if ((stop % onaline) != 0)
   2105     fprintf (file,
   2106 	     /* xgettext:c-format */
   2107 	     _("warning, .pdata section size (%ld) is not a multiple of %d\n"),
   2108 	     (long) stop, onaline);
   2109 
   2110   fprintf (file,
   2111 	   _("\nThe Function Table (interpreted .pdata section contents)\n"));
   2112 
   2113   fprintf (file, _("\
   2114  vma:\t\tBegin    Prolog   Function Flags    Exception EH\n\
   2115      \t\tAddress  Length   Length   32b exc  Handler   Data\n"));
   2116 
   2117   datasize = section->size;
   2118   if (datasize == 0)
   2119     return TRUE;
   2120 
   2121   if (! bfd_malloc_and_get_section (abfd, section, &data))
   2122     {
   2123       if (data != NULL)
   2124 	free (data);
   2125       return FALSE;
   2126     }
   2127 
   2128   start = 0;
   2129 
   2130   for (i = start; i < stop; i += onaline)
   2131     {
   2132       bfd_vma begin_addr;
   2133       bfd_vma other_data;
   2134       bfd_vma prolog_length, function_length;
   2135       int flag32bit, exception_flag;
   2136       asection *tsection;
   2137 
   2138       if (i + PDATA_ROW_SIZE > stop)
   2139 	break;
   2140 
   2141       begin_addr = GET_PDATA_ENTRY (abfd, data + i     );
   2142       other_data = GET_PDATA_ENTRY (abfd, data + i +  4);
   2143 
   2144       if (begin_addr == 0 && other_data == 0)
   2145 	/* We are probably into the padding of the section now.  */
   2146 	break;
   2147 
   2148       prolog_length = (other_data & 0x000000FF);
   2149       function_length = (other_data & 0x3FFFFF00) >> 8;
   2150       flag32bit = (int)((other_data & 0x40000000) >> 30);
   2151       exception_flag = (int)((other_data & 0x80000000) >> 31);
   2152 
   2153       fputc (' ', file);
   2154       bfd_fprintf_vma (abfd, file, i + section->vma); fputc ('\t', file);
   2155       bfd_fprintf_vma (abfd, file, begin_addr); fputc (' ', file);
   2156       bfd_fprintf_vma (abfd, file, prolog_length); fputc (' ', file);
   2157       bfd_fprintf_vma (abfd, file, function_length); fputc (' ', file);
   2158       fprintf (file, "%2d  %2d   ", flag32bit, exception_flag);
   2159 
   2160       /* Get the exception handler's address and the data passed from the
   2161 	 .text section. This is really the data that belongs with the .pdata
   2162 	 but got "compressed" out for the ARM and SH4 architectures.  */
   2163       tsection = bfd_get_section_by_name (abfd, ".text");
   2164       if (tsection && coff_section_data (abfd, tsection)
   2165 	  && pei_section_data (abfd, tsection))
   2166 	{
   2167 	  bfd_vma eh_off = (begin_addr - 8) - tsection->vma;
   2168 	  bfd_byte *tdata;
   2169 
   2170 	  tdata = (bfd_byte *) bfd_malloc (8);
   2171 	  if (tdata)
   2172 	    {
   2173 	      if (bfd_get_section_contents (abfd, tsection, tdata, eh_off, 8))
   2174 		{
   2175 		  bfd_vma eh, eh_data;
   2176 
   2177 		  eh = bfd_get_32 (abfd, tdata);
   2178 		  eh_data = bfd_get_32 (abfd, tdata + 4);
   2179 		  fprintf (file, "%08x  ", (unsigned int) eh);
   2180 		  fprintf (file, "%08x", (unsigned int) eh_data);
   2181 		  if (eh != 0)
   2182 		    {
   2183 		      const char *s = my_symbol_for_address (abfd, eh, &cache);
   2184 
   2185 		      if (s)
   2186 			fprintf (file, " (%s) ", s);
   2187 		    }
   2188 		}
   2189 	      free (tdata);
   2190 	    }
   2191 	}
   2192 
   2193       fprintf (file, "\n");
   2194     }
   2195 
   2196   free (data);
   2197 
   2198   cleanup_syms (& cache);
   2199 
   2200   return TRUE;
   2201 #undef PDATA_ROW_SIZE
   2202 }
   2203 
   2204 
   2205 #define IMAGE_REL_BASED_HIGHADJ 4
   2207 static const char * const tbl[] =
   2208 {
   2209   "ABSOLUTE",
   2210   "HIGH",
   2211   "LOW",
   2212   "HIGHLOW",
   2213   "HIGHADJ",
   2214   "MIPS_JMPADDR",
   2215   "SECTION",
   2216   "REL32",
   2217   "RESERVED1",
   2218   "MIPS_JMPADDR16",
   2219   "DIR64",
   2220   "HIGH3ADJ",
   2221   "UNKNOWN",   /* MUST be last.  */
   2222 };
   2223 
   2224 static bfd_boolean
   2225 pe_print_reloc (bfd * abfd, void * vfile)
   2226 {
   2227   FILE *file = (FILE *) vfile;
   2228   bfd_byte *data = 0;
   2229   asection *section = bfd_get_section_by_name (abfd, ".reloc");
   2230   bfd_byte *p, *end;
   2231 
   2232   if (section == NULL || section->size == 0 || !(section->flags & SEC_HAS_CONTENTS))
   2233     return TRUE;
   2234 
   2235   fprintf (file,
   2236 	   _("\n\nPE File Base Relocations (interpreted .reloc section contents)\n"));
   2237 
   2238   if (! bfd_malloc_and_get_section (abfd, section, &data))
   2239     {
   2240       if (data != NULL)
   2241 	free (data);
   2242       return FALSE;
   2243     }
   2244 
   2245   p = data;
   2246   end = data + section->size;
   2247   while (p + 8 <= end)
   2248     {
   2249       int j;
   2250       bfd_vma virtual_address;
   2251       unsigned long number, size;
   2252       bfd_byte *chunk_end;
   2253 
   2254       /* The .reloc section is a sequence of blocks, with a header consisting
   2255 	 of two 32 bit quantities, followed by a number of 16 bit entries.  */
   2256       virtual_address = bfd_get_32 (abfd, p);
   2257       size = bfd_get_32 (abfd, p + 4);
   2258       p += 8;
   2259       number = (size - 8) / 2;
   2260 
   2261       if (size == 0)
   2262 	break;
   2263 
   2264       fprintf (file,
   2265 	       /* xgettext:c-format */
   2266 	       _("\nVirtual Address: %08lx Chunk size %ld (0x%lx) Number of fixups %ld\n"),
   2267 	       (unsigned long) virtual_address, size, size, number);
   2268 
   2269       chunk_end = p - 8 + size;
   2270       if (chunk_end > end)
   2271 	chunk_end = end;
   2272       j = 0;
   2273       while (p + 2 <= chunk_end)
   2274 	{
   2275 	  unsigned short e = bfd_get_16 (abfd, p);
   2276 	  unsigned int t = (e & 0xF000) >> 12;
   2277 	  int off = e & 0x0FFF;
   2278 
   2279 	  if (t >= sizeof (tbl) / sizeof (tbl[0]))
   2280 	    t = (sizeof (tbl) / sizeof (tbl[0])) - 1;
   2281 
   2282 	  fprintf (file,
   2283 		   /* xgettext:c-format */
   2284 		   _("\treloc %4d offset %4x [%4lx] %s"),
   2285 		   j, off, (unsigned long) (off + virtual_address), tbl[t]);
   2286 
   2287 	  p += 2;
   2288 	  j++;
   2289 
   2290 	  /* HIGHADJ takes an argument, - the next record *is* the
   2291 	     low 16 bits of addend.  */
   2292 	  if (t == IMAGE_REL_BASED_HIGHADJ && p + 2 <= chunk_end)
   2293 	    {
   2294 	      fprintf (file, " (%4x)", (unsigned int) bfd_get_16 (abfd, p));
   2295 	      p += 2;
   2296 	      j++;
   2297 	    }
   2298 
   2299 	  fprintf (file, "\n");
   2300 	}
   2301     }
   2302 
   2303   free (data);
   2304 
   2305   return TRUE;
   2306 }
   2307 
   2308 /* A data structure describing the regions of a .rsrc section.
   2310    Some fields are filled in as the section is parsed.  */
   2311 
   2312 typedef struct rsrc_regions
   2313 {
   2314   bfd_byte * section_start;
   2315   bfd_byte * section_end;
   2316   bfd_byte * strings_start;
   2317   bfd_byte * resource_start;
   2318 } rsrc_regions;
   2319 
   2320 static bfd_byte *
   2321 rsrc_print_resource_directory (FILE * , bfd *, unsigned int, bfd_byte *,
   2322 			       rsrc_regions *, bfd_vma);
   2323 
   2324 /* Print the resource entry at DATA, with the text indented by INDENT.
   2325    Recusively calls rsrc_print_resource_directory to print the contents
   2326    of directory entries.
   2327    Returns the address of the end of the data associated with the entry
   2328    or section_end + 1 upon failure.  */
   2329 
   2330 static bfd_byte *
   2331 rsrc_print_resource_entries (FILE *	    file,
   2332 			     bfd *	    abfd,
   2333 			     unsigned int   indent,
   2334 			     bfd_boolean    is_name,
   2335 			     bfd_byte *	    data,
   2336 			     rsrc_regions * regions,
   2337 			     bfd_vma	    rva_bias)
   2338 {
   2339   unsigned long entry, addr, size;
   2340   bfd_byte * leaf;
   2341 
   2342   if (data + 8 >= regions->section_end)
   2343     return regions->section_end + 1;
   2344 
   2345   /* xgettext:c-format */
   2346   fprintf (file, _("%03x %*.s Entry: "), (int)(data - regions->section_start), indent, " ");
   2347 
   2348   entry = (unsigned long) bfd_get_32 (abfd, data);
   2349   if (is_name)
   2350     {
   2351       bfd_byte * name;
   2352 
   2353       /* Note - the documentation says that this field is an RVA value
   2354 	 but windres appears to produce a section relative offset with
   2355 	 the top bit set.  Support both styles for now.  */
   2356       if (HighBitSet (entry))
   2357 	name = regions->section_start + WithoutHighBit (entry);
   2358       else
   2359 	name = regions->section_start + entry - rva_bias;
   2360 
   2361       if (name + 2 < regions->section_end && name > regions->section_start)
   2362 	{
   2363 	  unsigned int len;
   2364 
   2365 	  if (regions->strings_start == NULL)
   2366 	    regions->strings_start = name;
   2367 
   2368 	  len = bfd_get_16 (abfd, name);
   2369 
   2370 	  fprintf (file, _("name: [val: %08lx len %d]: "), entry, len);
   2371 
   2372 	  if (name + 2 + len * 2 < regions->section_end)
   2373 	    {
   2374 	      /* This strange loop is to cope with multibyte characters.  */
   2375 	      while (len --)
   2376 		{
   2377 		  char c;
   2378 
   2379 		  name += 2;
   2380 		  c = * name;
   2381 		  /* Avoid printing control characters.  */
   2382 		  if (c > 0 && c < 32)
   2383 		    fprintf (file, "^%c", c + 64);
   2384 		  else
   2385 		    fprintf (file, "%.1s", name);
   2386 		}
   2387 	    }
   2388 	  else
   2389 	    {
   2390 	      fprintf (file, _("<corrupt string length: %#x>\n"), len);
   2391 	      /* PR binutils/17512: Do not try to continue decoding a
   2392 		 corrupted resource section.  It is likely to end up with
   2393 		 reams of extraneous output.  FIXME: We could probably
   2394 		 continue if we disable the printing of strings...  */
   2395 	      return regions->section_end + 1;
   2396 	    }
   2397 	}
   2398       else
   2399 	{
   2400 	  fprintf (file, _("<corrupt string offset: %#lx>\n"), entry);
   2401 	  return regions->section_end + 1;
   2402 	}
   2403     }
   2404   else
   2405     fprintf (file, _("ID: %#08lx"), entry);
   2406 
   2407   entry = (long) bfd_get_32 (abfd, data + 4);
   2408   fprintf (file, _(", Value: %#08lx\n"), entry);
   2409 
   2410   if (HighBitSet  (entry))
   2411     {
   2412       data = regions->section_start + WithoutHighBit (entry);
   2413       if (data <= regions->section_start || data > regions->section_end)
   2414 	return regions->section_end + 1;
   2415 
   2416       /* FIXME: PR binutils/17512: A corrupt file could contain a loop
   2417 	 in the resource table.  We need some way to detect this.  */
   2418       return rsrc_print_resource_directory (file, abfd, indent + 1, data,
   2419 					    regions, rva_bias);
   2420     }
   2421 
   2422   leaf = regions->section_start + entry;
   2423 
   2424   if (leaf + 16 >= regions->section_end
   2425       /* PR 17512: file: 055dff7e.  */
   2426       || leaf < regions->section_start)
   2427     return regions->section_end + 1;
   2428 
   2429   /* xgettext:c-format */
   2430   fprintf (file, _("%03x %*.s  Leaf: Addr: %#08lx, Size: %#08lx, Codepage: %d\n"),
   2431 	   (int) (entry), indent, " ",
   2432 	   addr = (long) bfd_get_32 (abfd, leaf),
   2433 	   size = (long) bfd_get_32 (abfd, leaf + 4),
   2434 	   (int) bfd_get_32 (abfd, leaf + 8));
   2435 
   2436   /* Check that the reserved entry is 0.  */
   2437   if (bfd_get_32 (abfd, leaf + 12) != 0
   2438       /* And that the data address/size is valid too.  */
   2439       || (regions->section_start + (addr - rva_bias) + size > regions->section_end))
   2440     return regions->section_end + 1;
   2441 
   2442   if (regions->resource_start == NULL)
   2443     regions->resource_start = regions->section_start + (addr - rva_bias);
   2444 
   2445   return regions->section_start + (addr - rva_bias) + size;
   2446 }
   2447 
   2448 #define max(a,b) ((a) > (b) ? (a) : (b))
   2449 #define min(a,b) ((a) < (b) ? (a) : (b))
   2450 
   2451 static bfd_byte *
   2452 rsrc_print_resource_directory (FILE *	      file,
   2453 			       bfd *	      abfd,
   2454 			       unsigned int   indent,
   2455 			       bfd_byte *     data,
   2456 			       rsrc_regions * regions,
   2457 			       bfd_vma	      rva_bias)
   2458 {
   2459   unsigned int num_names, num_ids;
   2460   bfd_byte * highest_data = data;
   2461 
   2462   if (data + 16 >= regions->section_end)
   2463     return regions->section_end + 1;
   2464 
   2465   fprintf (file, "%03x %*.s ", (int)(data - regions->section_start), indent, " ");
   2466   switch (indent)
   2467     {
   2468     case 0: fprintf (file, "Type"); break;
   2469     case 2: fprintf (file, "Name"); break;
   2470     case 4: fprintf (file, "Language"); break;
   2471     default:
   2472       fprintf (file, _("<unknown directory type: %d>\n"), indent);
   2473       /* FIXME: For now we end the printing here.  If in the
   2474 	 future more directory types are added to the RSRC spec
   2475 	 then we will need to change this.  */
   2476       return regions->section_end + 1;
   2477     }
   2478 
   2479   /* xgettext:c-format */
   2480   fprintf (file, _(" Table: Char: %d, Time: %08lx, Ver: %d/%d, Num Names: %d, IDs: %d\n"),
   2481 	   (int) bfd_get_32 (abfd, data),
   2482 	   (long) bfd_get_32 (abfd, data + 4),
   2483 	   (int)  bfd_get_16 (abfd, data + 8),
   2484 	   (int)  bfd_get_16 (abfd, data + 10),
   2485 	   num_names = (int) bfd_get_16 (abfd, data + 12),
   2486 	   num_ids =   (int) bfd_get_16 (abfd, data + 14));
   2487   data += 16;
   2488 
   2489   while (num_names --)
   2490     {
   2491       bfd_byte * entry_end;
   2492 
   2493       entry_end = rsrc_print_resource_entries (file, abfd, indent + 1, TRUE,
   2494 					       data, regions, rva_bias);
   2495       data += 8;
   2496       highest_data = max (highest_data, entry_end);
   2497       if (entry_end >= regions->section_end)
   2498 	return entry_end;
   2499     }
   2500 
   2501   while (num_ids --)
   2502     {
   2503       bfd_byte * entry_end;
   2504 
   2505       entry_end = rsrc_print_resource_entries (file, abfd, indent + 1, FALSE,
   2506 					       data, regions, rva_bias);
   2507       data += 8;
   2508       highest_data = max (highest_data, entry_end);
   2509       if (entry_end >= regions->section_end)
   2510 	return entry_end;
   2511     }
   2512 
   2513   return max (highest_data, data);
   2514 }
   2515 
   2516 /* Display the contents of a .rsrc section.  We do not try to
   2517    reproduce the resources, windres does that.  Instead we dump
   2518    the tables in a human readable format.  */
   2519 
   2520 static bfd_boolean
   2521 rsrc_print_section (bfd * abfd, void * vfile)
   2522 {
   2523   bfd_vma rva_bias;
   2524   pe_data_type * pe;
   2525   FILE * file = (FILE *) vfile;
   2526   bfd_size_type datasize;
   2527   asection * section;
   2528   bfd_byte * data;
   2529   rsrc_regions regions;
   2530 
   2531   pe = pe_data (abfd);
   2532   if (pe == NULL)
   2533     return TRUE;
   2534 
   2535   section = bfd_get_section_by_name (abfd, ".rsrc");
   2536   if (section == NULL)
   2537     return TRUE;
   2538   if (!(section->flags & SEC_HAS_CONTENTS))
   2539     return TRUE;
   2540 
   2541   datasize = section->size;
   2542   if (datasize == 0)
   2543     return TRUE;
   2544 
   2545   rva_bias = section->vma - pe->pe_opthdr.ImageBase;
   2546 
   2547   if (! bfd_malloc_and_get_section (abfd, section, & data))
   2548     {
   2549       if (data != NULL)
   2550 	free (data);
   2551       return FALSE;
   2552     }
   2553 
   2554   regions.section_start = data;
   2555   regions.section_end = data + datasize;
   2556   regions.strings_start = NULL;
   2557   regions.resource_start = NULL;
   2558 
   2559   fflush (file);
   2560   fprintf (file, "\nThe .rsrc Resource Directory section:\n");
   2561 
   2562   while (data < regions.section_end)
   2563     {
   2564       bfd_byte * p = data;
   2565 
   2566       data = rsrc_print_resource_directory (file, abfd, 0, data, & regions, rva_bias);
   2567 
   2568       if (data == regions.section_end + 1)
   2569 	fprintf (file, _("Corrupt .rsrc section detected!\n"));
   2570       else
   2571 	{
   2572 	  /* Align data before continuing.  */
   2573 	  int align = (1 << section->alignment_power) - 1;
   2574 
   2575 	  data = (bfd_byte *) (((ptrdiff_t) (data + align)) & ~ align);
   2576 	  rva_bias += data - p;
   2577 
   2578 	  /* For reasons that are unclear .rsrc sections are sometimes created
   2579 	     aligned to a 1^3 boundary even when their alignment is set at
   2580 	     1^2.  Catch that case here before we issue a spurious warning
   2581 	     message.  */
   2582 	  if (data == (regions.section_end - 4))
   2583 	    data = regions.section_end;
   2584 	  else if (data < regions.section_end)
   2585 	    {
   2586 	      /* If the extra data is all zeros then do not complain.
   2587 		 This is just padding so that the section meets the
   2588 		 page size requirements.  */
   2589 	      while (++ data < regions.section_end)
   2590 		if (*data != 0)
   2591 		  break;
   2592 	      if (data < regions.section_end)
   2593 		fprintf (file, _("\nWARNING: Extra data in .rsrc section - it will be ignored by Windows:\n"));
   2594 	    }
   2595 	}
   2596     }
   2597 
   2598   if (regions.strings_start != NULL)
   2599     fprintf (file, _(" String table starts at offset: %#03x\n"),
   2600 	     (int) (regions.strings_start - regions.section_start));
   2601   if (regions.resource_start != NULL)
   2602     fprintf (file, _(" Resources start at offset: %#03x\n"),
   2603 	     (int) (regions.resource_start - regions.section_start));
   2604 
   2605   free (regions.section_start);
   2606   return TRUE;
   2607 }
   2608 
   2609 #define IMAGE_NUMBEROF_DEBUG_TYPES 12
   2610 
   2611 static char * debug_type_names[IMAGE_NUMBEROF_DEBUG_TYPES] =
   2612 {
   2613   "Unknown",
   2614   "COFF",
   2615   "CodeView",
   2616   "FPO",
   2617   "Misc",
   2618   "Exception",
   2619   "Fixup",
   2620   "OMAP-to-SRC",
   2621   "OMAP-from-SRC",
   2622   "Borland",
   2623   "Reserved",
   2624   "CLSID",
   2625 };
   2626 
   2627 static bfd_boolean
   2628 pe_print_debugdata (bfd * abfd, void * vfile)
   2629 {
   2630   FILE *file = (FILE *) vfile;
   2631   pe_data_type *pe = pe_data (abfd);
   2632   struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
   2633   asection *section;
   2634   bfd_byte *data = 0;
   2635   bfd_size_type dataoff;
   2636   unsigned int i;
   2637 
   2638   bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
   2639   bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
   2640 
   2641   if (size == 0)
   2642     return TRUE;
   2643 
   2644   addr += extra->ImageBase;
   2645   for (section = abfd->sections; section != NULL; section = section->next)
   2646     {
   2647       if ((addr >= section->vma) && (addr < (section->vma + section->size)))
   2648 	break;
   2649     }
   2650 
   2651   if (section == NULL)
   2652     {
   2653       fprintf (file,
   2654 	       _("\nThere is a debug directory, but the section containing it could not be found\n"));
   2655       return TRUE;
   2656     }
   2657   else if (!(section->flags & SEC_HAS_CONTENTS))
   2658     {
   2659       fprintf (file,
   2660 	       _("\nThere is a debug directory in %s, but that section has no contents\n"),
   2661 	       section->name);
   2662       return TRUE;
   2663     }
   2664   else if (section->size < size)
   2665     {
   2666       fprintf (file,
   2667 	       _("\nError: section %s contains the debug data starting address but it is too small\n"),
   2668 	       section->name);
   2669       return FALSE;
   2670     }
   2671 
   2672   fprintf (file, _("\nThere is a debug directory in %s at 0x%lx\n\n"),
   2673 	   section->name, (unsigned long) addr);
   2674 
   2675   dataoff = addr - section->vma;
   2676 
   2677   if (size > (section->size - dataoff))
   2678     {
   2679       fprintf (file, _("The debug data size field in the data directory is too big for the section"));
   2680       return FALSE;
   2681     }
   2682 
   2683   fprintf (file,
   2684 	   _("Type                Size     Rva      Offset\n"));
   2685 
   2686   /* Read the whole section.  */
   2687   if (!bfd_malloc_and_get_section (abfd, section, &data))
   2688     {
   2689       if (data != NULL)
   2690 	free (data);
   2691       return FALSE;
   2692     }
   2693 
   2694   for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
   2695     {
   2696       const char *type_name;
   2697       struct external_IMAGE_DEBUG_DIRECTORY *ext
   2698 	= &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i];
   2699       struct internal_IMAGE_DEBUG_DIRECTORY idd;
   2700 
   2701       _bfd_XXi_swap_debugdir_in (abfd, ext, &idd);
   2702 
   2703       if ((idd.Type) >= IMAGE_NUMBEROF_DEBUG_TYPES)
   2704 	type_name = debug_type_names[0];
   2705       else
   2706 	type_name = debug_type_names[idd.Type];
   2707 
   2708       fprintf (file, " %2ld  %14s %08lx %08lx %08lx\n",
   2709 	       idd.Type, type_name, idd.SizeOfData,
   2710 	       idd.AddressOfRawData, idd.PointerToRawData);
   2711 
   2712       if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW)
   2713 	{
   2714 	  char signature[CV_INFO_SIGNATURE_LENGTH * 2 + 1];
   2715 	  /* PR 17512: file: 065-29434-0.001:0.1
   2716 	     We need to use a 32-bit aligned buffer
   2717 	     to safely read in a codeview record.  */
   2718 	  char buffer[256 + 1] ATTRIBUTE_ALIGNED_ALIGNOF (CODEVIEW_INFO);
   2719 
   2720 	  CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer;
   2721 
   2722 	  /* The debug entry doesn't have to have to be in a section,
   2723 	     in which case AddressOfRawData is 0, so always use PointerToRawData.  */
   2724 	  if (!_bfd_XXi_slurp_codeview_record (abfd, (file_ptr) idd.PointerToRawData,
   2725 					       idd.SizeOfData, cvinfo))
   2726 	    continue;
   2727 
   2728 	  for (i = 0; i < cvinfo->SignatureLength; i++)
   2729 	    sprintf (&signature[i*2], "%02x", cvinfo->Signature[i] & 0xff);
   2730 
   2731 	  /* xgettext:c-format */
   2732 	  fprintf (file, _("(format %c%c%c%c signature %s age %ld)\n"),
   2733 		   buffer[0], buffer[1], buffer[2], buffer[3],
   2734 		   signature, cvinfo->Age);
   2735 	}
   2736     }
   2737 
   2738   if (size % sizeof (struct external_IMAGE_DEBUG_DIRECTORY) != 0)
   2739     fprintf (file,
   2740 	    _("The debug directory size is not a multiple of the debug directory entry size\n"));
   2741 
   2742   return TRUE;
   2743 }
   2744 
   2745 /* Print out the program headers.  */
   2746 
   2747 bfd_boolean
   2748 _bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile)
   2749 {
   2750   FILE *file = (FILE *) vfile;
   2751   int j;
   2752   pe_data_type *pe = pe_data (abfd);
   2753   struct internal_extra_pe_aouthdr *i = &pe->pe_opthdr;
   2754   const char *subsystem_name = NULL;
   2755   const char *name;
   2756 
   2757   /* The MS dumpbin program reportedly ands with 0xff0f before
   2758      printing the characteristics field.  Not sure why.  No reason to
   2759      emulate it here.  */
   2760   fprintf (file, _("\nCharacteristics 0x%x\n"), pe->real_flags);
   2761 #undef PF
   2762 #define PF(x, y) if (pe->real_flags & x) { fprintf (file, "\t%s\n", y); }
   2763   PF (IMAGE_FILE_RELOCS_STRIPPED, "relocations stripped");
   2764   PF (IMAGE_FILE_EXECUTABLE_IMAGE, "executable");
   2765   PF (IMAGE_FILE_LINE_NUMS_STRIPPED, "line numbers stripped");
   2766   PF (IMAGE_FILE_LOCAL_SYMS_STRIPPED, "symbols stripped");
   2767   PF (IMAGE_FILE_LARGE_ADDRESS_AWARE, "large address aware");
   2768   PF (IMAGE_FILE_BYTES_REVERSED_LO, "little endian");
   2769   PF (IMAGE_FILE_32BIT_MACHINE, "32 bit words");
   2770   PF (IMAGE_FILE_DEBUG_STRIPPED, "debugging information removed");
   2771   PF (IMAGE_FILE_SYSTEM, "system file");
   2772   PF (IMAGE_FILE_DLL, "DLL");
   2773   PF (IMAGE_FILE_BYTES_REVERSED_HI, "big endian");
   2774 #undef PF
   2775 
   2776   /* ctime implies '\n'.  */
   2777   {
   2778     time_t t = pe->coff.timestamp;
   2779     fprintf (file, "\nTime/Date\t\t%s", ctime (&t));
   2780   }
   2781 
   2782 #ifndef IMAGE_NT_OPTIONAL_HDR_MAGIC
   2783 # define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b
   2784 #endif
   2785 #ifndef IMAGE_NT_OPTIONAL_HDR64_MAGIC
   2786 # define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
   2787 #endif
   2788 #ifndef IMAGE_NT_OPTIONAL_HDRROM_MAGIC
   2789 # define IMAGE_NT_OPTIONAL_HDRROM_MAGIC 0x107
   2790 #endif
   2791 
   2792   switch (i->Magic)
   2793     {
   2794     case IMAGE_NT_OPTIONAL_HDR_MAGIC:
   2795       name = "PE32";
   2796       break;
   2797     case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
   2798       name = "PE32+";
   2799       break;
   2800     case IMAGE_NT_OPTIONAL_HDRROM_MAGIC:
   2801       name = "ROM";
   2802       break;
   2803     default:
   2804       name = NULL;
   2805       break;
   2806     }
   2807   fprintf (file, "Magic\t\t\t%04x", i->Magic);
   2808   if (name)
   2809     fprintf (file, "\t(%s)",name);
   2810   fprintf (file, "\nMajorLinkerVersion\t%d\n", i->MajorLinkerVersion);
   2811   fprintf (file, "MinorLinkerVersion\t%d\n", i->MinorLinkerVersion);
   2812   fprintf (file, "SizeOfCode\t\t%08lx\n", (unsigned long) i->SizeOfCode);
   2813   fprintf (file, "SizeOfInitializedData\t%08lx\n",
   2814 	   (unsigned long) i->SizeOfInitializedData);
   2815   fprintf (file, "SizeOfUninitializedData\t%08lx\n",
   2816 	   (unsigned long) i->SizeOfUninitializedData);
   2817   fprintf (file, "AddressOfEntryPoint\t");
   2818   bfd_fprintf_vma (abfd, file, i->AddressOfEntryPoint);
   2819   fprintf (file, "\nBaseOfCode\t\t");
   2820   bfd_fprintf_vma (abfd, file, i->BaseOfCode);
   2821 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
   2822   /* PE32+ does not have BaseOfData member!  */
   2823   fprintf (file, "\nBaseOfData\t\t");
   2824   bfd_fprintf_vma (abfd, file, i->BaseOfData);
   2825 #endif
   2826 
   2827   fprintf (file, "\nImageBase\t\t");
   2828   bfd_fprintf_vma (abfd, file, i->ImageBase);
   2829   fprintf (file, "\nSectionAlignment\t");
   2830   bfd_fprintf_vma (abfd, file, i->SectionAlignment);
   2831   fprintf (file, "\nFileAlignment\t\t");
   2832   bfd_fprintf_vma (abfd, file, i->FileAlignment);
   2833   fprintf (file, "\nMajorOSystemVersion\t%d\n", i->MajorOperatingSystemVersion);
   2834   fprintf (file, "MinorOSystemVersion\t%d\n", i->MinorOperatingSystemVersion);
   2835   fprintf (file, "MajorImageVersion\t%d\n", i->MajorImageVersion);
   2836   fprintf (file, "MinorImageVersion\t%d\n", i->MinorImageVersion);
   2837   fprintf (file, "MajorSubsystemVersion\t%d\n", i->MajorSubsystemVersion);
   2838   fprintf (file, "MinorSubsystemVersion\t%d\n", i->MinorSubsystemVersion);
   2839   fprintf (file, "Win32Version\t\t%08lx\n", (unsigned long) i->Reserved1);
   2840   fprintf (file, "SizeOfImage\t\t%08lx\n", (unsigned long) i->SizeOfImage);
   2841   fprintf (file, "SizeOfHeaders\t\t%08lx\n", (unsigned long) i->SizeOfHeaders);
   2842   fprintf (file, "CheckSum\t\t%08lx\n", (unsigned long) i->CheckSum);
   2843 
   2844   switch (i->Subsystem)
   2845     {
   2846     case IMAGE_SUBSYSTEM_UNKNOWN:
   2847       subsystem_name = "unspecified";
   2848       break;
   2849     case IMAGE_SUBSYSTEM_NATIVE:
   2850       subsystem_name = "NT native";
   2851       break;
   2852     case IMAGE_SUBSYSTEM_WINDOWS_GUI:
   2853       subsystem_name = "Windows GUI";
   2854       break;
   2855     case IMAGE_SUBSYSTEM_WINDOWS_CUI:
   2856       subsystem_name = "Windows CUI";
   2857       break;
   2858     case IMAGE_SUBSYSTEM_POSIX_CUI:
   2859       subsystem_name = "POSIX CUI";
   2860       break;
   2861     case IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:
   2862       subsystem_name = "Wince CUI";
   2863       break;
   2864     // These are from UEFI Platform Initialization Specification 1.1.
   2865     case IMAGE_SUBSYSTEM_EFI_APPLICATION:
   2866       subsystem_name = "EFI application";
   2867       break;
   2868     case IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:
   2869       subsystem_name = "EFI boot service driver";
   2870       break;
   2871     case IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
   2872       subsystem_name = "EFI runtime driver";
   2873       break;
   2874     case IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER:
   2875       subsystem_name = "SAL runtime driver";
   2876       break;
   2877     // This is from revision 8.0 of the MS PE/COFF spec
   2878     case IMAGE_SUBSYSTEM_XBOX:
   2879       subsystem_name = "XBOX";
   2880       break;
   2881     // Added default case for clarity - subsystem_name is NULL anyway.
   2882     default:
   2883       subsystem_name = NULL;
   2884     }
   2885 
   2886   fprintf (file, "Subsystem\t\t%08x", i->Subsystem);
   2887   if (subsystem_name)
   2888     fprintf (file, "\t(%s)", subsystem_name);
   2889   fprintf (file, "\nDllCharacteristics\t%08x\n", i->DllCharacteristics);
   2890   fprintf (file, "SizeOfStackReserve\t");
   2891   bfd_fprintf_vma (abfd, file, i->SizeOfStackReserve);
   2892   fprintf (file, "\nSizeOfStackCommit\t");
   2893   bfd_fprintf_vma (abfd, file, i->SizeOfStackCommit);
   2894   fprintf (file, "\nSizeOfHeapReserve\t");
   2895   bfd_fprintf_vma (abfd, file, i->SizeOfHeapReserve);
   2896   fprintf (file, "\nSizeOfHeapCommit\t");
   2897   bfd_fprintf_vma (abfd, file, i->SizeOfHeapCommit);
   2898   fprintf (file, "\nLoaderFlags\t\t%08lx\n", (unsigned long) i->LoaderFlags);
   2899   fprintf (file, "NumberOfRvaAndSizes\t%08lx\n",
   2900 	   (unsigned long) i->NumberOfRvaAndSizes);
   2901 
   2902   fprintf (file, "\nThe Data Directory\n");
   2903   for (j = 0; j < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; j++)
   2904     {
   2905       fprintf (file, "Entry %1x ", j);
   2906       bfd_fprintf_vma (abfd, file, i->DataDirectory[j].VirtualAddress);
   2907       fprintf (file, " %08lx ", (unsigned long) i->DataDirectory[j].Size);
   2908       fprintf (file, "%s\n", dir_names[j]);
   2909     }
   2910 
   2911   pe_print_idata (abfd, vfile);
   2912   pe_print_edata (abfd, vfile);
   2913   if (bfd_coff_have_print_pdata (abfd))
   2914     bfd_coff_print_pdata (abfd, vfile);
   2915   else
   2916     pe_print_pdata (abfd, vfile);
   2917   pe_print_reloc (abfd, vfile);
   2918   pe_print_debugdata (abfd, file);
   2919 
   2920   rsrc_print_section (abfd, vfile);
   2921 
   2922   return TRUE;
   2923 }
   2924 
   2925 static bfd_boolean
   2926 is_vma_in_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sect, void *obj)
   2927 {
   2928   bfd_vma addr = * (bfd_vma *) obj;
   2929   return (addr >= sect->vma) && (addr < (sect->vma + sect->size));
   2930 }
   2931 
   2932 static asection *
   2933 find_section_by_vma (bfd *abfd, bfd_vma addr)
   2934 {
   2935   return bfd_sections_find_if (abfd, is_vma_in_section, (void *) & addr);
   2936 }
   2937 
   2938 /* Copy any private info we understand from the input bfd
   2939    to the output bfd.  */
   2940 
   2941 bfd_boolean
   2942 _bfd_XX_bfd_copy_private_bfd_data_common (bfd * ibfd, bfd * obfd)
   2943 {
   2944   pe_data_type *ipe, *ope;
   2945 
   2946   /* One day we may try to grok other private data.  */
   2947   if (ibfd->xvec->flavour != bfd_target_coff_flavour
   2948       || obfd->xvec->flavour != bfd_target_coff_flavour)
   2949     return TRUE;
   2950 
   2951   ipe = pe_data (ibfd);
   2952   ope = pe_data (obfd);
   2953 
   2954   /* pe_opthdr is copied in copy_object.  */
   2955   ope->dll = ipe->dll;
   2956 
   2957   /* Don't copy input subsystem if output is different from input.  */
   2958   if (obfd->xvec != ibfd->xvec)
   2959     ope->pe_opthdr.Subsystem = IMAGE_SUBSYSTEM_UNKNOWN;
   2960 
   2961   /* For strip: if we removed .reloc, we'll make a real mess of things
   2962      if we don't remove this entry as well.  */
   2963   if (! pe_data (obfd)->has_reloc_section)
   2964     {
   2965       pe_data (obfd)->pe_opthdr.DataDirectory[PE_BASE_RELOCATION_TABLE].VirtualAddress = 0;
   2966       pe_data (obfd)->pe_opthdr.DataDirectory[PE_BASE_RELOCATION_TABLE].Size = 0;
   2967     }
   2968 
   2969   /* For PIE, if there is .reloc, we won't add IMAGE_FILE_RELOCS_STRIPPED.
   2970      But there is no .reloc, we make sure that IMAGE_FILE_RELOCS_STRIPPED
   2971      won't be added.  */
   2972   if (! pe_data (ibfd)->has_reloc_section
   2973       && ! (pe_data (ibfd)->real_flags & IMAGE_FILE_RELOCS_STRIPPED))
   2974     pe_data (obfd)->dont_strip_reloc = 1;
   2975 
   2976   /* The file offsets contained in the debug directory need rewriting.  */
   2977   if (ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size != 0)
   2978     {
   2979       bfd_vma addr = ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].VirtualAddress
   2980 	+ ope->pe_opthdr.ImageBase;
   2981       asection *section = find_section_by_vma (obfd, addr);
   2982       bfd_byte *data;
   2983 
   2984       if (section && bfd_malloc_and_get_section (obfd, section, &data))
   2985 	{
   2986 	  unsigned int i;
   2987 	  struct external_IMAGE_DEBUG_DIRECTORY *dd =
   2988 	    (struct external_IMAGE_DEBUG_DIRECTORY *)(data + (addr - section->vma));
   2989 
   2990 	  /* PR 17512: file: 0f15796a.  */
   2991 	  if ((unsigned long) ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size
   2992 	      > section->size - (addr - section->vma))
   2993 	    {
   2994 	      /* xgettext:c-format */
   2995 	      _bfd_error_handler
   2996 		(_("%pB: Data Directory size (%lx) "
   2997 		   "exceeds space left in section (%" PRIx64 ")"),
   2998 		 obfd, ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size,
   2999 		 (uint64_t) (section->size - (addr - section->vma)));
   3000 	      free (data);
   3001 	      return FALSE;
   3002 	    }
   3003 
   3004 	  for (i = 0; i < ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size
   3005 		 / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
   3006 	    {
   3007 	      asection *ddsection;
   3008 	      struct external_IMAGE_DEBUG_DIRECTORY *edd = &(dd[i]);
   3009 	      struct internal_IMAGE_DEBUG_DIRECTORY idd;
   3010 
   3011 	      _bfd_XXi_swap_debugdir_in (obfd, edd, &idd);
   3012 
   3013 	      if (idd.AddressOfRawData == 0)
   3014 		continue; /* RVA 0 means only offset is valid, not handled yet.  */
   3015 
   3016 	      ddsection = find_section_by_vma (obfd, idd.AddressOfRawData + ope->pe_opthdr.ImageBase);
   3017 	      if (!ddsection)
   3018 		continue; /* Not in a section! */
   3019 
   3020 	      idd.PointerToRawData = ddsection->filepos + (idd.AddressOfRawData
   3021 							   + ope->pe_opthdr.ImageBase) - ddsection->vma;
   3022 
   3023 	      _bfd_XXi_swap_debugdir_out (obfd, &idd, edd);
   3024 	    }
   3025 
   3026 	  if (!bfd_set_section_contents (obfd, section, data, 0, section->size))
   3027 	    {
   3028 	      _bfd_error_handler (_("failed to update file offsets in debug directory"));
   3029 	      free (data);
   3030 	      return FALSE;
   3031 	    }
   3032 	  free (data);
   3033 	}
   3034       else if (section)
   3035 	{
   3036 	  _bfd_error_handler (_("%pB: failed to read debug data section"), obfd);
   3037 	  return FALSE;
   3038 	}
   3039     }
   3040 
   3041   return TRUE;
   3042 }
   3043 
   3044 /* Copy private section data.  */
   3045 
   3046 bfd_boolean
   3047 _bfd_XX_bfd_copy_private_section_data (bfd *ibfd,
   3048 				       asection *isec,
   3049 				       bfd *obfd,
   3050 				       asection *osec)
   3051 {
   3052   if (bfd_get_flavour (ibfd) != bfd_target_coff_flavour
   3053       || bfd_get_flavour (obfd) != bfd_target_coff_flavour)
   3054     return TRUE;
   3055 
   3056   if (coff_section_data (ibfd, isec) != NULL
   3057       && pei_section_data (ibfd, isec) != NULL)
   3058     {
   3059       if (coff_section_data (obfd, osec) == NULL)
   3060 	{
   3061 	  bfd_size_type amt = sizeof (struct coff_section_tdata);
   3062 	  osec->used_by_bfd = bfd_zalloc (obfd, amt);
   3063 	  if (osec->used_by_bfd == NULL)
   3064 	    return FALSE;
   3065 	}
   3066 
   3067       if (pei_section_data (obfd, osec) == NULL)
   3068 	{
   3069 	  bfd_size_type amt = sizeof (struct pei_section_tdata);
   3070 	  coff_section_data (obfd, osec)->tdata = bfd_zalloc (obfd, amt);
   3071 	  if (coff_section_data (obfd, osec)->tdata == NULL)
   3072 	    return FALSE;
   3073 	}
   3074 
   3075       pei_section_data (obfd, osec)->virt_size =
   3076 	pei_section_data (ibfd, isec)->virt_size;
   3077       pei_section_data (obfd, osec)->pe_flags =
   3078 	pei_section_data (ibfd, isec)->pe_flags;
   3079     }
   3080 
   3081   return TRUE;
   3082 }
   3083 
   3084 void
   3085 _bfd_XX_get_symbol_info (bfd * abfd, asymbol *symbol, symbol_info *ret)
   3086 {
   3087   coff_get_symbol_info (abfd, symbol, ret);
   3088 }
   3089 
   3090 #if !defined(COFF_WITH_pep) && defined(COFF_WITH_pex64)
   3091 static int
   3092 sort_x64_pdata (const void *l, const void *r)
   3093 {
   3094   const char *lp = (const char *) l;
   3095   const char *rp = (const char *) r;
   3096   bfd_vma vl, vr;
   3097   vl = bfd_getl32 (lp); vr = bfd_getl32 (rp);
   3098   if (vl != vr)
   3099     return (vl < vr ? -1 : 1);
   3100   /* We compare just begin address.  */
   3101   return 0;
   3102 }
   3103 #endif
   3104 
   3105 /* Functions to process a .rsrc section.  */
   3107 
   3108 static unsigned int sizeof_leaves;
   3109 static unsigned int sizeof_strings;
   3110 static unsigned int sizeof_tables_and_entries;
   3111 
   3112 static bfd_byte *
   3113 rsrc_count_directory (bfd *, bfd_byte *, bfd_byte *, bfd_byte *, bfd_vma);
   3114 
   3115 static bfd_byte *
   3116 rsrc_count_entries (bfd *	   abfd,
   3117 		    bfd_boolean	   is_name,
   3118 		    bfd_byte *	   datastart,
   3119 		    bfd_byte *	   data,
   3120 		    bfd_byte *	   dataend,
   3121 		    bfd_vma	   rva_bias)
   3122 {
   3123   unsigned long entry, addr, size;
   3124 
   3125   if (data + 8 >= dataend)
   3126     return dataend + 1;
   3127 
   3128   if (is_name)
   3129     {
   3130       bfd_byte * name;
   3131 
   3132       entry = (long) bfd_get_32 (abfd, data);
   3133 
   3134       if (HighBitSet (entry))
   3135 	name = datastart + WithoutHighBit (entry);
   3136       else
   3137 	name = datastart + entry - rva_bias;
   3138 
   3139       if (name + 2 >= dataend || name < datastart)
   3140 	return dataend + 1;
   3141 
   3142       unsigned int len = bfd_get_16 (abfd, name);
   3143       if (len == 0 || len > 256)
   3144 	return dataend + 1;
   3145     }
   3146 
   3147   entry = (long) bfd_get_32 (abfd, data + 4);
   3148 
   3149   if (HighBitSet (entry))
   3150     {
   3151       data = datastart + WithoutHighBit (entry);
   3152 
   3153       if (data <= datastart || data >= dataend)
   3154 	return dataend + 1;
   3155 
   3156       return rsrc_count_directory (abfd, datastart, data, dataend, rva_bias);
   3157     }
   3158 
   3159   if (datastart + entry + 16 >= dataend)
   3160     return dataend + 1;
   3161 
   3162   addr = (long) bfd_get_32 (abfd, datastart + entry);
   3163   size = (long) bfd_get_32 (abfd, datastart + entry + 4);
   3164 
   3165   return datastart + addr - rva_bias + size;
   3166 }
   3167 
   3168 static bfd_byte *
   3169 rsrc_count_directory (bfd *	     abfd,
   3170 		      bfd_byte *     datastart,
   3171 		      bfd_byte *     data,
   3172 		      bfd_byte *     dataend,
   3173 		      bfd_vma	     rva_bias)
   3174 {
   3175   unsigned int  num_entries, num_ids;
   3176   bfd_byte *    highest_data = data;
   3177 
   3178   if (data + 16 >= dataend)
   3179     return dataend + 1;
   3180 
   3181   num_entries  = (int) bfd_get_16 (abfd, data + 12);
   3182   num_ids      = (int) bfd_get_16 (abfd, data + 14);
   3183 
   3184   num_entries += num_ids;
   3185 
   3186   data += 16;
   3187 
   3188   while (num_entries --)
   3189     {
   3190       bfd_byte * entry_end;
   3191 
   3192       entry_end = rsrc_count_entries (abfd, num_entries >= num_ids,
   3193 				      datastart, data, dataend, rva_bias);
   3194       data += 8;
   3195       highest_data = max (highest_data, entry_end);
   3196       if (entry_end >= dataend)
   3197 	break;
   3198     }
   3199 
   3200   return max (highest_data, data);
   3201 }
   3202 
   3203 typedef struct rsrc_dir_chain
   3204 {
   3205   unsigned int	       num_entries;
   3206   struct rsrc_entry *  first_entry;
   3207   struct rsrc_entry *  last_entry;
   3208 } rsrc_dir_chain;
   3209 
   3210 typedef struct rsrc_directory
   3211 {
   3212   unsigned int characteristics;
   3213   unsigned int time;
   3214   unsigned int major;
   3215   unsigned int minor;
   3216 
   3217   rsrc_dir_chain names;
   3218   rsrc_dir_chain ids;
   3219 
   3220   struct rsrc_entry * entry;
   3221 } rsrc_directory;
   3222 
   3223 typedef struct rsrc_string
   3224 {
   3225   unsigned int	len;
   3226   bfd_byte *	string;
   3227 } rsrc_string;
   3228 
   3229 typedef struct rsrc_leaf
   3230 {
   3231   unsigned int	size;
   3232   unsigned int	codepage;
   3233   bfd_byte *	data;
   3234 } rsrc_leaf;
   3235 
   3236 typedef struct rsrc_entry
   3237 {
   3238   bfd_boolean is_name;
   3239   union
   3240   {
   3241     unsigned int	  id;
   3242     struct rsrc_string	  name;
   3243   } name_id;
   3244 
   3245   bfd_boolean is_dir;
   3246   union
   3247   {
   3248     struct rsrc_directory * directory;
   3249     struct rsrc_leaf *	    leaf;
   3250   } value;
   3251 
   3252   struct rsrc_entry *	  next_entry;
   3253   struct rsrc_directory * parent;
   3254 } rsrc_entry;
   3255 
   3256 static bfd_byte *
   3257 rsrc_parse_directory (bfd *, rsrc_directory *, bfd_byte *,
   3258 		      bfd_byte *, bfd_byte *, bfd_vma, rsrc_entry *);
   3259 
   3260 static bfd_byte *
   3261 rsrc_parse_entry (bfd *		   abfd,
   3262 		  bfd_boolean	   is_name,
   3263 		  rsrc_entry *	   entry,
   3264 		  bfd_byte *	   datastart,
   3265 		  bfd_byte *	   data,
   3266 		  bfd_byte *	   dataend,
   3267 		  bfd_vma	   rva_bias,
   3268 		  rsrc_directory * parent)
   3269 {
   3270   unsigned long val, addr, size;
   3271 
   3272   val = bfd_get_32 (abfd, data);
   3273 
   3274   entry->parent = parent;
   3275   entry->is_name = is_name;
   3276 
   3277   if (is_name)
   3278     {
   3279       bfd_byte * address;
   3280 
   3281       if (HighBitSet (val))
   3282 	{
   3283 	  val = WithoutHighBit (val);
   3284 
   3285 	  address = datastart + val;
   3286 	}
   3287       else
   3288 	{
   3289 	  address = datastart + val - rva_bias;
   3290 	}
   3291 
   3292       if (address + 3 > dataend)
   3293 	return dataend;
   3294 
   3295       entry->name_id.name.len    = bfd_get_16 (abfd, address);
   3296       entry->name_id.name.string = address + 2;
   3297     }
   3298   else
   3299     entry->name_id.id = val;
   3300 
   3301   val = bfd_get_32 (abfd, data + 4);
   3302 
   3303   if (HighBitSet (val))
   3304     {
   3305       entry->is_dir = TRUE;
   3306       entry->value.directory = bfd_malloc (sizeof * entry->value.directory);
   3307       if (entry->value.directory == NULL)
   3308 	return dataend;
   3309 
   3310       return rsrc_parse_directory (abfd, entry->value.directory,
   3311 				   datastart,
   3312 				   datastart + WithoutHighBit (val),
   3313 				   dataend, rva_bias, entry);
   3314     }
   3315 
   3316   entry->is_dir = FALSE;
   3317   entry->value.leaf = bfd_malloc (sizeof * entry->value.leaf);
   3318   if (entry->value.leaf == NULL)
   3319     return dataend;
   3320 
   3321   data = datastart + val;
   3322   if (data < datastart || data >= dataend)
   3323     return dataend;
   3324 
   3325   addr = bfd_get_32 (abfd, data);
   3326   size = entry->value.leaf->size = bfd_get_32 (abfd, data + 4);
   3327   entry->value.leaf->codepage = bfd_get_32 (abfd, data + 8);
   3328   /* FIXME: We assume that the reserved field (data + 12) is OK.  */
   3329 
   3330   entry->value.leaf->data = bfd_malloc (size);
   3331   if (entry->value.leaf->data == NULL)
   3332     return dataend;
   3333 
   3334   memcpy (entry->value.leaf->data, datastart + addr - rva_bias, size);
   3335   return datastart + (addr - rva_bias) + size;
   3336 }
   3337 
   3338 static bfd_byte *
   3339 rsrc_parse_entries (bfd *	     abfd,
   3340 		    rsrc_dir_chain * chain,
   3341 		    bfd_boolean	     is_name,
   3342 		    bfd_byte *	     highest_data,
   3343 		    bfd_byte *	     datastart,
   3344 		    bfd_byte *	     data,
   3345 		    bfd_byte *	     dataend,
   3346 		    bfd_vma	     rva_bias,
   3347 		    rsrc_directory * parent)
   3348 {
   3349   unsigned int i;
   3350   rsrc_entry * entry;
   3351 
   3352   if (chain->num_entries == 0)
   3353     {
   3354       chain->first_entry = chain->last_entry = NULL;
   3355       return highest_data;
   3356     }
   3357 
   3358   entry = bfd_malloc (sizeof * entry);
   3359   if (entry == NULL)
   3360     return dataend;
   3361 
   3362   chain->first_entry = entry;
   3363 
   3364   for (i = chain->num_entries; i--;)
   3365     {
   3366       bfd_byte * entry_end;
   3367 
   3368       entry_end = rsrc_parse_entry (abfd, is_name, entry, datastart,
   3369 				    data, dataend, rva_bias, parent);
   3370       data += 8;
   3371       highest_data = max (entry_end, highest_data);
   3372       if (entry_end > dataend)
   3373 	return dataend;
   3374 
   3375       if (i)
   3376 	{
   3377 	  entry->next_entry = bfd_malloc (sizeof * entry);
   3378 	  entry = entry->next_entry;
   3379 	  if (entry == NULL)
   3380 	    return dataend;
   3381 	}
   3382       else
   3383 	entry->next_entry = NULL;
   3384     }
   3385 
   3386   chain->last_entry = entry;
   3387 
   3388   return highest_data;
   3389 }
   3390 
   3391 static bfd_byte *
   3392 rsrc_parse_directory (bfd *	       abfd,
   3393 		      rsrc_directory * table,
   3394 		      bfd_byte *       datastart,
   3395 		      bfd_byte *       data,
   3396 		      bfd_byte *       dataend,
   3397 		      bfd_vma	       rva_bias,
   3398 		      rsrc_entry *     entry)
   3399 {
   3400   bfd_byte * highest_data = data;
   3401 
   3402   if (table == NULL)
   3403     return dataend;
   3404 
   3405   table->characteristics = bfd_get_32 (abfd, data);
   3406   table->time = bfd_get_32 (abfd, data + 4);
   3407   table->major = bfd_get_16 (abfd, data + 8);
   3408   table->minor = bfd_get_16 (abfd, data + 10);
   3409   table->names.num_entries = bfd_get_16 (abfd, data + 12);
   3410   table->ids.num_entries = bfd_get_16 (abfd, data + 14);
   3411   table->entry = entry;
   3412 
   3413   data += 16;
   3414 
   3415   highest_data = rsrc_parse_entries (abfd, & table->names, TRUE, data,
   3416 				     datastart, data, dataend, rva_bias, table);
   3417   data += table->names.num_entries * 8;
   3418 
   3419   highest_data = rsrc_parse_entries (abfd, & table->ids, FALSE, highest_data,
   3420 				     datastart, data, dataend, rva_bias, table);
   3421   data += table->ids.num_entries * 8;
   3422 
   3423   return max (highest_data, data);
   3424 }
   3425 
   3426 typedef struct rsrc_write_data
   3427 {
   3428   bfd *      abfd;
   3429   bfd_byte * datastart;
   3430   bfd_byte * next_table;
   3431   bfd_byte * next_leaf;
   3432   bfd_byte * next_string;
   3433   bfd_byte * next_data;
   3434   bfd_vma    rva_bias;
   3435 } rsrc_write_data;
   3436 
   3437 static void
   3438 rsrc_write_string (rsrc_write_data * data,
   3439 		   rsrc_string *     string)
   3440 {
   3441   bfd_put_16 (data->abfd, string->len, data->next_string);
   3442   memcpy (data->next_string + 2, string->string, string->len * 2);
   3443   data->next_string += (string->len + 1) * 2;
   3444 }
   3445 
   3446 static inline unsigned int
   3447 rsrc_compute_rva (rsrc_write_data * data,
   3448 		  bfd_byte *	    addr)
   3449 {
   3450   return (addr - data->datastart) + data->rva_bias;
   3451 }
   3452 
   3453 static void
   3454 rsrc_write_leaf (rsrc_write_data * data,
   3455 		 rsrc_leaf *	   leaf)
   3456 {
   3457   bfd_put_32 (data->abfd, rsrc_compute_rva (data, data->next_data),
   3458 	      data->next_leaf);
   3459   bfd_put_32 (data->abfd, leaf->size,     data->next_leaf + 4);
   3460   bfd_put_32 (data->abfd, leaf->codepage, data->next_leaf + 8);
   3461   bfd_put_32 (data->abfd, 0 /*reserved*/, data->next_leaf + 12);
   3462   data->next_leaf += 16;
   3463 
   3464   memcpy (data->next_data, leaf->data, leaf->size);
   3465   /* An undocumented feature of Windows resources is that each unit
   3466      of raw data is 8-byte aligned...  */
   3467   data->next_data += ((leaf->size + 7) & ~7);
   3468 }
   3469 
   3470 static void rsrc_write_directory (rsrc_write_data *, rsrc_directory *);
   3471 
   3472 static void
   3473 rsrc_write_entry (rsrc_write_data *  data,
   3474 		  bfd_byte *	     where,
   3475 		  rsrc_entry *	     entry)
   3476 {
   3477   if (entry->is_name)
   3478     {
   3479       bfd_put_32 (data->abfd,
   3480 		  SetHighBit (data->next_string - data->datastart),
   3481 		  where);
   3482       rsrc_write_string (data, & entry->name_id.name);
   3483     }
   3484   else
   3485     bfd_put_32 (data->abfd, entry->name_id.id, where);
   3486 
   3487   if (entry->is_dir)
   3488     {
   3489       bfd_put_32 (data->abfd,
   3490 		  SetHighBit (data->next_table - data->datastart),
   3491 		  where + 4);
   3492       rsrc_write_directory (data, entry->value.directory);
   3493     }
   3494   else
   3495     {
   3496       bfd_put_32 (data->abfd, data->next_leaf - data->datastart, where + 4);
   3497       rsrc_write_leaf (data, entry->value.leaf);
   3498     }
   3499 }
   3500 
   3501 static void
   3502 rsrc_compute_region_sizes (rsrc_directory * dir)
   3503 {
   3504   struct rsrc_entry * entry;
   3505 
   3506   if (dir == NULL)
   3507     return;
   3508 
   3509   sizeof_tables_and_entries += 16;
   3510 
   3511   for (entry = dir->names.first_entry; entry != NULL; entry = entry->next_entry)
   3512     {
   3513       sizeof_tables_and_entries += 8;
   3514 
   3515       sizeof_strings += (entry->name_id.name.len + 1) * 2;
   3516 
   3517       if (entry->is_dir)
   3518 	rsrc_compute_region_sizes (entry->value.directory);
   3519       else
   3520 	sizeof_leaves += 16;
   3521     }
   3522 
   3523   for (entry = dir->ids.first_entry; entry != NULL; entry = entry->next_entry)
   3524     {
   3525       sizeof_tables_and_entries += 8;
   3526 
   3527       if (entry->is_dir)
   3528 	rsrc_compute_region_sizes (entry->value.directory);
   3529       else
   3530 	sizeof_leaves += 16;
   3531     }
   3532 }
   3533 
   3534 static void
   3535 rsrc_write_directory (rsrc_write_data * data,
   3536 		      rsrc_directory *  dir)
   3537 {
   3538   rsrc_entry * entry;
   3539   unsigned int i;
   3540   bfd_byte * next_entry;
   3541   bfd_byte * nt;
   3542 
   3543   bfd_put_32 (data->abfd, dir->characteristics, data->next_table);
   3544   bfd_put_32 (data->abfd, 0 /*dir->time*/, data->next_table + 4);
   3545   bfd_put_16 (data->abfd, dir->major, data->next_table + 8);
   3546   bfd_put_16 (data->abfd, dir->minor, data->next_table + 10);
   3547   bfd_put_16 (data->abfd, dir->names.num_entries, data->next_table + 12);
   3548   bfd_put_16 (data->abfd, dir->ids.num_entries, data->next_table + 14);
   3549 
   3550   /* Compute where the entries and the next table will be placed.  */
   3551   next_entry = data->next_table + 16;
   3552   data->next_table = next_entry + (dir->names.num_entries * 8)
   3553     + (dir->ids.num_entries * 8);
   3554   nt = data->next_table;
   3555 
   3556   /* Write the entries.  */
   3557   for (i = dir->names.num_entries, entry = dir->names.first_entry;
   3558        i > 0 && entry != NULL;
   3559        i--, entry = entry->next_entry)
   3560     {
   3561       BFD_ASSERT (entry->is_name);
   3562       rsrc_write_entry (data, next_entry, entry);
   3563       next_entry += 8;
   3564     }
   3565   BFD_ASSERT (i == 0);
   3566   BFD_ASSERT (entry == NULL);
   3567 
   3568   for (i = dir->ids.num_entries, entry = dir->ids.first_entry;
   3569        i > 0 && entry != NULL;
   3570        i--, entry = entry->next_entry)
   3571     {
   3572       BFD_ASSERT (! entry->is_name);
   3573       rsrc_write_entry (data, next_entry, entry);
   3574       next_entry += 8;
   3575     }
   3576   BFD_ASSERT (i == 0);
   3577   BFD_ASSERT (entry == NULL);
   3578   BFD_ASSERT (nt == next_entry);
   3579 }
   3580 
   3581 #if defined HAVE_WCHAR_H && ! defined __CYGWIN__ && ! defined __MINGW32__
   3582 /* Return the length (number of units) of the first character in S,
   3583    putting its 'ucs4_t' representation in *PUC.  */
   3584 
   3585 static unsigned int
   3586 #if defined HAVE_WCTYPE_H
   3587 u16_mbtouc (wint_t * puc, const unsigned short * s, unsigned int n)
   3588 #else
   3589 u16_mbtouc (wchar_t * puc, const unsigned short * s, unsigned int n)
   3590 #endif
   3591 {
   3592   unsigned short c = * s;
   3593 
   3594   if (c < 0xd800 || c >= 0xe000)
   3595     {
   3596       *puc = c;
   3597       return 1;
   3598     }
   3599 
   3600   if (c < 0xdc00)
   3601     {
   3602       if (n >= 2)
   3603 	{
   3604 	  if (s[1] >= 0xdc00 && s[1] < 0xe000)
   3605 	    {
   3606 	      *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
   3607 	      return 2;
   3608 	    }
   3609 	}
   3610       else
   3611 	{
   3612 	  /* Incomplete multibyte character.  */
   3613 	  *puc = 0xfffd;
   3614 	  return n;
   3615 	}
   3616     }
   3617 
   3618   /* Invalid multibyte character.  */
   3619   *puc = 0xfffd;
   3620   return 1;
   3621 }
   3622 #endif /* HAVE_WCHAR_H and not Cygwin/Mingw */
   3623 
   3624 /* Perform a comparison of two entries.  */
   3625 static signed int
   3626 rsrc_cmp (bfd_boolean is_name, rsrc_entry * a, rsrc_entry * b)
   3627 {
   3628   signed int    res;
   3629   bfd_byte *    astring;
   3630   unsigned int  alen;
   3631   bfd_byte *    bstring;
   3632   unsigned int  blen;
   3633 
   3634   if (! is_name)
   3635     return a->name_id.id - b->name_id.id;
   3636 
   3637   /* We have to perform a case insenstive, unicode string comparison...  */
   3638   astring = a->name_id.name.string;
   3639   alen    = a->name_id.name.len;
   3640   bstring = b->name_id.name.string;
   3641   blen    = b->name_id.name.len;
   3642 
   3643 #if defined  __CYGWIN__ || defined __MINGW32__
   3644   /* Under Windows hosts (both Cygwin and Mingw types),
   3645      unicode == UTF-16 == wchar_t.  The case insensitive string comparison
   3646      function however goes by different names in the two environments...  */
   3647 
   3648 #undef rscpcmp
   3649 #ifdef __CYGWIN__
   3650 #define rscpcmp wcsncasecmp
   3651 #endif
   3652 #ifdef __MINGW32__
   3653 #define rscpcmp wcsnicmp
   3654 #endif
   3655 
   3656   res = rscpcmp ((const wchar_t *) astring, (const wchar_t *) bstring,
   3657 		 min (alen, blen));
   3658 
   3659 #elif defined HAVE_WCHAR_H
   3660   {
   3661     unsigned int  i;
   3662 
   3663     res = 0;
   3664     for (i = min (alen, blen); i--; astring += 2, bstring += 2)
   3665       {
   3666 #if defined HAVE_WCTYPE_H
   3667 	wint_t awc;
   3668 	wint_t bwc;
   3669 #else
   3670 	wchar_t awc;
   3671 	wchar_t bwc;
   3672 #endif
   3673 
   3674 	/* Convert UTF-16 unicode characters into wchar_t characters
   3675 	   so that we can then perform a case insensitive comparison.  */
   3676 	unsigned int Alen = u16_mbtouc (& awc, (const unsigned short *) astring, 2);
   3677 	unsigned int Blen = u16_mbtouc (& bwc, (const unsigned short *) bstring, 2);
   3678 
   3679 	if (Alen != Blen)
   3680 	  return Alen - Blen;
   3681 
   3682 #ifdef HAVE_WCTYPE_H
   3683 	awc = towlower (awc);
   3684 	bwc = towlower (bwc);
   3685 
   3686 	res = awc - bwc;
   3687 #else
   3688 	res = wcsncasecmp (& awc, & bwc, 1);
   3689 #endif
   3690 	if (res)
   3691 	  break;
   3692       }
   3693   }
   3694 #else
   3695   /* Do the best we can - a case sensitive, untranslated comparison.  */
   3696   res = memcmp (astring, bstring, min (alen, blen) * 2);
   3697 #endif
   3698 
   3699   if (res == 0)
   3700     res = alen - blen;
   3701 
   3702   return res;
   3703 }
   3704 
   3705 static void
   3706 rsrc_print_name (char * buffer, rsrc_string string)
   3707 {
   3708   unsigned int  i;
   3709   bfd_byte *    name = string.string;
   3710 
   3711   for (i = string.len; i--; name += 2)
   3712     sprintf (buffer + strlen (buffer), "%.1s", name);
   3713 }
   3714 
   3715 static const char *
   3716 rsrc_resource_name (rsrc_entry * entry, rsrc_directory * dir)
   3717 {
   3718   static char buffer [256];
   3719   bfd_boolean is_string = FALSE;
   3720 
   3721   buffer[0] = 0;
   3722 
   3723   if (dir != NULL && dir->entry != NULL && dir->entry->parent != NULL
   3724       && dir->entry->parent->entry != NULL)
   3725     {
   3726       strcpy (buffer, "type: ");
   3727       if (dir->entry->parent->entry->is_name)
   3728 	rsrc_print_name (buffer + strlen (buffer),
   3729 			 dir->entry->parent->entry->name_id.name);
   3730       else
   3731 	{
   3732 	  unsigned int id = dir->entry->parent->entry->name_id.id;
   3733 
   3734 	  sprintf (buffer + strlen (buffer), "%x", id);
   3735 	  switch (id)
   3736 	    {
   3737 	    case 1: strcat (buffer, " (CURSOR)"); break;
   3738 	    case 2: strcat (buffer, " (BITMAP)"); break;
   3739 	    case 3: strcat (buffer, " (ICON)"); break;
   3740 	    case 4: strcat (buffer, " (MENU)"); break;
   3741 	    case 5: strcat (buffer, " (DIALOG)"); break;
   3742 	    case 6: strcat (buffer, " (STRING)"); is_string = TRUE; break;
   3743 	    case 7: strcat (buffer, " (FONTDIR)"); break;
   3744 	    case 8: strcat (buffer, " (FONT)"); break;
   3745 	    case 9: strcat (buffer, " (ACCELERATOR)"); break;
   3746 	    case 10: strcat (buffer, " (RCDATA)"); break;
   3747 	    case 11: strcat (buffer, " (MESSAGETABLE)"); break;
   3748 	    case 12: strcat (buffer, " (GROUP_CURSOR)"); break;
   3749 	    case 14: strcat (buffer, " (GROUP_ICON)"); break;
   3750 	    case 16: strcat (buffer, " (VERSION)"); break;
   3751 	    case 17: strcat (buffer, " (DLGINCLUDE)"); break;
   3752 	    case 19: strcat (buffer, " (PLUGPLAY)"); break;
   3753 	    case 20: strcat (buffer, " (VXD)"); break;
   3754 	    case 21: strcat (buffer, " (ANICURSOR)"); break;
   3755 	    case 22: strcat (buffer, " (ANIICON)"); break;
   3756 	    case 23: strcat (buffer, " (HTML)"); break;
   3757 	    case 24: strcat (buffer, " (MANIFEST)"); break;
   3758 	    case 240: strcat (buffer, " (DLGINIT)"); break;
   3759 	    case 241: strcat (buffer, " (TOOLBAR)"); break;
   3760 	    }
   3761 	}
   3762     }
   3763 
   3764   if (dir != NULL && dir->entry != NULL)
   3765     {
   3766       strcat (buffer, " name: ");
   3767       if (dir->entry->is_name)
   3768 	rsrc_print_name (buffer + strlen (buffer), dir->entry->name_id.name);
   3769       else
   3770 	{
   3771 	  unsigned int id = dir->entry->name_id.id;
   3772 
   3773 	  sprintf (buffer + strlen (buffer), "%x", id);
   3774 
   3775 	  if (is_string)
   3776 	    sprintf (buffer + strlen (buffer), " (resource id range: %d - %d)",
   3777 		     (id - 1) << 4, (id << 4) - 1);
   3778 	}
   3779     }
   3780 
   3781   if (entry != NULL)
   3782     {
   3783       strcat (buffer, " lang: ");
   3784 
   3785       if (entry->is_name)
   3786 	rsrc_print_name (buffer + strlen (buffer), entry->name_id.name);
   3787       else
   3788 	sprintf (buffer + strlen (buffer), "%x", entry->name_id.id);
   3789     }
   3790 
   3791   return buffer;
   3792 }
   3793 
   3794 /* *sigh* Windows resource strings are special.  Only the top 28-bits of
   3795    their ID is stored in the NAME entry.  The bottom four bits are used as
   3796    an index into unicode string table that makes up the data of the leaf.
   3797    So identical type-name-lang string resources may not actually be
   3798    identical at all.
   3799 
   3800    This function is called when we have detected two string resources with
   3801    match top-28-bit IDs.  We have to scan the string tables inside the leaves
   3802    and discover if there are any real collisions.  If there are then we report
   3803    them and return FALSE.  Otherwise we copy any strings from B into A and
   3804    then return TRUE.  */
   3805 
   3806 static bfd_boolean
   3807 rsrc_merge_string_entries (rsrc_entry * a ATTRIBUTE_UNUSED,
   3808 			   rsrc_entry * b ATTRIBUTE_UNUSED)
   3809 {
   3810   unsigned int copy_needed = 0;
   3811   unsigned int i;
   3812   bfd_byte * astring;
   3813   bfd_byte * bstring;
   3814   bfd_byte * new_data;
   3815   bfd_byte * nstring;
   3816 
   3817   /* Step one: Find out what we have to do.  */
   3818   BFD_ASSERT (! a->is_dir);
   3819   astring = a->value.leaf->data;
   3820 
   3821   BFD_ASSERT (! b->is_dir);
   3822   bstring = b->value.leaf->data;
   3823 
   3824   for (i = 0; i < 16; i++)
   3825     {
   3826       unsigned int alen = astring[0] + (astring[1] << 8);
   3827       unsigned int blen = bstring[0] + (bstring[1] << 8);
   3828 
   3829       if (alen == 0)
   3830 	{
   3831 	  copy_needed += blen * 2;
   3832 	}
   3833       else if (blen == 0)
   3834 	;
   3835       else if (alen != blen)
   3836 	/* FIXME: Should we continue the loop in order to report other duplicates ?  */
   3837 	break;
   3838       /* alen == blen != 0.  We might have two identical strings.  If so we
   3839 	 can ignore the second one.  There is no need for wchar_t vs UTF-16
   3840 	 theatrics here - we are only interested in (case sensitive) equality.  */
   3841       else if (memcmp (astring + 2, bstring + 2, alen * 2) != 0)
   3842 	break;
   3843 
   3844       astring += (alen + 1) * 2;
   3845       bstring += (blen + 1) * 2;
   3846     }
   3847 
   3848   if (i != 16)
   3849     {
   3850       if (a->parent != NULL
   3851 	  && a->parent->entry != NULL
   3852 	  && !a->parent->entry->is_name)
   3853 	_bfd_error_handler (_(".rsrc merge failure: duplicate string resource: %d"),
   3854 			    ((a->parent->entry->name_id.id - 1) << 4) + i);
   3855       return FALSE;
   3856     }
   3857 
   3858   if (copy_needed == 0)
   3859     return TRUE;
   3860 
   3861   /* If we reach here then A and B must both have non-colliding strings.
   3862      (We never get string resources with fully empty string tables).
   3863      We need to allocate an extra COPY_NEEDED bytes in A and then bring
   3864      in B's strings.  */
   3865   new_data = bfd_malloc (a->value.leaf->size + copy_needed);
   3866   if (new_data == NULL)
   3867     return FALSE;
   3868 
   3869   nstring = new_data;
   3870   astring = a->value.leaf->data;
   3871   bstring = b->value.leaf->data;
   3872 
   3873   for (i = 0; i < 16; i++)
   3874     {
   3875       unsigned int alen = astring[0] + (astring[1] << 8);
   3876       unsigned int blen = bstring[0] + (bstring[1] << 8);
   3877 
   3878       if (alen != 0)
   3879 	{
   3880 	  memcpy (nstring, astring, (alen + 1) * 2);
   3881 	  nstring += (alen + 1) * 2;
   3882 	}
   3883       else if (blen != 0)
   3884 	{
   3885 	  memcpy (nstring, bstring, (blen + 1) * 2);
   3886 	  nstring += (blen + 1) * 2;
   3887 	}
   3888       else
   3889 	{
   3890 	  * nstring++ = 0;
   3891 	  * nstring++ = 0;
   3892 	}
   3893 
   3894       astring += (alen + 1) * 2;
   3895       bstring += (blen + 1) * 2;
   3896     }
   3897 
   3898   BFD_ASSERT (nstring - new_data == (signed) (a->value.leaf->size + copy_needed));
   3899 
   3900   free (a->value.leaf->data);
   3901   a->value.leaf->data = new_data;
   3902   a->value.leaf->size += copy_needed;
   3903 
   3904   return TRUE;
   3905 }
   3906 
   3907 static void rsrc_merge (rsrc_entry *, rsrc_entry *);
   3908 
   3909 /* Sort the entries in given part of the directory.
   3910    We use an old fashioned bubble sort because we are dealing
   3911    with lists and we want to handle matches specially.  */
   3912 
   3913 static void
   3914 rsrc_sort_entries (rsrc_dir_chain *  chain,
   3915 		   bfd_boolean       is_name,
   3916 		   rsrc_directory *  dir)
   3917 {
   3918   rsrc_entry * entry;
   3919   rsrc_entry * next;
   3920   rsrc_entry ** points_to_entry;
   3921   bfd_boolean swapped;
   3922 
   3923   if (chain->num_entries < 2)
   3924     return;
   3925 
   3926   do
   3927     {
   3928       swapped = FALSE;
   3929       points_to_entry = & chain->first_entry;
   3930       entry = * points_to_entry;
   3931       next  = entry->next_entry;
   3932 
   3933       do
   3934 	{
   3935 	  signed int cmp = rsrc_cmp (is_name, entry, next);
   3936 
   3937 	  if (cmp > 0)
   3938 	    {
   3939 	      entry->next_entry = next->next_entry;
   3940 	      next->next_entry = entry;
   3941 	      * points_to_entry = next;
   3942 	      points_to_entry = & next->next_entry;
   3943 	      next = entry->next_entry;
   3944 	      swapped = TRUE;
   3945 	    }
   3946 	  else if (cmp == 0)
   3947 	    {
   3948 	      if (entry->is_dir && next->is_dir)
   3949 		{
   3950 		  /* When we encounter identical directory entries we have to
   3951 		     merge them together.  The exception to this rule is for
   3952 		     resource manifests - there can only be one of these,
   3953 		     even if they differ in language.  Zero-language manifests
   3954 		     are assumed to be default manifests (provided by the
   3955 		     Cygwin/MinGW build system) and these can be silently dropped,
   3956 		     unless that would reduce the number of manifests to zero.
   3957 		     There should only ever be one non-zero lang manifest -
   3958 		     if there are more it is an error.  A non-zero lang
   3959 		     manifest takes precedence over a default manifest.  */
   3960 		  if (!entry->is_name
   3961 		      && entry->name_id.id == 1
   3962 		      && dir != NULL
   3963 		      && dir->entry != NULL
   3964 		      && !dir->entry->is_name
   3965 		      && dir->entry->name_id.id == 0x18)
   3966 		    {
   3967 		      if (next->value.directory->names.num_entries == 0
   3968 			  && next->value.directory->ids.num_entries == 1
   3969 			  && !next->value.directory->ids.first_entry->is_name
   3970 			  && next->value.directory->ids.first_entry->name_id.id == 0)
   3971 			/* Fall through so that NEXT is dropped.  */
   3972 			;
   3973 		      else if (entry->value.directory->names.num_entries == 0
   3974 			       && entry->value.directory->ids.num_entries == 1
   3975 			       && !entry->value.directory->ids.first_entry->is_name
   3976 			       && entry->value.directory->ids.first_entry->name_id.id == 0)
   3977 			{
   3978 			  /* Swap ENTRY and NEXT.  Then fall through so that the old ENTRY is dropped.  */
   3979 			  entry->next_entry = next->next_entry;
   3980 			  next->next_entry = entry;
   3981 			  * points_to_entry = next;
   3982 			  points_to_entry = & next->next_entry;
   3983 			  next = entry->next_entry;
   3984 			  swapped = TRUE;
   3985 			}
   3986 		      else
   3987 			{
   3988 			  _bfd_error_handler (_(".rsrc merge failure: multiple non-default manifests"));
   3989 			  bfd_set_error (bfd_error_file_truncated);
   3990 			  return;
   3991 			}
   3992 
   3993 		      /* Unhook NEXT from the chain.  */
   3994 		      /* FIXME: memory loss here.  */
   3995 		      entry->next_entry = next->next_entry;
   3996 		      chain->num_entries --;
   3997 		      if (chain->num_entries < 2)
   3998 			return;
   3999 		      next = next->next_entry;
   4000 		    }
   4001 		  else
   4002 		    rsrc_merge (entry, next);
   4003 		}
   4004 	      else if (entry->is_dir != next->is_dir)
   4005 		{
   4006 		  _bfd_error_handler (_(".rsrc merge failure: a directory matches a leaf"));
   4007 		  bfd_set_error (bfd_error_file_truncated);
   4008 		  return;
   4009 		}
   4010 	      else
   4011 		{
   4012 		  /* Otherwise with identical leaves we issue an error
   4013 		     message - because there should never be duplicates.
   4014 		     The exception is Type 18/Name 1/Lang 0 which is the
   4015 		     defaul manifest - this can just be dropped.  */
   4016 		  if (!entry->is_name
   4017 		      && entry->name_id.id == 0
   4018 		      && dir != NULL
   4019 		      && dir->entry != NULL
   4020 		      && !dir->entry->is_name
   4021 		      && dir->entry->name_id.id == 1
   4022 		      && dir->entry->parent != NULL
   4023 		      && dir->entry->parent->entry != NULL
   4024 		      && !dir->entry->parent->entry->is_name
   4025 		      && dir->entry->parent->entry->name_id.id == 0x18 /* RT_MANIFEST */)
   4026 		    ;
   4027 		  else if (dir != NULL
   4028 			   && dir->entry != NULL
   4029 			   && dir->entry->parent != NULL
   4030 			   && dir->entry->parent->entry != NULL
   4031 			   && !dir->entry->parent->entry->is_name
   4032 			   && dir->entry->parent->entry->name_id.id == 0x6 /* RT_STRING */)
   4033 		    {
   4034 		      /* Strings need special handling.  */
   4035 		      if (! rsrc_merge_string_entries (entry, next))
   4036 			{
   4037 			  /* _bfd_error_handler should have been called inside merge_strings.  */
   4038 			  bfd_set_error (bfd_error_file_truncated);
   4039 			  return;
   4040 			}
   4041 		    }
   4042 		  else
   4043 		    {
   4044 		      if (dir == NULL
   4045 			  || dir->entry == NULL
   4046 			  || dir->entry->parent == NULL
   4047 			  || dir->entry->parent->entry == NULL)
   4048 			_bfd_error_handler (_(".rsrc merge failure: duplicate leaf"));
   4049 		      else
   4050 			_bfd_error_handler (_(".rsrc merge failure: duplicate leaf: %s"),
   4051 					    rsrc_resource_name (entry, dir));
   4052 		      bfd_set_error (bfd_error_file_truncated);
   4053 		      return;
   4054 		    }
   4055 		}
   4056 
   4057 	      /* Unhook NEXT from the chain.  */
   4058 	      entry->next_entry = next->next_entry;
   4059 	      chain->num_entries --;
   4060 	      if (chain->num_entries < 2)
   4061 		return;
   4062 	      next = next->next_entry;
   4063 	    }
   4064 	  else
   4065 	    {
   4066 	      points_to_entry = & entry->next_entry;
   4067 	      entry = next;
   4068 	      next = next->next_entry;
   4069 	    }
   4070 	}
   4071       while (next);
   4072 
   4073       chain->last_entry = entry;
   4074     }
   4075   while (swapped);
   4076 }
   4077 
   4078 /* Attach B's chain onto A.  */
   4079 static void
   4080 rsrc_attach_chain (rsrc_dir_chain * achain, rsrc_dir_chain * bchain)
   4081 {
   4082   if (bchain->num_entries == 0)
   4083     return;
   4084 
   4085   achain->num_entries += bchain->num_entries;
   4086 
   4087   if (achain->first_entry == NULL)
   4088     {
   4089       achain->first_entry = bchain->first_entry;
   4090       achain->last_entry  = bchain->last_entry;
   4091     }
   4092   else
   4093     {
   4094       achain->last_entry->next_entry = bchain->first_entry;
   4095       achain->last_entry = bchain->last_entry;
   4096     }
   4097 
   4098   bchain->num_entries = 0;
   4099   bchain->first_entry = bchain->last_entry = NULL;
   4100 }
   4101 
   4102 static void
   4103 rsrc_merge (struct rsrc_entry * a, struct rsrc_entry * b)
   4104 {
   4105   rsrc_directory * adir;
   4106   rsrc_directory * bdir;
   4107 
   4108   BFD_ASSERT (a->is_dir);
   4109   BFD_ASSERT (b->is_dir);
   4110 
   4111   adir = a->value.directory;
   4112   bdir = b->value.directory;
   4113 
   4114   if (adir->characteristics != bdir->characteristics)
   4115     {
   4116       _bfd_error_handler (_(".rsrc merge failure: dirs with differing characteristics"));
   4117       bfd_set_error (bfd_error_file_truncated);
   4118       return;
   4119     }
   4120 
   4121   if (adir->major != bdir->major || adir->minor != bdir->minor)
   4122     {
   4123       _bfd_error_handler (_(".rsrc merge failure: differing directory versions"));
   4124       bfd_set_error (bfd_error_file_truncated);
   4125       return;
   4126     }
   4127 
   4128   /* Attach B's name chain to A.  */
   4129   rsrc_attach_chain (& adir->names, & bdir->names);
   4130 
   4131   /* Attach B's ID chain to A.  */
   4132   rsrc_attach_chain (& adir->ids, & bdir->ids);
   4133 
   4134   /* Now sort A's entries.  */
   4135   rsrc_sort_entries (& adir->names, TRUE, adir);
   4136   rsrc_sort_entries (& adir->ids, FALSE, adir);
   4137 }
   4138 
   4139 /* Check the .rsrc section.  If it contains multiple concatenated
   4140    resources then we must merge them properly.  Otherwise Windows
   4141    will ignore all but the first set.  */
   4142 
   4143 static void
   4144 rsrc_process_section (bfd * abfd,
   4145 		      struct coff_final_link_info * pfinfo)
   4146 {
   4147   rsrc_directory    new_table;
   4148   bfd_size_type	    size;
   4149   asection *	    sec;
   4150   pe_data_type *    pe;
   4151   bfd_vma	    rva_bias;
   4152   bfd_byte *	    data;
   4153   bfd_byte *	    datastart;
   4154   bfd_byte *	    dataend;
   4155   bfd_byte *	    new_data;
   4156   unsigned int	    num_resource_sets;
   4157   rsrc_directory *  type_tables;
   4158   rsrc_write_data   write_data;
   4159   unsigned int	    indx;
   4160   bfd *		    input;
   4161   unsigned int	    num_input_rsrc = 0;
   4162   unsigned int	    max_num_input_rsrc = 4;
   4163   ptrdiff_t *	    rsrc_sizes = NULL;
   4164 
   4165   new_table.names.num_entries = 0;
   4166   new_table.ids.num_entries = 0;
   4167 
   4168   sec = bfd_get_section_by_name (abfd, ".rsrc");
   4169   if (sec == NULL || (size = sec->rawsize) == 0)
   4170     return;
   4171 
   4172   pe = pe_data (abfd);
   4173   if (pe == NULL)
   4174     return;
   4175 
   4176   rva_bias = sec->vma - pe->pe_opthdr.ImageBase;
   4177 
   4178   data = bfd_malloc (size);
   4179   if (data == NULL)
   4180     return;
   4181 
   4182   datastart = data;
   4183 
   4184   if (! bfd_get_section_contents (abfd, sec, data, 0, size))
   4185     goto end;
   4186 
   4187   /* Step zero: Scan the input bfds looking for .rsrc sections and record
   4188      their lengths.  Note - we rely upon the fact that the linker script
   4189      does *not* sort the input .rsrc sections, so that the order in the
   4190      linkinfo list matches the order in the output .rsrc section.
   4191 
   4192      We need to know the lengths because each input .rsrc section has padding
   4193      at the end of a variable amount.  (It does not appear to be based upon
   4194      the section alignment or the file alignment).  We need to skip any
   4195      padding bytes when parsing the input .rsrc sections.  */
   4196   rsrc_sizes = bfd_malloc (max_num_input_rsrc * sizeof * rsrc_sizes);
   4197   if (rsrc_sizes == NULL)
   4198     goto end;
   4199 
   4200   for (input = pfinfo->info->input_bfds;
   4201        input != NULL;
   4202        input = input->link.next)
   4203     {
   4204       asection * rsrc_sec = bfd_get_section_by_name (input, ".rsrc");
   4205 
   4206       /* PR 18372 - skip discarded .rsrc sections.  */
   4207       if (rsrc_sec != NULL && !discarded_section (rsrc_sec))
   4208 	{
   4209 	  if (num_input_rsrc == max_num_input_rsrc)
   4210 	    {
   4211 	      max_num_input_rsrc += 10;
   4212 	      rsrc_sizes = bfd_realloc (rsrc_sizes, max_num_input_rsrc
   4213 					* sizeof * rsrc_sizes);
   4214 	      if (rsrc_sizes == NULL)
   4215 		goto end;
   4216 	    }
   4217 
   4218 	  BFD_ASSERT (rsrc_sec->size > 0);
   4219 	  rsrc_sizes [num_input_rsrc ++] = rsrc_sec->size;
   4220 	}
   4221     }
   4222 
   4223   if (num_input_rsrc < 2)
   4224     goto end;
   4225 
   4226   /* Step one: Walk the section, computing the size of the tables,
   4227      leaves and data and decide if we need to do anything.  */
   4228   dataend = data + size;
   4229   num_resource_sets = 0;
   4230 
   4231   while (data < dataend)
   4232     {
   4233       bfd_byte * p = data;
   4234 
   4235       data = rsrc_count_directory (abfd, data, data, dataend, rva_bias);
   4236 
   4237       if (data > dataend)
   4238 	{
   4239 	  /* Corrupted .rsrc section - cannot merge.  */
   4240 	  _bfd_error_handler (_("%pB: .rsrc merge failure: corrupt .rsrc section"),
   4241 			      abfd);
   4242 	  bfd_set_error (bfd_error_file_truncated);
   4243 	  goto end;
   4244 	}
   4245 
   4246       if ((data - p) > rsrc_sizes [num_resource_sets])
   4247 	{
   4248 	  _bfd_error_handler (_("%pB: .rsrc merge failure: unexpected .rsrc size"),
   4249 			      abfd);
   4250 	  bfd_set_error (bfd_error_file_truncated);
   4251 	  goto end;
   4252 	}
   4253       /* FIXME: Should we add a check for "data - p" being much smaller
   4254 	 than rsrc_sizes[num_resource_sets] ?  */
   4255 
   4256       data = p + rsrc_sizes[num_resource_sets];
   4257       rva_bias += data - p;
   4258       ++ num_resource_sets;
   4259     }
   4260   BFD_ASSERT (num_resource_sets == num_input_rsrc);
   4261 
   4262   /* Step two: Walk the data again, building trees of the resources.  */
   4263   data = datastart;
   4264   rva_bias = sec->vma - pe->pe_opthdr.ImageBase;
   4265 
   4266   type_tables = bfd_malloc (num_resource_sets * sizeof * type_tables);
   4267   if (type_tables == NULL)
   4268     goto end;
   4269 
   4270   indx = 0;
   4271   while (data < dataend)
   4272     {
   4273       bfd_byte * p = data;
   4274 
   4275       (void) rsrc_parse_directory (abfd, type_tables + indx, data, data,
   4276 				   dataend, rva_bias, NULL);
   4277       data = p + rsrc_sizes[indx];
   4278       rva_bias += data - p;
   4279       ++ indx;
   4280     }
   4281   BFD_ASSERT (indx == num_resource_sets);
   4282 
   4283   /* Step three: Merge the top level tables (there can be only one).
   4284 
   4285      We must ensure that the merged entries are in ascending order.
   4286 
   4287      We also thread the top level table entries from the old tree onto
   4288      the new table, so that they can be pulled off later.  */
   4289 
   4290   /* FIXME: Should we verify that all type tables are the same ?  */
   4291   new_table.characteristics = type_tables[0].characteristics;
   4292   new_table.time	    = type_tables[0].time;
   4293   new_table.major	    = type_tables[0].major;
   4294   new_table.minor	    = type_tables[0].minor;
   4295 
   4296   /* Chain the NAME entries onto the table.  */
   4297   new_table.names.first_entry = NULL;
   4298   new_table.names.last_entry = NULL;
   4299 
   4300   for (indx = 0; indx < num_resource_sets; indx++)
   4301     rsrc_attach_chain (& new_table.names, & type_tables[indx].names);
   4302 
   4303   rsrc_sort_entries (& new_table.names, TRUE, & new_table);
   4304 
   4305   /* Chain the ID entries onto the table.  */
   4306   new_table.ids.first_entry = NULL;
   4307   new_table.ids.last_entry = NULL;
   4308 
   4309   for (indx = 0; indx < num_resource_sets; indx++)
   4310     rsrc_attach_chain (& new_table.ids, & type_tables[indx].ids);
   4311 
   4312   rsrc_sort_entries (& new_table.ids, FALSE, & new_table);
   4313 
   4314   /* Step four: Create new contents for the .rsrc section.  */
   4315   /* Step four point one: Compute the size of each region of the .rsrc section.
   4316      We do this now, rather than earlier, as the merging above may have dropped
   4317      some entries.  */
   4318   sizeof_leaves = sizeof_strings = sizeof_tables_and_entries = 0;
   4319   rsrc_compute_region_sizes (& new_table);
   4320   /* We increment sizeof_strings to make sure that resource data
   4321      starts on an 8-byte boundary.  FIXME: Is this correct ?  */
   4322   sizeof_strings = (sizeof_strings + 7) & ~ 7;
   4323 
   4324   new_data = bfd_zalloc (abfd, size);
   4325   if (new_data == NULL)
   4326     goto end;
   4327 
   4328   write_data.abfd	 = abfd;
   4329   write_data.datastart	 = new_data;
   4330   write_data.next_table	 = new_data;
   4331   write_data.next_leaf	 = new_data + sizeof_tables_and_entries;
   4332   write_data.next_string = write_data.next_leaf + sizeof_leaves;
   4333   write_data.next_data	 = write_data.next_string + sizeof_strings;
   4334   write_data.rva_bias	 = sec->vma - pe->pe_opthdr.ImageBase;
   4335 
   4336   rsrc_write_directory (& write_data, & new_table);
   4337 
   4338   /* Step five: Replace the old contents with the new.
   4339      We don't recompute the size as it's too late here to shrink section.
   4340      See PR ld/20193 for more details.  */
   4341   bfd_set_section_contents (pfinfo->output_bfd, sec, new_data, 0, size);
   4342   sec->size = sec->rawsize = size;
   4343 
   4344  end:
   4345   /* Step six: Free all the memory that we have used.  */
   4346   /* FIXME: Free the resource tree, if we have one.  */
   4347   free (datastart);
   4348   free (rsrc_sizes);
   4349 }
   4350 
   4351 /* Handle the .idata section and other things that need symbol table
   4352    access.  */
   4353 
   4354 bfd_boolean
   4355 _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
   4356 {
   4357   struct coff_link_hash_entry *h1;
   4358   struct bfd_link_info *info = pfinfo->info;
   4359   bfd_boolean result = TRUE;
   4360 
   4361   /* There are a few fields that need to be filled in now while we
   4362      have symbol table access.
   4363 
   4364      The .idata subsections aren't directly available as sections, but
   4365      they are in the symbol table, so get them from there.  */
   4366 
   4367   /* The import directory.  This is the address of .idata$2, with size
   4368      of .idata$2 + .idata$3.  */
   4369   h1 = coff_link_hash_lookup (coff_hash_table (info),
   4370 			      ".idata$2", FALSE, FALSE, TRUE);
   4371   if (h1 != NULL)
   4372     {
   4373       /* PR ld/2729: We cannot rely upon all the output sections having been
   4374 	 created properly, so check before referencing them.  Issue a warning
   4375 	 message for any sections tht could not be found.  */
   4376       if ((h1->root.type == bfd_link_hash_defined
   4377 	   || h1->root.type == bfd_link_hash_defweak)
   4378 	  && h1->root.u.def.section != NULL
   4379 	  && h1->root.u.def.section->output_section != NULL)
   4380 	pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].VirtualAddress =
   4381 	  (h1->root.u.def.value
   4382 	   + h1->root.u.def.section->output_section->vma
   4383 	   + h1->root.u.def.section->output_offset);
   4384       else
   4385 	{
   4386 	  _bfd_error_handler
   4387 	    (_("%pB: unable to fill in DataDictionary[1] because .idata$2 is missing"),
   4388 	     abfd);
   4389 	  result = FALSE;
   4390 	}
   4391 
   4392       h1 = coff_link_hash_lookup (coff_hash_table (info),
   4393 				  ".idata$4", FALSE, FALSE, TRUE);
   4394       if (h1 != NULL
   4395 	  && (h1->root.type == bfd_link_hash_defined
   4396 	   || h1->root.type == bfd_link_hash_defweak)
   4397 	  && h1->root.u.def.section != NULL
   4398 	  && h1->root.u.def.section->output_section != NULL)
   4399 	pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].Size =
   4400 	  ((h1->root.u.def.value
   4401 	    + h1->root.u.def.section->output_section->vma
   4402 	    + h1->root.u.def.section->output_offset)
   4403 	   - pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].VirtualAddress);
   4404       else
   4405 	{
   4406 	  _bfd_error_handler
   4407 	    (_("%pB: unable to fill in DataDictionary[1] because .idata$4 is missing"),
   4408 	     abfd);
   4409 	  result = FALSE;
   4410 	}
   4411 
   4412       /* The import address table.  This is the size/address of
   4413 	 .idata$5.  */
   4414       h1 = coff_link_hash_lookup (coff_hash_table (info),
   4415 				  ".idata$5", FALSE, FALSE, TRUE);
   4416       if (h1 != NULL
   4417 	  && (h1->root.type == bfd_link_hash_defined
   4418 	   || h1->root.type == bfd_link_hash_defweak)
   4419 	  && h1->root.u.def.section != NULL
   4420 	  && h1->root.u.def.section->output_section != NULL)
   4421 	pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress =
   4422 	  (h1->root.u.def.value
   4423 	   + h1->root.u.def.section->output_section->vma
   4424 	   + h1->root.u.def.section->output_offset);
   4425       else
   4426 	{
   4427 	  _bfd_error_handler
   4428 	    (_("%pB: unable to fill in DataDictionary[12] because .idata$5 is missing"),
   4429 	     abfd);
   4430 	  result = FALSE;
   4431 	}
   4432 
   4433       h1 = coff_link_hash_lookup (coff_hash_table (info),
   4434 				  ".idata$6", FALSE, FALSE, TRUE);
   4435       if (h1 != NULL
   4436 	  && (h1->root.type == bfd_link_hash_defined
   4437 	   || h1->root.type == bfd_link_hash_defweak)
   4438 	  && h1->root.u.def.section != NULL
   4439 	  && h1->root.u.def.section->output_section != NULL)
   4440 	pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size =
   4441 	  ((h1->root.u.def.value
   4442 	    + h1->root.u.def.section->output_section->vma
   4443 	    + h1->root.u.def.section->output_offset)
   4444 	   - pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress);
   4445       else
   4446 	{
   4447 	  _bfd_error_handler
   4448 	    (_("%pB: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE (12)] because .idata$6 is missing"),
   4449 	     abfd);
   4450 	  result = FALSE;
   4451 	}
   4452     }
   4453   else
   4454     {
   4455       h1 = coff_link_hash_lookup (coff_hash_table (info),
   4456 				  "__IAT_start__", FALSE, FALSE, TRUE);
   4457       if (h1 != NULL
   4458 	  && (h1->root.type == bfd_link_hash_defined
   4459 	   || h1->root.type == bfd_link_hash_defweak)
   4460 	  && h1->root.u.def.section != NULL
   4461 	  && h1->root.u.def.section->output_section != NULL)
   4462 	{
   4463 	  bfd_vma iat_va;
   4464 
   4465 	  iat_va =
   4466 	    (h1->root.u.def.value
   4467 	     + h1->root.u.def.section->output_section->vma
   4468 	     + h1->root.u.def.section->output_offset);
   4469 
   4470 	  h1 = coff_link_hash_lookup (coff_hash_table (info),
   4471 				      "__IAT_end__", FALSE, FALSE, TRUE);
   4472 	  if (h1 != NULL
   4473 	      && (h1->root.type == bfd_link_hash_defined
   4474 	       || h1->root.type == bfd_link_hash_defweak)
   4475 	      && h1->root.u.def.section != NULL
   4476 	      && h1->root.u.def.section->output_section != NULL)
   4477 	    {
   4478 	      pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size =
   4479 		((h1->root.u.def.value
   4480 		  + h1->root.u.def.section->output_section->vma
   4481 		  + h1->root.u.def.section->output_offset)
   4482 		 - iat_va);
   4483 	      if (pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size != 0)
   4484 		pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress =
   4485 		  iat_va - pe_data (abfd)->pe_opthdr.ImageBase;
   4486 	    }
   4487 	  else
   4488 	    {
   4489 	      _bfd_error_handler
   4490 		(_("%pB: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE(12)]"
   4491 		   " because .idata$6 is missing"), abfd);
   4492 	      result = FALSE;
   4493 	    }
   4494 	}
   4495     }
   4496 
   4497   h1 = coff_link_hash_lookup (coff_hash_table (info),
   4498 			      (bfd_get_symbol_leading_char (abfd) != 0
   4499 			       ? "__tls_used" : "_tls_used"),
   4500 			      FALSE, FALSE, TRUE);
   4501   if (h1 != NULL)
   4502     {
   4503       if ((h1->root.type == bfd_link_hash_defined
   4504 	   || h1->root.type == bfd_link_hash_defweak)
   4505 	  && h1->root.u.def.section != NULL
   4506 	  && h1->root.u.def.section->output_section != NULL)
   4507 	pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].VirtualAddress =
   4508 	  (h1->root.u.def.value
   4509 	   + h1->root.u.def.section->output_section->vma
   4510 	   + h1->root.u.def.section->output_offset
   4511 	   - pe_data (abfd)->pe_opthdr.ImageBase);
   4512       else
   4513 	{
   4514 	  _bfd_error_handler
   4515 	    (_("%pB: unable to fill in DataDictionary[9] because __tls_used is missing"),
   4516 	     abfd);
   4517 	  result = FALSE;
   4518 	}
   4519      /* According to PECOFF sepcifications by Microsoft version 8.2
   4520 	the TLS data directory consists of 4 pointers, followed
   4521 	by two 4-byte integer. This implies that the total size
   4522 	is different for 32-bit and 64-bit executables.  */
   4523 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
   4524       pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].Size = 0x18;
   4525 #else
   4526       pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].Size = 0x28;
   4527 #endif
   4528     }
   4529 
   4530 /* If there is a .pdata section and we have linked pdata finally, we
   4531      need to sort the entries ascending.  */
   4532 #if !defined(COFF_WITH_pep) && defined(COFF_WITH_pex64)
   4533   {
   4534     asection *sec = bfd_get_section_by_name (abfd, ".pdata");
   4535 
   4536     if (sec)
   4537       {
   4538 	bfd_size_type x = sec->rawsize;
   4539 	bfd_byte *tmp_data = NULL;
   4540 
   4541 	if (x)
   4542 	  tmp_data = bfd_malloc (x);
   4543 
   4544 	if (tmp_data != NULL)
   4545 	  {
   4546 	    if (bfd_get_section_contents (abfd, sec, tmp_data, 0, x))
   4547 	      {
   4548 		qsort (tmp_data,
   4549 		       (size_t) (x / 12),
   4550 		       12, sort_x64_pdata);
   4551 		bfd_set_section_contents (pfinfo->output_bfd, sec,
   4552 					  tmp_data, 0, x);
   4553 	      }
   4554 	    free (tmp_data);
   4555 	  }
   4556 	else
   4557 	  result = FALSE;
   4558       }
   4559   }
   4560 #endif
   4561 
   4562   rsrc_process_section (abfd, pfinfo);
   4563 
   4564   /* If we couldn't find idata$2, we either have an excessively
   4565      trivial program or are in DEEP trouble; we have to assume trivial
   4566      program....  */
   4567   return result;
   4568 }
   4569