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