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