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