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