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