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