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