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