Import patches from the master branch which prevent seg-faults when parsing
[platform/upstream/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   fprintf (file, _("\nThere is an export table in %s at 0x%lx\n"),
1615            section->name, (unsigned long) addr);
1616
1617   data = (bfd_byte *) bfd_malloc (datasize);
1618   if (data == NULL)
1619     return FALSE;
1620
1621   if (! bfd_get_section_contents (abfd, section, data,
1622                                   (file_ptr) dataoff, datasize))
1623     return FALSE;
1624
1625   /* Go get Export Directory Table.  */
1626   edt.export_flags   = bfd_get_32 (abfd, data +  0);
1627   edt.time_stamp     = bfd_get_32 (abfd, data +  4);
1628   edt.major_ver      = bfd_get_16 (abfd, data +  8);
1629   edt.minor_ver      = bfd_get_16 (abfd, data + 10);
1630   edt.name           = bfd_get_32 (abfd, data + 12);
1631   edt.base           = bfd_get_32 (abfd, data + 16);
1632   edt.num_functions  = bfd_get_32 (abfd, data + 20);
1633   edt.num_names      = bfd_get_32 (abfd, data + 24);
1634   edt.eat_addr       = bfd_get_32 (abfd, data + 28);
1635   edt.npt_addr       = bfd_get_32 (abfd, data + 32);
1636   edt.ot_addr        = bfd_get_32 (abfd, data + 36);
1637
1638   adj = section->vma - extra->ImageBase + dataoff;
1639
1640   /* Dump the EDT first.  */
1641   fprintf (file,
1642            _("\nThe Export Tables (interpreted %s section contents)\n\n"),
1643            section->name);
1644
1645   fprintf (file,
1646            _("Export Flags \t\t\t%lx\n"), (unsigned long) edt.export_flags);
1647
1648   fprintf (file,
1649            _("Time/Date stamp \t\t%lx\n"), (unsigned long) edt.time_stamp);
1650
1651   fprintf (file,
1652            _("Major/Minor \t\t\t%d/%d\n"), edt.major_ver, edt.minor_ver);
1653
1654   fprintf (file,
1655            _("Name \t\t\t\t"));
1656   bfd_fprintf_vma (abfd, file, edt.name);
1657
1658   if ((edt.name >= adj) && (edt.name < adj + datasize))
1659     fprintf (file, " %s\n", data + edt.name - adj);
1660   else
1661     fprintf (file, "(outside .edata section)\n");
1662
1663   fprintf (file,
1664            _("Ordinal Base \t\t\t%ld\n"), edt.base);
1665
1666   fprintf (file,
1667            _("Number in:\n"));
1668
1669   fprintf (file,
1670            _("\tExport Address Table \t\t%08lx\n"),
1671            edt.num_functions);
1672
1673   fprintf (file,
1674            _("\t[Name Pointer/Ordinal] Table\t%08lx\n"), edt.num_names);
1675
1676   fprintf (file,
1677            _("Table Addresses\n"));
1678
1679   fprintf (file,
1680            _("\tExport Address Table \t\t"));
1681   bfd_fprintf_vma (abfd, file, edt.eat_addr);
1682   fprintf (file, "\n");
1683
1684   fprintf (file,
1685            _("\tName Pointer Table \t\t"));
1686   bfd_fprintf_vma (abfd, file, edt.npt_addr);
1687   fprintf (file, "\n");
1688
1689   fprintf (file,
1690            _("\tOrdinal Table \t\t\t"));
1691   bfd_fprintf_vma (abfd, file, edt.ot_addr);
1692   fprintf (file, "\n");
1693
1694   /* The next table to find is the Export Address Table. It's basically
1695      a list of pointers that either locate a function in this dll, or
1696      forward the call to another dll. Something like:
1697       typedef union
1698       {
1699         long export_rva;
1700         long forwarder_rva;
1701       } export_address_table_entry;  */
1702
1703   fprintf (file,
1704           _("\nExport Address Table -- Ordinal Base %ld\n"),
1705           edt.base);
1706
1707   /* PR 17512: Handle corrupt PE binaries.  */
1708   if (edt.eat_addr + (edt.num_functions * 4) - adj >= datasize)
1709     fprintf (file, _("\tInvalid Export Address Table rva (0x%lx) or entry count (0x%lx)\n"),
1710              (long) edt.eat_addr,
1711              (long) edt.num_functions);
1712   else for (i = 0; i < edt.num_functions; ++i)
1713     {
1714       bfd_vma eat_member = bfd_get_32 (abfd,
1715                                        data + edt.eat_addr + (i * 4) - adj);
1716       if (eat_member == 0)
1717         continue;
1718
1719       if (eat_member - adj <= datasize)
1720         {
1721           /* This rva is to a name (forwarding function) in our section.  */
1722           /* Should locate a function descriptor.  */
1723           fprintf (file,
1724                    "\t[%4ld] +base[%4ld] %04lx %s -- %s\n",
1725                    (long) i,
1726                    (long) (i + edt.base),
1727                    (unsigned long) eat_member,
1728                    _("Forwarder RVA"),
1729                    data + eat_member - adj);
1730         }
1731       else
1732         {
1733           /* Should locate a function descriptor in the reldata section.  */
1734           fprintf (file,
1735                    "\t[%4ld] +base[%4ld] %04lx %s\n",
1736                    (long) i,
1737                    (long) (i + edt.base),
1738                    (unsigned long) eat_member,
1739                    _("Export RVA"));
1740         }
1741     }
1742
1743   /* The Export Name Pointer Table is paired with the Export Ordinal Table.  */
1744   /* Dump them in parallel for clarity.  */
1745   fprintf (file,
1746            _("\n[Ordinal/Name Pointer] Table\n"));
1747
1748   /* PR 17512: Handle corrupt PE binaries.  */
1749   if (edt.npt_addr + (edt.num_names * 4) - adj >= datasize)
1750     fprintf (file, _("\tInvalid Name Pointer Table rva (0x%lx) or entry count (0x%lx)\n"),
1751              (long) edt.npt_addr,
1752              (long) edt.num_names);
1753   else if (edt.ot_addr + (edt.num_names * 2) - adj >= datasize)
1754     fprintf (file, _("\tInvalid Ordinal Table rva (0x%lx) or entry count (0x%lx)\n"),
1755              (long) edt.ot_addr,
1756              (long) edt.num_names);
1757   else for (i = 0; i < edt.num_names; ++i)
1758     {
1759       bfd_vma name_ptr = bfd_get_32 (abfd,
1760                                     data +
1761                                     edt.npt_addr
1762                                     + (i*4) - adj);
1763
1764       char *name = (char *) data + name_ptr - adj;
1765
1766       bfd_vma ord = bfd_get_16 (abfd,
1767                                     data +
1768                                     edt.ot_addr
1769                                     + (i*2) - adj);
1770       fprintf (file,
1771               "\t[%4ld] %s\n", (long) ord, name);
1772     }
1773
1774   free (data);
1775
1776   return TRUE;
1777 }
1778
1779 /* This really is architecture dependent.  On IA-64, a .pdata entry
1780    consists of three dwords containing relative virtual addresses that
1781    specify the start and end address of the code range the entry
1782    covers and the address of the corresponding unwind info data.
1783
1784    On ARM and SH-4, a compressed PDATA structure is used :
1785    _IMAGE_CE_RUNTIME_FUNCTION_ENTRY, whereas MIPS is documented to use
1786    _IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY.
1787    See http://msdn2.microsoft.com/en-us/library/ms253988(VS.80).aspx .
1788
1789    This is the version for uncompressed data.  */
1790
1791 static bfd_boolean
1792 pe_print_pdata (bfd * abfd, void * vfile)
1793 {
1794 #if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
1795 # define PDATA_ROW_SIZE (3 * 8)
1796 #else
1797 # define PDATA_ROW_SIZE (5 * 4)
1798 #endif
1799   FILE *file = (FILE *) vfile;
1800   bfd_byte *data = 0;
1801   asection *section = bfd_get_section_by_name (abfd, ".pdata");
1802   bfd_size_type datasize = 0;
1803   bfd_size_type i;
1804   bfd_size_type start, stop;
1805   int onaline = PDATA_ROW_SIZE;
1806
1807   if (section == NULL
1808       || coff_section_data (abfd, section) == NULL
1809       || pei_section_data (abfd, section) == NULL)
1810     return TRUE;
1811
1812   stop = pei_section_data (abfd, section)->virt_size;
1813   if ((stop % onaline) != 0)
1814     fprintf (file,
1815              _("Warning, .pdata section size (%ld) is not a multiple of %d\n"),
1816              (long) stop, onaline);
1817
1818   fprintf (file,
1819            _("\nThe Function Table (interpreted .pdata section contents)\n"));
1820 #if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
1821   fprintf (file,
1822            _(" vma:\t\t\tBegin Address    End Address      Unwind Info\n"));
1823 #else
1824   fprintf (file, _("\
1825  vma:\t\tBegin    End      EH       EH       PrologEnd  Exception\n\
1826      \t\tAddress  Address  Handler  Data     Address    Mask\n"));
1827 #endif
1828
1829   datasize = section->size;
1830   if (datasize == 0)
1831     return TRUE;
1832
1833   if (! bfd_malloc_and_get_section (abfd, section, &data))
1834     {
1835       if (data != NULL)
1836         free (data);
1837       return FALSE;
1838     }
1839
1840   start = 0;
1841
1842   for (i = start; i < stop; i += onaline)
1843     {
1844       bfd_vma begin_addr;
1845       bfd_vma end_addr;
1846       bfd_vma eh_handler;
1847       bfd_vma eh_data;
1848       bfd_vma prolog_end_addr;
1849 #if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64)
1850       int em_data;
1851 #endif
1852
1853       if (i + PDATA_ROW_SIZE > stop)
1854         break;
1855
1856       begin_addr      = GET_PDATA_ENTRY (abfd, data + i     );
1857       end_addr        = GET_PDATA_ENTRY (abfd, data + i +  4);
1858       eh_handler      = GET_PDATA_ENTRY (abfd, data + i +  8);
1859       eh_data         = GET_PDATA_ENTRY (abfd, data + i + 12);
1860       prolog_end_addr = GET_PDATA_ENTRY (abfd, data + i + 16);
1861
1862       if (begin_addr == 0 && end_addr == 0 && eh_handler == 0
1863           && eh_data == 0 && prolog_end_addr == 0)
1864         /* We are probably into the padding of the section now.  */
1865         break;
1866
1867 #if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64)
1868       em_data = ((eh_handler & 0x1) << 2) | (prolog_end_addr & 0x3);
1869 #endif
1870       eh_handler &= ~(bfd_vma) 0x3;
1871       prolog_end_addr &= ~(bfd_vma) 0x3;
1872
1873       fputc (' ', file);
1874       bfd_fprintf_vma (abfd, file, i + section->vma); fputc ('\t', file);
1875       bfd_fprintf_vma (abfd, file, begin_addr); fputc (' ', file);
1876       bfd_fprintf_vma (abfd, file, end_addr); fputc (' ', file);
1877       bfd_fprintf_vma (abfd, file, eh_handler);
1878 #if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64)
1879       fputc (' ', file);
1880       bfd_fprintf_vma (abfd, file, eh_data); fputc (' ', file);
1881       bfd_fprintf_vma (abfd, file, prolog_end_addr);
1882       fprintf (file, "   %x", em_data);
1883 #endif
1884
1885 #ifdef POWERPC_LE_PE
1886       if (eh_handler == 0 && eh_data != 0)
1887         {
1888           /* Special bits here, although the meaning may be a little
1889              mysterious. The only one I know for sure is 0x03
1890              Code Significance
1891              0x00 None
1892              0x01 Register Save Millicode
1893              0x02 Register Restore Millicode
1894              0x03 Glue Code Sequence.  */
1895           switch (eh_data)
1896             {
1897             case 0x01:
1898               fprintf (file, _(" Register save millicode"));
1899               break;
1900             case 0x02:
1901               fprintf (file, _(" Register restore millicode"));
1902               break;
1903             case 0x03:
1904               fprintf (file, _(" Glue code sequence"));
1905               break;
1906             default:
1907               break;
1908             }
1909         }
1910 #endif
1911       fprintf (file, "\n");
1912     }
1913
1914   free (data);
1915
1916   return TRUE;
1917 #undef PDATA_ROW_SIZE
1918 }
1919
1920 typedef struct sym_cache
1921 {
1922   int        symcount;
1923   asymbol ** syms;
1924 } sym_cache;
1925
1926 static asymbol **
1927 slurp_symtab (bfd *abfd, sym_cache *psc)
1928 {
1929   asymbol ** sy = NULL;
1930   long storage;
1931
1932   if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
1933     {
1934       psc->symcount = 0;
1935       return NULL;
1936     }
1937
1938   storage = bfd_get_symtab_upper_bound (abfd);
1939   if (storage < 0)
1940     return NULL;
1941   if (storage)
1942     sy = (asymbol **) bfd_malloc (storage);
1943
1944   psc->symcount = bfd_canonicalize_symtab (abfd, sy);
1945   if (psc->symcount < 0)
1946     return NULL;
1947   return sy;
1948 }
1949
1950 static const char *
1951 my_symbol_for_address (bfd *abfd, bfd_vma func, sym_cache *psc)
1952 {
1953   int i;
1954
1955   if (psc->syms == 0)
1956     psc->syms = slurp_symtab (abfd, psc);
1957
1958   for (i = 0; i < psc->symcount; i++)
1959     {
1960       if (psc->syms[i]->section->vma + psc->syms[i]->value == func)
1961         return psc->syms[i]->name;
1962     }
1963
1964   return NULL;
1965 }
1966
1967 static void
1968 cleanup_syms (sym_cache *psc)
1969 {
1970   psc->symcount = 0;
1971   free (psc->syms);
1972   psc->syms = NULL;
1973 }
1974
1975 /* This is the version for "compressed" pdata.  */
1976
1977 bfd_boolean
1978 _bfd_XX_print_ce_compressed_pdata (bfd * abfd, void * vfile)
1979 {
1980 # define PDATA_ROW_SIZE (2 * 4)
1981   FILE *file = (FILE *) vfile;
1982   bfd_byte *data = NULL;
1983   asection *section = bfd_get_section_by_name (abfd, ".pdata");
1984   bfd_size_type datasize = 0;
1985   bfd_size_type i;
1986   bfd_size_type start, stop;
1987   int onaline = PDATA_ROW_SIZE;
1988   struct sym_cache cache = {0, 0} ;
1989
1990   if (section == NULL
1991       || coff_section_data (abfd, section) == NULL
1992       || pei_section_data (abfd, section) == NULL)
1993     return TRUE;
1994
1995   stop = pei_section_data (abfd, section)->virt_size;
1996   if ((stop % onaline) != 0)
1997     fprintf (file,
1998              _("Warning, .pdata section size (%ld) is not a multiple of %d\n"),
1999              (long) stop, onaline);
2000
2001   fprintf (file,
2002            _("\nThe Function Table (interpreted .pdata section contents)\n"));
2003
2004   fprintf (file, _("\
2005  vma:\t\tBegin    Prolog   Function Flags    Exception EH\n\
2006      \t\tAddress  Length   Length   32b exc  Handler   Data\n"));
2007
2008   datasize = section->size;
2009   if (datasize == 0)
2010     return TRUE;
2011
2012   if (! bfd_malloc_and_get_section (abfd, section, &data))
2013     {
2014       if (data != NULL)
2015         free (data);
2016       return FALSE;
2017     }
2018
2019   start = 0;
2020
2021   for (i = start; i < stop; i += onaline)
2022     {
2023       bfd_vma begin_addr;
2024       bfd_vma other_data;
2025       bfd_vma prolog_length, function_length;
2026       int flag32bit, exception_flag;
2027       asection *tsection;
2028
2029       if (i + PDATA_ROW_SIZE > stop)
2030         break;
2031
2032       begin_addr = GET_PDATA_ENTRY (abfd, data + i     );
2033       other_data = GET_PDATA_ENTRY (abfd, data + i +  4);
2034
2035       if (begin_addr == 0 && other_data == 0)
2036         /* We are probably into the padding of the section now.  */
2037         break;
2038
2039       prolog_length = (other_data & 0x000000FF);
2040       function_length = (other_data & 0x3FFFFF00) >> 8;
2041       flag32bit = (int)((other_data & 0x40000000) >> 30);
2042       exception_flag = (int)((other_data & 0x80000000) >> 31);
2043
2044       fputc (' ', file);
2045       bfd_fprintf_vma (abfd, file, i + section->vma); fputc ('\t', file);
2046       bfd_fprintf_vma (abfd, file, begin_addr); fputc (' ', file);
2047       bfd_fprintf_vma (abfd, file, prolog_length); fputc (' ', file);
2048       bfd_fprintf_vma (abfd, file, function_length); fputc (' ', file);
2049       fprintf (file, "%2d  %2d   ", flag32bit, exception_flag);
2050
2051       /* Get the exception handler's address and the data passed from the
2052          .text section. This is really the data that belongs with the .pdata
2053          but got "compressed" out for the ARM and SH4 architectures.  */
2054       tsection = bfd_get_section_by_name (abfd, ".text");
2055       if (tsection && coff_section_data (abfd, tsection)
2056           && pei_section_data (abfd, tsection))
2057         {
2058           bfd_vma eh_off = (begin_addr - 8) - tsection->vma;
2059           bfd_byte *tdata;
2060
2061           tdata = (bfd_byte *) bfd_malloc (8);
2062           if (tdata)
2063             {
2064               if (bfd_get_section_contents (abfd, tsection, tdata, eh_off, 8))
2065                 {
2066                   bfd_vma eh, eh_data;
2067
2068                   eh = bfd_get_32 (abfd, tdata);
2069                   eh_data = bfd_get_32 (abfd, tdata + 4);
2070                   fprintf (file, "%08x  ", (unsigned int) eh);
2071                   fprintf (file, "%08x", (unsigned int) eh_data);
2072                   if (eh != 0)
2073                     {
2074                       const char *s = my_symbol_for_address (abfd, eh, &cache);
2075
2076                       if (s)
2077                         fprintf (file, " (%s) ", s);
2078                     }
2079                 }
2080               free (tdata);
2081             }
2082         }
2083
2084       fprintf (file, "\n");
2085     }
2086
2087   free (data);
2088
2089   cleanup_syms (& cache);
2090
2091   return TRUE;
2092 #undef PDATA_ROW_SIZE
2093 }
2094
2095 \f
2096 #define IMAGE_REL_BASED_HIGHADJ 4
2097 static const char * const tbl[] =
2098 {
2099   "ABSOLUTE",
2100   "HIGH",
2101   "LOW",
2102   "HIGHLOW",
2103   "HIGHADJ",
2104   "MIPS_JMPADDR",
2105   "SECTION",
2106   "REL32",
2107   "RESERVED1",
2108   "MIPS_JMPADDR16",
2109   "DIR64",
2110   "HIGH3ADJ",
2111   "UNKNOWN",   /* MUST be last.  */
2112 };
2113
2114 static bfd_boolean
2115 pe_print_reloc (bfd * abfd, void * vfile)
2116 {
2117   FILE *file = (FILE *) vfile;
2118   bfd_byte *data = 0;
2119   asection *section = bfd_get_section_by_name (abfd, ".reloc");
2120   bfd_byte *p, *end;
2121
2122   if (section == NULL || section->size == 0 || !(section->flags & SEC_HAS_CONTENTS))
2123     return TRUE;
2124
2125   fprintf (file,
2126            _("\n\nPE File Base Relocations (interpreted .reloc section contents)\n"));
2127
2128   if (! bfd_malloc_and_get_section (abfd, section, &data))
2129     {
2130       if (data != NULL)
2131         free (data);
2132       return FALSE;
2133     }
2134
2135   p = data;
2136   end = data + section->size;
2137   while (p + 8 <= end)
2138     {
2139       int j;
2140       bfd_vma virtual_address;
2141       long number, size;
2142       bfd_byte *chunk_end;
2143
2144       /* The .reloc section is a sequence of blocks, with a header consisting
2145          of two 32 bit quantities, followed by a number of 16 bit entries.  */
2146       virtual_address = bfd_get_32 (abfd, p);
2147       size = bfd_get_32 (abfd, p + 4);
2148       p += 8;
2149       number = (size - 8) / 2;
2150
2151       if (size == 0)
2152         break;
2153
2154       fprintf (file,
2155                _("\nVirtual Address: %08lx Chunk size %ld (0x%lx) Number of fixups %ld\n"),
2156                (unsigned long) virtual_address, size, (unsigned long) size, number);
2157
2158       chunk_end = p + size;
2159       if (chunk_end > end)
2160         chunk_end = end;
2161       j = 0;
2162       while (p + 2 <= chunk_end)
2163         {
2164           unsigned short e = bfd_get_16 (abfd, p);
2165           unsigned int t = (e & 0xF000) >> 12;
2166           int off = e & 0x0FFF;
2167
2168           if (t >= sizeof (tbl) / sizeof (tbl[0]))
2169             t = (sizeof (tbl) / sizeof (tbl[0])) - 1;
2170
2171           fprintf (file,
2172                    _("\treloc %4d offset %4x [%4lx] %s"),
2173                    j, off, (unsigned long) (off + virtual_address), tbl[t]);
2174
2175           p += 2;
2176           j++;
2177
2178           /* HIGHADJ takes an argument, - the next record *is* the
2179              low 16 bits of addend.  */
2180           if (t == IMAGE_REL_BASED_HIGHADJ && p + 2 <= chunk_end)
2181             {
2182               fprintf (file, " (%4x)", (unsigned int) bfd_get_16 (abfd, p));
2183               p += 2;
2184               j++;
2185             }
2186
2187           fprintf (file, "\n");
2188         }
2189     }
2190
2191   free (data);
2192
2193   return TRUE;
2194 }
2195 \f
2196 /* A data structure describing the regions of a .rsrc section.
2197    Some fields are filled in as the section is parsed.  */
2198
2199 typedef struct rsrc_regions
2200 {
2201   bfd_byte * section_start;
2202   bfd_byte * section_end;
2203   bfd_byte * strings_start;
2204   bfd_byte * resource_start;
2205 } rsrc_regions;
2206
2207 static bfd_byte *
2208 rsrc_print_resource_directory (FILE * , bfd *, unsigned int, bfd_byte *,
2209                                rsrc_regions *, bfd_vma);
2210
2211 static bfd_byte *
2212 rsrc_print_resource_entries (FILE *         file,
2213                              bfd *          abfd,
2214                              unsigned int   indent,
2215                              bfd_boolean    is_name,
2216                              bfd_byte *     data,
2217                              rsrc_regions * regions,
2218                              bfd_vma        rva_bias)
2219 {
2220   unsigned long entry, addr, size;
2221
2222   if (data + 8 >= regions->section_end)
2223     return regions->section_end + 1;
2224
2225   fprintf (file, _("%03x %*.s Entry: "), (int)(data - regions->section_start), indent, " ");
2226
2227   entry = (long) bfd_get_32 (abfd, data);
2228   if (is_name)
2229     {
2230       bfd_byte * name;
2231
2232       /* Note - the documentation says that this field is an RVA value
2233          but windres appears to produce a section relative offset with
2234          the top bit set.  Support both styles for now.  */
2235       if (HighBitSet (entry))
2236         name = regions->section_start + WithoutHighBit (entry);
2237       else
2238         name = regions->section_start + entry - rva_bias;
2239
2240       if (name + 2 < regions->section_end)
2241         {
2242           unsigned int len;
2243
2244           if (regions->strings_start == NULL)
2245             regions->strings_start = name;
2246
2247           len = bfd_get_16 (abfd, name);
2248
2249           fprintf (file, _("name: [val: %08lx len %d]: "), entry, len);
2250           if (name + 2 + len * 2 < regions->section_end)
2251             {
2252               /* This strange loop is to cope with multibyte characters.  */
2253               while (len --)
2254                 {
2255                   name += 2;
2256                   fprintf (file, "%.1s", name);
2257                 }
2258             }
2259           else
2260             fprintf (file, _("<corrupt string length: %#x>"), len);
2261         }
2262       else
2263         fprintf (file, _("<corrupt string offset: %#lx>"), entry);
2264     }
2265   else
2266     fprintf (file, _("ID: %#08lx"), entry);
2267
2268   entry = (long) bfd_get_32 (abfd, data + 4);
2269   fprintf (file, _(", Value: %#08lx\n"), entry);
2270
2271   if (HighBitSet  (entry))
2272     return rsrc_print_resource_directory (file, abfd, indent + 1,
2273                                           regions->section_start + WithoutHighBit (entry),
2274                                           regions, rva_bias);
2275
2276   if (regions->section_start + entry + 16 >= regions->section_end)
2277     return regions->section_end + 1;
2278
2279   fprintf (file, _("%03x %*.s  Leaf: Addr: %#08lx, Size: %#08lx, Codepage: %d\n"),
2280            (int) (entry),
2281            indent, " ",
2282            addr = (long) bfd_get_32 (abfd, regions->section_start + entry),
2283            size = (long) bfd_get_32 (abfd, regions->section_start + entry + 4),
2284            (int) bfd_get_32 (abfd, regions->section_start + entry + 8));
2285
2286   /* Check that the reserved entry is 0.  */
2287   if (bfd_get_32 (abfd, regions->section_start + entry + 12) != 0
2288       /* And that the data address/size is valid too.  */
2289       || (regions->section_start + (addr - rva_bias) + size > regions->section_end))
2290     return regions->section_end + 1;
2291
2292   if (regions->resource_start == NULL)
2293     regions->resource_start = regions->section_start + (addr - rva_bias);
2294
2295   return regions->section_start + (addr - rva_bias) + size;
2296 }
2297
2298 #define max(a,b) ((a) > (b) ? (a) : (b))
2299 #define min(a,b) ((a) < (b) ? (a) : (b))
2300
2301 static bfd_byte *
2302 rsrc_print_resource_directory (FILE *         file,
2303                                bfd *          abfd,
2304                                unsigned int   indent,
2305                                bfd_byte *     data,
2306                                rsrc_regions * regions,
2307                                bfd_vma        rva_bias)
2308 {
2309   unsigned int num_names, num_ids;
2310   bfd_byte * highest_data = data;
2311
2312   if (data + 16 >= regions->section_end)
2313     return regions->section_end + 1;
2314
2315   fprintf (file, "%03x %*.s ", (int)(data - regions->section_start), indent, " ");
2316   switch (indent)
2317     {
2318     case 0: fprintf (file, "Type"); break;
2319     case 2: fprintf (file, "Name"); break;
2320     case 4: fprintf (file, "Language"); break;
2321     default: fprintf (file, "<unknown>"); break;
2322     }
2323
2324   fprintf (file, _(" Table: Char: %d, Time: %08lx, Ver: %d/%d, Num Names: %d, IDs: %d\n"),
2325            (int) bfd_get_32 (abfd, data),
2326            (long) bfd_get_32 (abfd, data + 4),
2327            (int)  bfd_get_16 (abfd, data + 8),
2328            (int)  bfd_get_16 (abfd, data + 10),
2329            num_names = (int) bfd_get_16 (abfd, data + 12),
2330            num_ids =   (int) bfd_get_16 (abfd, data + 14));
2331   data += 16;
2332
2333   while (num_names --)
2334     {
2335       bfd_byte * entry_end;
2336
2337       entry_end = rsrc_print_resource_entries (file, abfd, indent + 1, TRUE,
2338                                                data, regions, rva_bias);
2339       data += 8;
2340       highest_data = max (highest_data, entry_end);
2341       if (entry_end >= regions->section_end)
2342         return entry_end;
2343     }
2344
2345   while (num_ids --)
2346     {
2347       bfd_byte * entry_end;
2348
2349       entry_end = rsrc_print_resource_entries (file, abfd, indent + 1, FALSE,
2350                                                data, regions, rva_bias);
2351       data += 8;
2352       highest_data = max (highest_data, entry_end);
2353       if (entry_end >= regions->section_end)
2354         return entry_end;
2355     }
2356
2357   return max (highest_data, data);
2358 }
2359
2360 /* Display the contents of a .rsrc section.  We do not try to
2361    reproduce the resources, windres does that.  Instead we dump
2362    the tables in a human readable format.  */
2363
2364 static bfd_boolean
2365 rsrc_print_section (bfd * abfd, void * vfile)
2366 {
2367   bfd_vma rva_bias;
2368   pe_data_type * pe;
2369   FILE * file = (FILE *) vfile;
2370   bfd_size_type datasize;
2371   asection * section;
2372   bfd_byte * data;
2373   rsrc_regions regions;
2374
2375   pe = pe_data (abfd);
2376   if (pe == NULL)
2377     return TRUE;
2378
2379   section = bfd_get_section_by_name (abfd, ".rsrc");
2380   if (section == NULL)
2381     return TRUE;
2382   if (!(section->flags & SEC_HAS_CONTENTS))
2383     return TRUE;
2384
2385   datasize = section->size;
2386   if (datasize == 0)
2387     return TRUE;
2388
2389   rva_bias = section->vma - pe->pe_opthdr.ImageBase;
2390
2391   if (! bfd_malloc_and_get_section (abfd, section, & data))
2392     {
2393       if (data != NULL)
2394         free (data);
2395       return FALSE;
2396     }
2397
2398   regions.section_start = data;
2399   regions.section_end = data + datasize;
2400   regions.strings_start = NULL;
2401   regions.resource_start = NULL;
2402
2403   fflush (file);
2404   fprintf (file, "\nThe .rsrc Resource Directory section:\n");
2405
2406   while (data < regions.section_end)
2407     {
2408       bfd_byte * p = data;
2409
2410       data = rsrc_print_resource_directory (file, abfd, 0, data, & regions, rva_bias);
2411
2412       if (data == regions.section_end + 1)
2413         fprintf (file, _("Corrupt .rsrc section detected!\n"));
2414       else
2415         {
2416           /* Align data before continuing.  */
2417           int align = (1 << section->alignment_power) - 1;
2418
2419           data = (bfd_byte *) (((ptrdiff_t) (data + align)) & ~ align);
2420           rva_bias += data - p;
2421
2422           /* For reasons that are unclear .rsrc sections are sometimes created
2423              aligned to a 1^3 boundary even when their alignment is set at
2424              1^2.  Catch that case here before we issue a spurious warning
2425              message.  */
2426           if (data == (regions.section_end - 4))
2427             data = regions.section_end;
2428           else if (data < regions.section_end)
2429             {
2430               /* If the extra data is all zeros then do not complain.
2431                  This is just padding so that the section meets the
2432                  page size requirements.  */
2433               while (data ++ < regions.section_end)
2434                 if (*data != 0)
2435                   break;
2436               if (data < regions.section_end)
2437                 fprintf (file, _("\nWARNING: Extra data in .rsrc section - it will be ignored by Windows:\n"));
2438             }
2439         }
2440     }
2441
2442   if (regions.strings_start != NULL)
2443     fprintf (file, " String table starts at %03x\n",
2444              (int) (regions.strings_start - regions.section_start));
2445   if (regions.resource_start != NULL)
2446     fprintf (file, " Resources start at %03xx\n",
2447              (int) (regions.resource_start - regions.section_start));
2448   
2449   free (regions.section_start);
2450   return TRUE;
2451 }
2452
2453 #define IMAGE_NUMBEROF_DEBUG_TYPES 12
2454
2455 static char * debug_type_names[IMAGE_NUMBEROF_DEBUG_TYPES] =
2456 {
2457   "Unknown",
2458   "COFF",
2459   "CodeView",
2460   "FPO",
2461   "Misc",
2462   "Exception",
2463   "Fixup",
2464   "OMAP-to-SRC",
2465   "OMAP-from-SRC",
2466   "Borland",
2467   "Reserved",
2468   "CLSID",
2469 };
2470
2471 static bfd_boolean
2472 pe_print_debugdata (bfd * abfd, void * vfile)
2473 {
2474   FILE *file = (FILE *) vfile;
2475   pe_data_type *pe = pe_data (abfd);
2476   struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
2477   asection *section;
2478   bfd_byte *data = 0;
2479   bfd_size_type dataoff;
2480   unsigned int i;
2481
2482   bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
2483   bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
2484
2485   if (size == 0)
2486     return TRUE;
2487
2488   addr += extra->ImageBase;
2489   for (section = abfd->sections; section != NULL; section = section->next)
2490     {
2491       if ((addr >= section->vma) && (addr < (section->vma + section->size)))
2492         break;
2493     }
2494
2495   if (section == NULL)
2496     {
2497       fprintf (file,
2498                _("\nThere is a debug directory, but the section containing it could not be found\n"));
2499       return TRUE;
2500     }
2501   else if (!(section->flags & SEC_HAS_CONTENTS))
2502     {
2503       fprintf (file,
2504                _("\nThere is a debug directory in %s, but that section has no contents\n"),
2505                section->name);
2506       return TRUE;
2507     }
2508
2509   fprintf (file, _("\nThere is a debug directory in %s at 0x%lx\n\n"),
2510            section->name, (unsigned long) addr);
2511
2512   dataoff = addr - section->vma;
2513
2514   fprintf (file,
2515            _("Type                Size     Rva      Offset\n"));
2516
2517   /* Read the whole section. */
2518   if (!bfd_malloc_and_get_section (abfd, section, &data))
2519     {
2520       if (data != NULL)
2521         free (data);
2522       return FALSE;
2523     }
2524
2525   for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
2526     {
2527       const char *type_name;
2528       struct external_IMAGE_DEBUG_DIRECTORY *ext
2529         = &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i];
2530       struct internal_IMAGE_DEBUG_DIRECTORY idd;
2531
2532       _bfd_XXi_swap_debugdir_in (abfd, ext, &idd);
2533
2534       if ((idd.Type) > IMAGE_NUMBEROF_DEBUG_TYPES)
2535         type_name = debug_type_names[0];
2536       else
2537         type_name = debug_type_names[idd.Type];
2538
2539       fprintf (file, " %2ld  %14s %08lx %08lx %08lx\n",
2540                idd.Type, type_name, idd.SizeOfData,
2541                idd.AddressOfRawData, idd.PointerToRawData);
2542
2543       if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW)
2544         {
2545           char signature[CV_INFO_SIGNATURE_LENGTH * 2 + 1];
2546           char buffer[256 + 1];
2547           CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer;
2548
2549           /* The debug entry doesn't have to have to be in a section,
2550              in which case AddressOfRawData is 0, so always use PointerToRawData.  */
2551           if (!_bfd_XXi_slurp_codeview_record (abfd, (file_ptr) idd.PointerToRawData,
2552                                                idd.SizeOfData, cvinfo))
2553             continue;
2554
2555           for (i = 0; i < cvinfo->SignatureLength; i++)
2556             sprintf (&signature[i*2], "%02x", cvinfo->Signature[i] & 0xff);
2557
2558           fprintf (file, "(format %c%c%c%c signature %s age %ld)\n",
2559                    buffer[0], buffer[1], buffer[2], buffer[3],
2560                    signature, cvinfo->Age);
2561         }
2562     }
2563
2564   if (size % sizeof (struct external_IMAGE_DEBUG_DIRECTORY) != 0)
2565     fprintf (file,
2566             _("The debug directory size is not a multiple of the debug directory entry size\n"));
2567
2568   return TRUE;
2569 }
2570
2571 /* Print out the program headers.  */
2572
2573 bfd_boolean
2574 _bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile)
2575 {
2576   FILE *file = (FILE *) vfile;
2577   int j;
2578   pe_data_type *pe = pe_data (abfd);
2579   struct internal_extra_pe_aouthdr *i = &pe->pe_opthdr;
2580   const char *subsystem_name = NULL;
2581   const char *name;
2582
2583   /* The MS dumpbin program reportedly ands with 0xff0f before
2584      printing the characteristics field.  Not sure why.  No reason to
2585      emulate it here.  */
2586   fprintf (file, _("\nCharacteristics 0x%x\n"), pe->real_flags);
2587 #undef PF
2588 #define PF(x, y) if (pe->real_flags & x) { fprintf (file, "\t%s\n", y); }
2589   PF (IMAGE_FILE_RELOCS_STRIPPED, "relocations stripped");
2590   PF (IMAGE_FILE_EXECUTABLE_IMAGE, "executable");
2591   PF (IMAGE_FILE_LINE_NUMS_STRIPPED, "line numbers stripped");
2592   PF (IMAGE_FILE_LOCAL_SYMS_STRIPPED, "symbols stripped");
2593   PF (IMAGE_FILE_LARGE_ADDRESS_AWARE, "large address aware");
2594   PF (IMAGE_FILE_BYTES_REVERSED_LO, "little endian");
2595   PF (IMAGE_FILE_32BIT_MACHINE, "32 bit words");
2596   PF (IMAGE_FILE_DEBUG_STRIPPED, "debugging information removed");
2597   PF (IMAGE_FILE_SYSTEM, "system file");
2598   PF (IMAGE_FILE_DLL, "DLL");
2599   PF (IMAGE_FILE_BYTES_REVERSED_HI, "big endian");
2600 #undef PF
2601
2602   /* ctime implies '\n'.  */
2603   {
2604     time_t t = pe->coff.timestamp;
2605     fprintf (file, "\nTime/Date\t\t%s", ctime (&t));
2606   }
2607
2608 #ifndef IMAGE_NT_OPTIONAL_HDR_MAGIC
2609 # define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b
2610 #endif
2611 #ifndef IMAGE_NT_OPTIONAL_HDR64_MAGIC
2612 # define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
2613 #endif
2614 #ifndef IMAGE_NT_OPTIONAL_HDRROM_MAGIC
2615 # define IMAGE_NT_OPTIONAL_HDRROM_MAGIC 0x107
2616 #endif
2617
2618   switch (i->Magic)
2619     {
2620     case IMAGE_NT_OPTIONAL_HDR_MAGIC:
2621       name = "PE32";
2622       break;
2623     case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
2624       name = "PE32+";
2625       break;
2626     case IMAGE_NT_OPTIONAL_HDRROM_MAGIC:
2627       name = "ROM";
2628       break;
2629     default:
2630       name = NULL;
2631       break;
2632     }
2633   fprintf (file, "Magic\t\t\t%04x", i->Magic);
2634   if (name)
2635     fprintf (file, "\t(%s)",name);
2636   fprintf (file, "\nMajorLinkerVersion\t%d\n", i->MajorLinkerVersion);
2637   fprintf (file, "MinorLinkerVersion\t%d\n", i->MinorLinkerVersion);
2638   fprintf (file, "SizeOfCode\t\t%08lx\n", (unsigned long) i->SizeOfCode);
2639   fprintf (file, "SizeOfInitializedData\t%08lx\n",
2640            (unsigned long) i->SizeOfInitializedData);
2641   fprintf (file, "SizeOfUninitializedData\t%08lx\n",
2642            (unsigned long) i->SizeOfUninitializedData);
2643   fprintf (file, "AddressOfEntryPoint\t");
2644   bfd_fprintf_vma (abfd, file, i->AddressOfEntryPoint);
2645   fprintf (file, "\nBaseOfCode\t\t");
2646   bfd_fprintf_vma (abfd, file, i->BaseOfCode);
2647 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
2648   /* PE32+ does not have BaseOfData member!  */
2649   fprintf (file, "\nBaseOfData\t\t");
2650   bfd_fprintf_vma (abfd, file, i->BaseOfData);
2651 #endif
2652
2653   fprintf (file, "\nImageBase\t\t");
2654   bfd_fprintf_vma (abfd, file, i->ImageBase);
2655   fprintf (file, "\nSectionAlignment\t");
2656   bfd_fprintf_vma (abfd, file, i->SectionAlignment);
2657   fprintf (file, "\nFileAlignment\t\t");
2658   bfd_fprintf_vma (abfd, file, i->FileAlignment);
2659   fprintf (file, "\nMajorOSystemVersion\t%d\n", i->MajorOperatingSystemVersion);
2660   fprintf (file, "MinorOSystemVersion\t%d\n", i->MinorOperatingSystemVersion);
2661   fprintf (file, "MajorImageVersion\t%d\n", i->MajorImageVersion);
2662   fprintf (file, "MinorImageVersion\t%d\n", i->MinorImageVersion);
2663   fprintf (file, "MajorSubsystemVersion\t%d\n", i->MajorSubsystemVersion);
2664   fprintf (file, "MinorSubsystemVersion\t%d\n", i->MinorSubsystemVersion);
2665   fprintf (file, "Win32Version\t\t%08lx\n", (unsigned long) i->Reserved1);
2666   fprintf (file, "SizeOfImage\t\t%08lx\n", (unsigned long) i->SizeOfImage);
2667   fprintf (file, "SizeOfHeaders\t\t%08lx\n", (unsigned long) i->SizeOfHeaders);
2668   fprintf (file, "CheckSum\t\t%08lx\n", (unsigned long) i->CheckSum);
2669
2670   switch (i->Subsystem)
2671     {
2672     case IMAGE_SUBSYSTEM_UNKNOWN:
2673       subsystem_name = "unspecified";
2674       break;
2675     case IMAGE_SUBSYSTEM_NATIVE:
2676       subsystem_name = "NT native";
2677       break;
2678     case IMAGE_SUBSYSTEM_WINDOWS_GUI:
2679       subsystem_name = "Windows GUI";
2680       break;
2681     case IMAGE_SUBSYSTEM_WINDOWS_CUI:
2682       subsystem_name = "Windows CUI";
2683       break;
2684     case IMAGE_SUBSYSTEM_POSIX_CUI:
2685       subsystem_name = "POSIX CUI";
2686       break;
2687     case IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:
2688       subsystem_name = "Wince CUI";
2689       break;
2690     // These are from UEFI Platform Initialization Specification 1.1.
2691     case IMAGE_SUBSYSTEM_EFI_APPLICATION:
2692       subsystem_name = "EFI application";
2693       break;
2694     case IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:
2695       subsystem_name = "EFI boot service driver";
2696       break;
2697     case IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
2698       subsystem_name = "EFI runtime driver";
2699       break;
2700     case IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER:
2701       subsystem_name = "SAL runtime driver";
2702       break;
2703     // This is from revision 8.0 of the MS PE/COFF spec
2704     case IMAGE_SUBSYSTEM_XBOX:
2705       subsystem_name = "XBOX";
2706       break;
2707     // Added default case for clarity - subsystem_name is NULL anyway.
2708     default:
2709       subsystem_name = NULL;
2710     }
2711
2712   fprintf (file, "Subsystem\t\t%08x", i->Subsystem);
2713   if (subsystem_name)
2714     fprintf (file, "\t(%s)", subsystem_name);
2715   fprintf (file, "\nDllCharacteristics\t%08x\n", i->DllCharacteristics);
2716   fprintf (file, "SizeOfStackReserve\t");
2717   bfd_fprintf_vma (abfd, file, i->SizeOfStackReserve);
2718   fprintf (file, "\nSizeOfStackCommit\t");
2719   bfd_fprintf_vma (abfd, file, i->SizeOfStackCommit);
2720   fprintf (file, "\nSizeOfHeapReserve\t");
2721   bfd_fprintf_vma (abfd, file, i->SizeOfHeapReserve);
2722   fprintf (file, "\nSizeOfHeapCommit\t");
2723   bfd_fprintf_vma (abfd, file, i->SizeOfHeapCommit);
2724   fprintf (file, "\nLoaderFlags\t\t%08lx\n", (unsigned long) i->LoaderFlags);
2725   fprintf (file, "NumberOfRvaAndSizes\t%08lx\n",
2726            (unsigned long) i->NumberOfRvaAndSizes);
2727
2728   fprintf (file, "\nThe Data Directory\n");
2729   for (j = 0; j < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; j++)
2730     {
2731       fprintf (file, "Entry %1x ", j);
2732       bfd_fprintf_vma (abfd, file, i->DataDirectory[j].VirtualAddress);
2733       fprintf (file, " %08lx ", (unsigned long) i->DataDirectory[j].Size);
2734       fprintf (file, "%s\n", dir_names[j]);
2735     }
2736
2737   pe_print_idata (abfd, vfile);
2738   pe_print_edata (abfd, vfile);
2739   if (bfd_coff_have_print_pdata (abfd))
2740     bfd_coff_print_pdata (abfd, vfile);
2741   else
2742     pe_print_pdata (abfd, vfile);
2743   pe_print_reloc (abfd, vfile);
2744   pe_print_debugdata (abfd, file);
2745
2746   rsrc_print_section (abfd, vfile);
2747
2748   return TRUE;
2749 }
2750
2751 static bfd_boolean
2752 is_vma_in_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sect, void *obj)
2753 {
2754   bfd_vma addr = * (bfd_vma *) obj;
2755   return (addr >= sect->vma) && (addr < (sect->vma + sect->size));
2756 }
2757
2758 static asection *
2759 find_section_by_vma (bfd *abfd, bfd_vma addr)
2760 {
2761   return bfd_sections_find_if (abfd, is_vma_in_section, (void *) & addr);
2762 }
2763
2764 /* Copy any private info we understand from the input bfd
2765    to the output bfd.  */
2766
2767 bfd_boolean
2768 _bfd_XX_bfd_copy_private_bfd_data_common (bfd * ibfd, bfd * obfd)
2769 {
2770   pe_data_type *ipe, *ope;
2771
2772   /* One day we may try to grok other private data.  */
2773   if (ibfd->xvec->flavour != bfd_target_coff_flavour
2774       || obfd->xvec->flavour != bfd_target_coff_flavour)
2775     return TRUE;
2776
2777   ipe = pe_data (ibfd);
2778   ope = pe_data (obfd);
2779
2780   /* pe_opthdr is copied in copy_object.  */
2781   ope->dll = ipe->dll;
2782
2783   /* Don't copy input subsystem if output is different from input.  */
2784   if (obfd->xvec != ibfd->xvec)
2785     ope->pe_opthdr.Subsystem = IMAGE_SUBSYSTEM_UNKNOWN;
2786
2787   /* For strip: if we removed .reloc, we'll make a real mess of things
2788      if we don't remove this entry as well.  */
2789   if (! pe_data (obfd)->has_reloc_section)
2790     {
2791       pe_data (obfd)->pe_opthdr.DataDirectory[PE_BASE_RELOCATION_TABLE].VirtualAddress = 0;
2792       pe_data (obfd)->pe_opthdr.DataDirectory[PE_BASE_RELOCATION_TABLE].Size = 0;
2793     }
2794
2795   /* For PIE, if there is .reloc, we won't add IMAGE_FILE_RELOCS_STRIPPED.
2796      But there is no .reloc, we make sure that IMAGE_FILE_RELOCS_STRIPPED
2797      won't be added.  */
2798   if (! pe_data (ibfd)->has_reloc_section
2799       && ! (pe_data (ibfd)->real_flags & IMAGE_FILE_RELOCS_STRIPPED))
2800     pe_data (obfd)->dont_strip_reloc = 1;
2801
2802   /* The file offsets contained in the debug directory need rewriting.  */
2803   if (ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size != 0)
2804     {
2805       bfd_vma addr = ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].VirtualAddress
2806         + ope->pe_opthdr.ImageBase;
2807       asection *section = find_section_by_vma (obfd, addr);
2808       bfd_byte *data;
2809
2810       if (section && bfd_malloc_and_get_section (obfd, section, &data))
2811         {
2812           unsigned int i;
2813           struct external_IMAGE_DEBUG_DIRECTORY *dd =
2814             (struct external_IMAGE_DEBUG_DIRECTORY *)(data + (addr - section->vma));
2815
2816           for (i = 0; i < ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size
2817                  / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
2818             {
2819               asection *ddsection;
2820               struct external_IMAGE_DEBUG_DIRECTORY *edd = &(dd[i]);
2821               struct internal_IMAGE_DEBUG_DIRECTORY idd;
2822
2823               _bfd_XXi_swap_debugdir_in (obfd, edd, &idd);
2824
2825               if (idd.AddressOfRawData == 0)
2826                 continue; /* RVA 0 means only offset is valid, not handled yet.  */
2827
2828               ddsection = find_section_by_vma (obfd, idd.AddressOfRawData + ope->pe_opthdr.ImageBase);
2829               if (!ddsection)
2830                 continue; /* Not in a section! */
2831
2832               idd.PointerToRawData = ddsection->filepos + (idd.AddressOfRawData
2833                                                            + ope->pe_opthdr.ImageBase) - ddsection->vma;
2834
2835               _bfd_XXi_swap_debugdir_out (obfd, &idd, edd);
2836             }
2837
2838           if (!bfd_set_section_contents (obfd, section, data, 0, section->size))
2839             _bfd_error_handler (_("Failed to update file offsets in debug directory"));
2840         }
2841     }
2842
2843   return TRUE;
2844 }
2845
2846 /* Copy private section data.  */
2847
2848 bfd_boolean
2849 _bfd_XX_bfd_copy_private_section_data (bfd *ibfd,
2850                                        asection *isec,
2851                                        bfd *obfd,
2852                                        asection *osec)
2853 {
2854   if (bfd_get_flavour (ibfd) != bfd_target_coff_flavour
2855       || bfd_get_flavour (obfd) != bfd_target_coff_flavour)
2856     return TRUE;
2857
2858   if (coff_section_data (ibfd, isec) != NULL
2859       && pei_section_data (ibfd, isec) != NULL)
2860     {
2861       if (coff_section_data (obfd, osec) == NULL)
2862         {
2863           bfd_size_type amt = sizeof (struct coff_section_tdata);
2864           osec->used_by_bfd = bfd_zalloc (obfd, amt);
2865           if (osec->used_by_bfd == NULL)
2866             return FALSE;
2867         }
2868
2869       if (pei_section_data (obfd, osec) == NULL)
2870         {
2871           bfd_size_type amt = sizeof (struct pei_section_tdata);
2872           coff_section_data (obfd, osec)->tdata = bfd_zalloc (obfd, amt);
2873           if (coff_section_data (obfd, osec)->tdata == NULL)
2874             return FALSE;
2875         }
2876
2877       pei_section_data (obfd, osec)->virt_size =
2878         pei_section_data (ibfd, isec)->virt_size;
2879       pei_section_data (obfd, osec)->pe_flags =
2880         pei_section_data (ibfd, isec)->pe_flags;
2881     }
2882
2883   return TRUE;
2884 }
2885
2886 void
2887 _bfd_XX_get_symbol_info (bfd * abfd, asymbol *symbol, symbol_info *ret)
2888 {
2889   coff_get_symbol_info (abfd, symbol, ret);
2890 }
2891
2892 #if !defined(COFF_WITH_pep) && defined(COFF_WITH_pex64)
2893 static int
2894 sort_x64_pdata (const void *l, const void *r)
2895 {
2896   const char *lp = (const char *) l;
2897   const char *rp = (const char *) r;
2898   bfd_vma vl, vr;
2899   vl = bfd_getl32 (lp); vr = bfd_getl32 (rp);
2900   if (vl != vr)
2901     return (vl < vr ? -1 : 1);
2902   /* We compare just begin address.  */
2903   return 0;
2904 }
2905 #endif
2906 \f
2907 /* Functions to process a .rsrc section.  */
2908
2909 static unsigned int sizeof_leaves;
2910 static unsigned int sizeof_strings;
2911 static unsigned int sizeof_tables_and_entries;
2912
2913 static bfd_byte *
2914 rsrc_count_directory (bfd *, bfd_byte *, bfd_byte *, bfd_byte *, bfd_vma);
2915
2916 static bfd_byte *
2917 rsrc_count_entries (bfd *          abfd,
2918                     bfd_boolean    is_name,
2919                     bfd_byte *     datastart,
2920                     bfd_byte *     data,
2921                     bfd_byte *     dataend,
2922                     bfd_vma        rva_bias)
2923 {
2924   unsigned long entry, addr, size;
2925
2926   if (data + 8 >= dataend)
2927     return dataend + 1;
2928
2929   if (is_name)
2930     {
2931       bfd_byte * name;
2932
2933       entry = (long) bfd_get_32 (abfd, data);
2934
2935       if (HighBitSet (entry))
2936         name = datastart + WithoutHighBit (entry);
2937       else
2938         name = datastart + entry - rva_bias;
2939
2940       if (name + 2 >= dataend)
2941         return dataend + 1;
2942
2943       unsigned int len = bfd_get_16 (abfd, name);
2944       if (len == 0 || len > 256)
2945         return dataend + 1;
2946     }
2947
2948   entry = (long) bfd_get_32 (abfd, data + 4);
2949
2950   if (HighBitSet (entry))
2951     return rsrc_count_directory (abfd,
2952                                  datastart,
2953                                  datastart + WithoutHighBit (entry),
2954                                  dataend, rva_bias);
2955
2956   if (datastart + entry + 16 >= dataend)
2957     return dataend + 1;
2958
2959   addr = (long) bfd_get_32 (abfd, datastart + entry);
2960   size = (long) bfd_get_32 (abfd, datastart + entry + 4);
2961
2962   return datastart + addr - rva_bias + size;
2963 }
2964
2965 static bfd_byte *
2966 rsrc_count_directory (bfd *          abfd,
2967                       bfd_byte *     datastart,
2968                       bfd_byte *     data,
2969                       bfd_byte *     dataend,
2970                       bfd_vma        rva_bias)
2971 {
2972   unsigned int  num_entries, num_ids;
2973   bfd_byte *    highest_data = data;
2974
2975   if (data + 16 >= dataend)
2976     return dataend + 1;
2977
2978   num_entries  = (int) bfd_get_16 (abfd, data + 12);
2979   num_ids      = (int) bfd_get_16 (abfd, data + 14);
2980
2981   num_entries += num_ids;
2982
2983   data += 16;
2984
2985   while (num_entries --)
2986     {
2987       bfd_byte * entry_end;
2988
2989       entry_end = rsrc_count_entries (abfd, num_entries >= num_ids,
2990                                       datastart, data, dataend, rva_bias);
2991       data += 8;
2992       highest_data = max (highest_data, entry_end);
2993       if (entry_end >= dataend)
2994         break;
2995     }
2996
2997   return max (highest_data, data);
2998 }
2999
3000 typedef struct rsrc_dir_chain
3001 {
3002   unsigned int         num_entries;
3003   struct rsrc_entry *  first_entry;
3004   struct rsrc_entry *  last_entry;
3005 } rsrc_dir_chain;
3006
3007 typedef struct rsrc_directory
3008 {
3009   unsigned int characteristics;
3010   unsigned int time;
3011   unsigned int major;
3012   unsigned int minor;
3013
3014   rsrc_dir_chain names;
3015   rsrc_dir_chain ids;
3016
3017   struct rsrc_entry * entry;
3018 } rsrc_directory;
3019
3020 typedef struct rsrc_string
3021 {
3022   unsigned int  len;
3023   bfd_byte *    string;
3024 } rsrc_string;
3025
3026 typedef struct rsrc_leaf
3027 {
3028   unsigned int  size;
3029   unsigned int  codepage;
3030   bfd_byte *    data;
3031 } rsrc_leaf;
3032
3033 typedef struct rsrc_entry
3034 {
3035   bfd_boolean is_name;
3036   union
3037   {
3038     unsigned int          id;
3039     struct rsrc_string    name;
3040   } name_id;
3041
3042   bfd_boolean is_dir;
3043   union
3044   {
3045     struct rsrc_directory * directory;
3046     struct rsrc_leaf *      leaf;
3047   } value;
3048
3049   struct rsrc_entry *     next_entry;
3050   struct rsrc_directory * parent;
3051 } rsrc_entry;
3052
3053 static bfd_byte *
3054 rsrc_parse_directory (bfd *, rsrc_directory *, bfd_byte *,
3055                       bfd_byte *, bfd_byte *, bfd_vma, rsrc_entry *);
3056
3057 static bfd_byte *
3058 rsrc_parse_entry (bfd *            abfd,
3059                   bfd_boolean      is_name,
3060                   rsrc_entry *     entry,
3061                   bfd_byte *       datastart,
3062                   bfd_byte *       data,
3063                   bfd_byte *       dataend,
3064                   bfd_vma          rva_bias,
3065                   rsrc_directory * parent)
3066 {
3067   unsigned long val, addr, size;
3068
3069   val = bfd_get_32 (abfd, data);
3070
3071   entry->parent = parent;
3072   entry->is_name = is_name;
3073
3074   if (is_name)
3075     {
3076       /* FIXME: Add range checking ?  */
3077       if (HighBitSet (val))
3078         {
3079           val = WithoutHighBit (val);
3080
3081           entry->name_id.name.len    = bfd_get_16 (abfd, datastart + val);
3082           entry->name_id.name.string = datastart + val + 2;
3083         }
3084       else
3085         {
3086           entry->name_id.name.len    = bfd_get_16 (abfd, datastart + val
3087                                                    - rva_bias);
3088           entry->name_id.name.string = datastart + val - rva_bias + 2;
3089         }
3090     }
3091   else
3092     entry->name_id.id = val;
3093
3094   val = bfd_get_32 (abfd, data + 4);
3095
3096   if (HighBitSet (val))
3097     {
3098       entry->is_dir = TRUE;
3099       entry->value.directory = bfd_malloc (sizeof * entry->value.directory);
3100       if (entry->value.directory == NULL)
3101         return dataend;
3102
3103       return rsrc_parse_directory (abfd, entry->value.directory,
3104                                    datastart,
3105                                    datastart + WithoutHighBit (val),
3106                                    dataend, rva_bias, entry);
3107     }
3108
3109   entry->is_dir = FALSE;
3110   entry->value.leaf = bfd_malloc (sizeof * entry->value.leaf);
3111   if (entry->value.leaf == NULL)
3112     return dataend;
3113
3114   addr = bfd_get_32 (abfd, datastart + val);
3115   size = entry->value.leaf->size = bfd_get_32 (abfd, datastart + val + 4);
3116   entry->value.leaf->codepage = bfd_get_32 (abfd, datastart + val + 8);
3117
3118   entry->value.leaf->data = bfd_malloc (size);
3119   if (entry->value.leaf->data == NULL)
3120     return dataend;
3121
3122   memcpy (entry->value.leaf->data, datastart + addr - rva_bias, size);
3123   return datastart + (addr - rva_bias) + size;
3124 }
3125
3126 static bfd_byte *
3127 rsrc_parse_entries (bfd *            abfd,
3128                     rsrc_dir_chain * chain,
3129                     bfd_boolean      is_name,
3130                     bfd_byte *       highest_data,
3131                     bfd_byte *       datastart,
3132                     bfd_byte *       data,
3133                     bfd_byte *       dataend,
3134                     bfd_vma          rva_bias,
3135                     rsrc_directory * parent)
3136 {
3137   unsigned int i;
3138   rsrc_entry * entry;
3139
3140   if (chain->num_entries == 0)
3141     {
3142       chain->first_entry = chain->last_entry = NULL;
3143       return highest_data;
3144     }
3145
3146   entry = bfd_malloc (sizeof * entry);
3147   if (entry == NULL)
3148     return dataend;
3149
3150   chain->first_entry = entry;
3151
3152   for (i = chain->num_entries; i--;)
3153     {
3154       bfd_byte * entry_end;
3155
3156       entry_end = rsrc_parse_entry (abfd, is_name, entry, datastart,
3157                                     data, dataend, rva_bias, parent);
3158       data += 8;
3159       highest_data = max (entry_end, highest_data);
3160       if (entry_end > dataend)
3161         return dataend;
3162
3163       if (i)
3164         {
3165           entry->next_entry = bfd_malloc (sizeof * entry);
3166           entry = entry->next_entry;
3167           if (entry == NULL)
3168             return dataend;
3169         }
3170       else
3171         entry->next_entry = NULL;
3172     }
3173
3174   chain->last_entry = entry;
3175
3176   return highest_data;
3177 }
3178
3179 static bfd_byte *
3180 rsrc_parse_directory (bfd *            abfd,
3181                       rsrc_directory * table,
3182                       bfd_byte *       datastart,
3183                       bfd_byte *       data,
3184                       bfd_byte *       dataend,
3185                       bfd_vma          rva_bias,
3186                       rsrc_entry *     entry)
3187 {
3188   bfd_byte * highest_data = data;
3189
3190   if (table == NULL)
3191     return dataend;
3192
3193   table->characteristics = bfd_get_32 (abfd, data);
3194   table->time = bfd_get_32 (abfd, data + 4);
3195   table->major = bfd_get_16 (abfd, data + 8);
3196   table->minor = bfd_get_16 (abfd, data + 10);
3197   table->names.num_entries = bfd_get_16 (abfd, data + 12);
3198   table->ids.num_entries = bfd_get_16 (abfd, data + 14);
3199   table->entry = entry;
3200
3201   data += 16;
3202
3203   highest_data = rsrc_parse_entries (abfd, & table->names, TRUE, data,
3204                                      datastart, data, dataend, rva_bias, table);
3205   data += table->names.num_entries * 8;
3206
3207   highest_data = rsrc_parse_entries (abfd, & table->ids, FALSE, highest_data,
3208                                      datastart, data, dataend, rva_bias, table);
3209   data += table->ids.num_entries * 8;
3210
3211   return max (highest_data, data);
3212 }
3213
3214 typedef struct rsrc_write_data
3215 {
3216   bfd *      abfd;
3217   bfd_byte * datastart;
3218   bfd_byte * next_table;
3219   bfd_byte * next_leaf;
3220   bfd_byte * next_string;
3221   bfd_byte * next_data;
3222   bfd_vma    rva_bias;
3223 } rsrc_write_data;
3224
3225 static void
3226 rsrc_write_string (rsrc_write_data * data,
3227                    rsrc_string *     string)
3228 {
3229   bfd_put_16 (data->abfd, string->len, data->next_string);
3230   memcpy (data->next_string + 2, string->string, string->len * 2);
3231   data->next_string += (string->len + 1) * 2;
3232 }
3233
3234 static inline unsigned int
3235 rsrc_compute_rva (rsrc_write_data * data,
3236                   bfd_byte *        addr)
3237 {
3238   return (addr - data->datastart) + data->rva_bias;
3239 }
3240
3241 static void
3242 rsrc_write_leaf (rsrc_write_data * data,
3243                  rsrc_leaf *       leaf)
3244 {
3245   bfd_put_32 (data->abfd, rsrc_compute_rva (data, data->next_data),
3246               data->next_leaf);
3247   bfd_put_32 (data->abfd, leaf->size,     data->next_leaf + 4);
3248   bfd_put_32 (data->abfd, leaf->codepage, data->next_leaf + 8);
3249   bfd_put_32 (data->abfd, 0 /*reserved*/, data->next_leaf + 12);
3250   data->next_leaf += 16;
3251
3252   memcpy (data->next_data, leaf->data, leaf->size);
3253   /* An undocumented feature of Windows resources is that each unit
3254      of raw data is 8-byte aligned...  */
3255   data->next_data += ((leaf->size + 7) & ~7);
3256 }
3257
3258 static void rsrc_write_directory (rsrc_write_data *, rsrc_directory *);
3259
3260 static void
3261 rsrc_write_entry (rsrc_write_data *  data,
3262                   bfd_byte *         where,
3263                   rsrc_entry *       entry)
3264 {
3265   if (entry->is_name)
3266     {
3267       bfd_put_32 (data->abfd,
3268                   SetHighBit (data->next_string - data->datastart),
3269                   where);
3270       rsrc_write_string (data, & entry->name_id.name);
3271     }
3272   else
3273     bfd_put_32 (data->abfd, entry->name_id.id, where);
3274
3275   if (entry->is_dir)
3276     {
3277       bfd_put_32 (data->abfd,
3278                   SetHighBit (data->next_table - data->datastart),
3279                   where + 4);
3280       rsrc_write_directory (data, entry->value.directory);
3281     }
3282   else
3283     {
3284       bfd_put_32 (data->abfd, data->next_leaf - data->datastart, where + 4);
3285       rsrc_write_leaf (data, entry->value.leaf);
3286     }
3287 }
3288
3289 static void
3290 rsrc_compute_region_sizes (rsrc_directory * dir)
3291 {
3292   struct rsrc_entry * entry;
3293
3294   if (dir == NULL)
3295     return;
3296
3297   sizeof_tables_and_entries += 16;
3298
3299   for (entry = dir->names.first_entry; entry != NULL; entry = entry->next_entry)
3300     {
3301       sizeof_tables_and_entries += 8;
3302
3303       sizeof_strings += (entry->name_id.name.len + 1) * 2;
3304           
3305       if (entry->is_dir)
3306         rsrc_compute_region_sizes (entry->value.directory);
3307       else
3308         sizeof_leaves += 16;
3309     }
3310
3311   for (entry = dir->ids.first_entry; entry != NULL; entry = entry->next_entry)
3312     {
3313       sizeof_tables_and_entries += 8;
3314
3315       if (entry->is_dir)
3316         rsrc_compute_region_sizes (entry->value.directory);
3317       else
3318         sizeof_leaves += 16;
3319     }
3320 }
3321
3322 static void
3323 rsrc_write_directory (rsrc_write_data * data,
3324                       rsrc_directory *  dir)
3325 {
3326   rsrc_entry * entry;
3327   unsigned int i;
3328   bfd_byte * next_entry;
3329   bfd_byte * nt;
3330
3331   bfd_put_32 (data->abfd, dir->characteristics, data->next_table);
3332   bfd_put_32 (data->abfd, 0 /*dir->time*/, data->next_table + 4);
3333   bfd_put_16 (data->abfd, dir->major, data->next_table + 8);
3334   bfd_put_16 (data->abfd, dir->minor, data->next_table + 10);
3335   bfd_put_16 (data->abfd, dir->names.num_entries, data->next_table + 12);
3336   bfd_put_16 (data->abfd, dir->ids.num_entries, data->next_table + 14);
3337
3338   /* Compute where the entries and the next table will be placed.  */
3339   next_entry = data->next_table + 16;
3340   data->next_table = next_entry + (dir->names.num_entries * 8)
3341     + (dir->ids.num_entries * 8);
3342   nt = data->next_table;
3343
3344   /* Write the entries.  */
3345   for (i = dir->names.num_entries, entry = dir->names.first_entry;
3346        i > 0 && entry != NULL;
3347        i--, entry = entry->next_entry)
3348     {
3349       BFD_ASSERT (entry->is_name);
3350       rsrc_write_entry (data, next_entry, entry);
3351       next_entry += 8;
3352     }
3353   BFD_ASSERT (i == 0);
3354   BFD_ASSERT (entry == NULL);
3355
3356   for (i = dir->ids.num_entries, entry = dir->ids.first_entry;
3357        i > 0 && entry != NULL;
3358        i--, entry = entry->next_entry)
3359     {
3360       BFD_ASSERT (! entry->is_name);
3361       rsrc_write_entry (data, next_entry, entry);
3362       next_entry += 8;
3363     }
3364   BFD_ASSERT (i == 0);
3365   BFD_ASSERT (entry == NULL);
3366   BFD_ASSERT (nt == next_entry);
3367 }
3368
3369 #if defined HAVE_WCHAR_H && ! defined __CYGWIN__ && ! defined __MINGW32__
3370 /* Return the length (number of units) of the first character in S,
3371    putting its 'ucs4_t' representation in *PUC.  */
3372
3373 static unsigned int
3374 u16_mbtouc (wchar_t * puc, const unsigned short * s, unsigned int n)
3375 {
3376   unsigned short c = * s;
3377
3378   if (c < 0xd800 || c >= 0xe000)
3379     {
3380       *puc = c;
3381       return 1;
3382     }
3383
3384   if (c < 0xdc00)
3385     {
3386       if (n >= 2)
3387         {
3388           if (s[1] >= 0xdc00 && s[1] < 0xe000)
3389             {
3390               *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
3391               return 2;
3392             }
3393         }
3394       else
3395         {
3396           /* Incomplete multibyte character.  */
3397           *puc = 0xfffd;
3398           return n;
3399         }
3400     }
3401
3402   /* Invalid multibyte character.  */
3403   *puc = 0xfffd;
3404   return 1;
3405 }
3406 #endif /* HAVE_WCHAR_H and not Cygwin/Mingw */
3407
3408 /* Perform a comparison of two entries.  */
3409 static signed int
3410 rsrc_cmp (bfd_boolean is_name, rsrc_entry * a, rsrc_entry * b)
3411 {
3412   signed int    res;
3413   bfd_byte *    astring;
3414   unsigned int  alen;
3415   bfd_byte *    bstring;
3416   unsigned int  blen;
3417
3418   if (! is_name)
3419     return a->name_id.id - b->name_id.id;
3420
3421   /* We have to perform a case insenstive, unicode string comparison...  */
3422   astring = a->name_id.name.string;
3423   alen    = a->name_id.name.len;
3424   bstring = b->name_id.name.string;
3425   blen    = b->name_id.name.len;
3426
3427 #if defined  __CYGWIN__ || defined __MINGW32__
3428   /* Under Windows hosts (both Cygwin and Mingw types),
3429      unicode == UTF-16 == wchar_t.  The case insensitive string comparison
3430      function however goes by different names in the two environments...  */
3431
3432 #undef rscpcmp
3433 #ifdef __CYGWIN__
3434 #define rscpcmp wcsncasecmp
3435 #endif
3436 #ifdef __MINGW32__
3437 #define rscpcmp wcsnicmp
3438 #endif
3439
3440   res = rscpcmp ((const wchar_t *) astring, (const wchar_t *) bstring,
3441                  min (alen, blen));
3442
3443 #elif defined HAVE_WCHAR_H
3444   {
3445     unsigned int  i;
3446     res = 0;
3447     for (i = min (alen, blen); i--; astring += 2, bstring += 2)
3448       {
3449         wchar_t awc;
3450         wchar_t bwc;
3451
3452         /* Convert UTF-16 unicode characters into wchar_t characters so
3453            that we can then perform a case insensitive comparison.  */
3454         int Alen = u16_mbtouc (& awc, (const unsigned short *) astring, 2);
3455         int Blen = u16_mbtouc (& bwc, (const unsigned short *) bstring, 2);
3456
3457         if (Alen != Blen)
3458           return Alen - Blen;
3459         res = wcsncasecmp (& awc, & bwc, 1);
3460         if (res)
3461           break;
3462       }
3463   }
3464 #else
3465   /* Do the best we can - a case sensitive, untranslated comparison.  */
3466   res = memcmp (astring, bstring, min (alen, blen) * 2);
3467 #endif
3468
3469   if (res == 0)
3470     res = alen - blen;
3471
3472   return res;
3473 }
3474
3475 static void
3476 rsrc_print_name (char * buffer, rsrc_string string)
3477 {
3478   unsigned int  i;
3479   bfd_byte *    name = string.string;
3480
3481   for (i = string.len; i--; name += 2)
3482     sprintf (buffer + strlen (buffer), "%.1s", name);
3483 }
3484
3485 static const char *
3486 rsrc_resource_name (rsrc_entry * entry, rsrc_directory * dir)
3487 {
3488   static char buffer [256];
3489   bfd_boolean is_string = FALSE;
3490
3491   buffer[0] = 0;
3492
3493   if (dir != NULL && dir->entry != NULL && dir->entry->parent != NULL
3494       && dir->entry->parent->entry != NULL)
3495     {
3496       strcpy (buffer, "type: ");
3497       if (dir->entry->parent->entry->is_name)
3498         rsrc_print_name (buffer + strlen (buffer),
3499                          dir->entry->parent->entry->name_id.name);
3500       else
3501         {
3502           unsigned int id = dir->entry->parent->entry->name_id.id;
3503
3504           sprintf (buffer + strlen (buffer), "%x", id);
3505           switch (id)
3506             {
3507             case 1: strcat (buffer, " (CURSOR)"); break;
3508             case 2: strcat (buffer, " (BITMAP)"); break;
3509             case 3: strcat (buffer, " (ICON)"); break;
3510             case 4: strcat (buffer, " (MENU)"); break;
3511             case 5: strcat (buffer, " (DIALOG)"); break;
3512             case 6: strcat (buffer, " (STRING)"); is_string = TRUE; break;
3513             case 7: strcat (buffer, " (FONTDIR)"); break;
3514             case 8: strcat (buffer, " (FONT)"); break;
3515             case 9: strcat (buffer, " (ACCELERATOR)"); break;
3516             case 10: strcat (buffer, " (RCDATA)"); break;
3517             case 11: strcat (buffer, " (MESSAGETABLE)"); break;
3518             case 12: strcat (buffer, " (GROUP_CURSOR)"); break;
3519             case 14: strcat (buffer, " (GROUP_ICON)"); break;
3520             case 16: strcat (buffer, " (VERSION)"); break;
3521             case 17: strcat (buffer, " (DLGINCLUDE)"); break;
3522             case 19: strcat (buffer, " (PLUGPLAY)"); break;
3523             case 20: strcat (buffer, " (VXD)"); break;
3524             case 21: strcat (buffer, " (ANICURSOR)"); break;
3525             case 22: strcat (buffer, " (ANIICON)"); break;
3526             case 23: strcat (buffer, " (HTML)"); break;
3527             case 24: strcat (buffer, " (MANIFEST)"); break;
3528             case 240: strcat (buffer, " (DLGINIT)"); break;
3529             case 241: strcat (buffer, " (TOOLBAR)"); break;
3530             }
3531         }
3532     }
3533
3534   if (dir != NULL && dir->entry != NULL)
3535     {
3536       strcat (buffer, " name: ");
3537       if (dir->entry->is_name)
3538         rsrc_print_name (buffer + strlen (buffer), dir->entry->name_id.name);
3539       else
3540         {
3541           unsigned int id = dir->entry->name_id.id;
3542
3543           sprintf (buffer + strlen (buffer), "%x", id);
3544
3545           if (is_string)
3546             sprintf (buffer + strlen (buffer), " (resource id range: %d - %d)",
3547                      (id - 1) << 4, (id << 4) - 1);
3548         }
3549     }
3550
3551   if (entry != NULL)
3552     {
3553       strcat (buffer, " lang: ");
3554
3555       if (entry->is_name)
3556         rsrc_print_name (buffer + strlen (buffer), entry->name_id.name);
3557       else
3558         sprintf (buffer + strlen (buffer), "%x", entry->name_id.id);
3559     }
3560
3561   return buffer;
3562 }
3563
3564 /* *sigh* Windows resource strings are special.  Only the top 28-bits of
3565    their ID is stored in the NAME entry.  The bottom four bits are used as
3566    an index into unicode string table that makes up the data of the leaf.
3567    So identical type-name-lang string resources may not actually be
3568    identical at all.
3569
3570    This function is called when we have detected two string resources with
3571    match top-28-bit IDs.  We have to scan the string tables inside the leaves
3572    and discover if there are any real collisions.  If there are then we report
3573    them and return FALSE.  Otherwise we copy any strings from B into A and
3574    then return TRUE.  */
3575
3576 static bfd_boolean
3577 rsrc_merge_string_entries (rsrc_entry * a ATTRIBUTE_UNUSED,
3578                            rsrc_entry * b ATTRIBUTE_UNUSED)
3579 {
3580   unsigned int copy_needed = 0;
3581   unsigned int i;
3582   bfd_byte * astring;
3583   bfd_byte * bstring;
3584   bfd_byte * new_data;
3585   bfd_byte * nstring;
3586
3587   /* Step one: Find out what we have to do.  */
3588   BFD_ASSERT (! a->is_dir);
3589   astring = a->value.leaf->data;
3590
3591   BFD_ASSERT (! b->is_dir);
3592   bstring = b->value.leaf->data;
3593
3594   for (i = 0; i < 16; i++)
3595     {
3596       unsigned int alen = astring[0] + (astring[1] << 8);
3597       unsigned int blen = bstring[0] + (bstring[1] << 8);
3598
3599       if (alen == 0)
3600         {
3601           copy_needed += blen * 2;
3602         }
3603       else if (blen == 0)
3604         ;
3605       else if (alen != blen)
3606         /* FIXME: Should we continue the loop in order to report other duplicates ?  */
3607         break;
3608       /* alen == blen != 0.  We might have two identical strings.  If so we
3609          can ignore the second one.  There is no need for wchar_t vs UTF-16
3610          theatrics here - we are only interested in (case sensitive) equality.  */
3611       else if (memcmp (astring + 2, bstring + 2, alen * 2) != 0)
3612         break;
3613
3614       astring += (alen + 1) * 2;
3615       bstring += (blen + 1) * 2;
3616     }
3617
3618   if (i != 16)
3619     {
3620       if (a->parent != NULL
3621           && a->parent->entry != NULL
3622           && a->parent->entry->is_name == FALSE)
3623         _bfd_error_handler (_(".rsrc merge failure: duplicate string resource: %d"),
3624                             ((a->parent->entry->name_id.id - 1) << 4) + i);
3625       return FALSE;
3626     }
3627
3628   if (copy_needed == 0)
3629     return TRUE;
3630
3631   /* If we reach here then A and B must both have non-colliding strings.
3632      (We never get string resources with fully empty string tables).
3633      We need to allocate an extra COPY_NEEDED bytes in A and then bring
3634      in B's strings.  */
3635   new_data = bfd_malloc (a->value.leaf->size + copy_needed);
3636   if (new_data == NULL)
3637     return FALSE;
3638
3639   nstring = new_data;
3640   astring = a->value.leaf->data;
3641   bstring = b->value.leaf->data;
3642
3643   for (i = 0; i < 16; i++)
3644     {
3645       unsigned int alen = astring[0] + (astring[1] << 8);
3646       unsigned int blen = bstring[0] + (bstring[1] << 8);
3647
3648       if (alen != 0)
3649         {
3650           memcpy (nstring, astring, (alen + 1) * 2);
3651           nstring += (alen + 1) * 2;
3652         }
3653       else if (blen != 0)
3654         {
3655           memcpy (nstring, bstring, (blen + 1) * 2);
3656           nstring += (blen + 1) * 2;
3657         }
3658       else
3659         {
3660           * nstring++ = 0;
3661           * nstring++ = 0;
3662         }
3663
3664       astring += (alen + 1) * 2;
3665       bstring += (blen + 1) * 2;
3666     }
3667
3668   BFD_ASSERT (nstring - new_data == (signed) (a->value.leaf->size + copy_needed));
3669
3670   free (a->value.leaf->data);
3671   a->value.leaf->data = new_data;
3672   a->value.leaf->size += copy_needed;
3673
3674   return TRUE;
3675 }
3676
3677 static void rsrc_merge (rsrc_entry *, rsrc_entry *);
3678
3679 /* Sort the entries in given part of the directory.
3680    We use an old fashioned bubble sort because we are dealing
3681    with lists and we want to handle matches specially.  */
3682
3683 static void
3684 rsrc_sort_entries (rsrc_dir_chain *  chain,
3685                    bfd_boolean       is_name,
3686                    rsrc_directory *  dir)
3687 {
3688   rsrc_entry * entry;
3689   rsrc_entry * next;
3690   rsrc_entry ** points_to_entry;
3691   bfd_boolean swapped;
3692
3693   if (chain->num_entries < 2)
3694     return;
3695
3696   do
3697     {
3698       swapped = FALSE;
3699       points_to_entry = & chain->first_entry;
3700       entry = * points_to_entry;
3701       next  = entry->next_entry;
3702
3703       do
3704         {
3705           signed int cmp = rsrc_cmp (is_name, entry, next);
3706
3707           if (cmp > 0)
3708             {
3709               entry->next_entry = next->next_entry;
3710               next->next_entry = entry;
3711               * points_to_entry = next;
3712               points_to_entry = & next->next_entry;
3713               next = entry->next_entry;
3714               swapped = TRUE;
3715             }
3716           else if (cmp == 0)
3717             {
3718               if (entry->is_dir && next->is_dir)
3719                 {
3720                   /* When we encounter identical directory entries we have to
3721                      merge them together.  The exception to this rule is for
3722                      resource manifests - there can only be one of these,
3723                      even if they differ in language.  Zero-language manifests
3724                      are assumed to be default manifests (provided by the
3725                      Cygwin/MinGW build system) and these can be silently dropped,
3726                      unless that would reduce the number of manifests to zero.
3727                      There should only ever be one non-zero lang manifest -
3728                      if there are more it is an error.  A non-zero lang
3729                      manifest takes precedence over a default manifest.  */
3730                   if (entry->is_name == FALSE
3731                       && entry->name_id.id == 1
3732                       && dir != NULL
3733                       && dir->entry != NULL
3734                       && dir->entry->is_name == FALSE
3735                       && dir->entry->name_id.id == 0x18)
3736                     {
3737                       if (next->value.directory->names.num_entries == 0
3738                           && next->value.directory->ids.num_entries == 1
3739                           && next->value.directory->ids.first_entry->is_name == FALSE
3740                           && next->value.directory->ids.first_entry->name_id.id == 0)
3741                         /* Fall through so that NEXT is dropped.  */
3742                         ;
3743                       else if (entry->value.directory->names.num_entries == 0
3744                                && entry->value.directory->ids.num_entries == 1
3745                                && entry->value.directory->ids.first_entry->is_name == FALSE
3746                                && entry->value.directory->ids.first_entry->name_id.id == 0)
3747                         {
3748                           /* Swap ENTRY and NEXT.  Then fall through so that the old ENTRY is dropped.  */
3749                           entry->next_entry = next->next_entry;
3750                           next->next_entry = entry;
3751                           * points_to_entry = next;
3752                           points_to_entry = & next->next_entry;
3753                           next = entry->next_entry;
3754                           swapped = TRUE;
3755                         }
3756                       else
3757                         {
3758                           _bfd_error_handler (_(".rsrc merge failure: multiple non-default manifests"));
3759                           bfd_set_error (bfd_error_file_truncated);
3760                           return;
3761                         }
3762
3763                       /* Unhook NEXT from the chain.  */
3764                       /* FIXME: memory loss here.  */
3765                       entry->next_entry = next->next_entry;
3766                       chain->num_entries --;
3767                       if (chain->num_entries < 2)
3768                         return;
3769                       next = next->next_entry;
3770                     }
3771                   else
3772                     rsrc_merge (entry, next);
3773                 }
3774               else if (entry->is_dir != next->is_dir)
3775                 {
3776                   _bfd_error_handler (_(".rsrc merge failure: a directory matches a leaf"));
3777                   bfd_set_error (bfd_error_file_truncated);
3778                   return;
3779                 }
3780               else
3781                 {
3782                   /* Otherwise with identical leaves we issue an error
3783                      message - because there should never be duplicates.
3784                      The exception is Type 18/Name 1/Lang 0 which is the
3785                      defaul manifest - this can just be dropped.  */
3786                   if (entry->is_name == FALSE
3787                       && entry->name_id.id == 0
3788                       && dir != NULL
3789                       && dir->entry != NULL
3790                       && dir->entry->is_name == FALSE
3791                       && dir->entry->name_id.id == 1
3792                       && dir->entry->parent != NULL
3793                       && dir->entry->parent->entry != NULL
3794                       && dir->entry->parent->entry->is_name == FALSE
3795                       && dir->entry->parent->entry->name_id.id == 0x18 /* RT_MANIFEST */)
3796                     ;
3797                   else if (dir != NULL
3798                            && dir->entry != NULL
3799                            && dir->entry->parent != NULL
3800                            && dir->entry->parent->entry != NULL
3801                            && dir->entry->parent->entry->is_name == FALSE
3802                            && dir->entry->parent->entry->name_id.id == 0x6 /* RT_STRING */)
3803                     {
3804                       /* Strings need special handling.  */
3805                       if (! rsrc_merge_string_entries (entry, next))
3806                         {
3807                           /* _bfd_error_handler should have been called inside merge_strings.  */
3808                           bfd_set_error (bfd_error_file_truncated);
3809                           return;
3810                         }
3811                     }
3812                   else
3813                     {
3814                       if (dir == NULL
3815                           || dir->entry == NULL
3816                           || dir->entry->parent == NULL
3817                           || dir->entry->parent->entry == NULL)
3818                         _bfd_error_handler (_(".rsrc merge failure: duplicate leaf"));
3819                       else
3820                         _bfd_error_handler (_(".rsrc merge failure: duplicate leaf: %s"),
3821                                             rsrc_resource_name (entry, dir));
3822                       bfd_set_error (bfd_error_file_truncated);
3823                       return;
3824                     }
3825                 }
3826
3827               /* Unhook NEXT from the chain.  */
3828               entry->next_entry = next->next_entry;
3829               chain->num_entries --;
3830               if (chain->num_entries < 2)
3831                 return;
3832               next = next->next_entry;
3833             }
3834           else
3835             {
3836               points_to_entry = & entry->next_entry;
3837               entry = next;
3838               next = next->next_entry;
3839             }
3840         }
3841       while (next);
3842
3843       chain->last_entry = entry;
3844     }
3845   while (swapped);
3846 }
3847
3848 /* Attach B's chain onto A.  */
3849 static void
3850 rsrc_attach_chain (rsrc_dir_chain * achain, rsrc_dir_chain * bchain)
3851 {
3852   if (bchain->num_entries == 0)
3853     return;
3854
3855   achain->num_entries += bchain->num_entries;
3856
3857   if (achain->first_entry == NULL)
3858     {
3859       achain->first_entry = bchain->first_entry;
3860       achain->last_entry  = bchain->last_entry;
3861     }
3862   else
3863     {
3864       achain->last_entry->next_entry = bchain->first_entry;
3865       achain->last_entry = bchain->last_entry;
3866     }
3867
3868   bchain->num_entries = 0;
3869   bchain->first_entry = bchain->last_entry = NULL;
3870 }
3871
3872 static void
3873 rsrc_merge (struct rsrc_entry * a, struct rsrc_entry * b)
3874 {
3875   rsrc_directory * adir;
3876   rsrc_directory * bdir;
3877
3878   BFD_ASSERT (a->is_dir);
3879   BFD_ASSERT (b->is_dir);
3880
3881   adir = a->value.directory;
3882   bdir = b->value.directory;
3883
3884   if (adir->characteristics != bdir->characteristics)
3885     {
3886       _bfd_error_handler (_(".rsrc merge failure: dirs with differing characteristics\n"));
3887       bfd_set_error (bfd_error_file_truncated);
3888       return;
3889     }
3890
3891   if (adir->major != bdir->major || adir->minor != bdir->minor)
3892     {
3893       _bfd_error_handler (_(".rsrc merge failure: differing directory versions\n"));
3894       bfd_set_error (bfd_error_file_truncated);
3895       return;
3896     }
3897
3898   /* Attach B's name chain to A.  */
3899   rsrc_attach_chain (& adir->names, & bdir->names);
3900
3901   /* Attach B's ID chain to A.  */
3902   rsrc_attach_chain (& adir->ids, & bdir->ids);
3903
3904   /* Now sort A's entries.  */
3905   rsrc_sort_entries (& adir->names, TRUE, adir);
3906   rsrc_sort_entries (& adir->ids, FALSE, adir);
3907 }
3908
3909 /* Check the .rsrc section.  If it contains multiple concatenated
3910    resources then we must merge them properly.  Otherwise Windows
3911    will ignore all but the first set.  */
3912
3913 static void
3914 rsrc_process_section (bfd * abfd,
3915                       struct coff_final_link_info * pfinfo)
3916 {
3917   rsrc_directory    new_table;
3918   bfd_size_type     size;
3919   asection *        sec;
3920   pe_data_type *    pe;
3921   bfd_vma           rva_bias;
3922   bfd_byte *        data;
3923   bfd_byte *        datastart;
3924   bfd_byte *        dataend;
3925   bfd_byte *        new_data;
3926   unsigned int      num_resource_sets;
3927   rsrc_directory *  type_tables;
3928   rsrc_write_data   write_data;
3929   unsigned int      indx;
3930   bfd *             input;
3931   unsigned int      num_input_rsrc = 0;
3932   unsigned int      max_num_input_rsrc = 4;
3933   ptrdiff_t *       rsrc_sizes = NULL;
3934
3935   new_table.names.num_entries = 0;
3936   new_table.ids.num_entries = 0;
3937
3938   sec = bfd_get_section_by_name (abfd, ".rsrc");
3939   if (sec == NULL || (size = sec->rawsize) == 0)
3940     return;
3941
3942   pe = pe_data (abfd);
3943   if (pe == NULL)
3944     return;
3945
3946   rva_bias = sec->vma - pe->pe_opthdr.ImageBase;
3947
3948   data = bfd_malloc (size);
3949   if (data == NULL)
3950     return;
3951
3952   datastart = data;
3953
3954   if (! bfd_get_section_contents (abfd, sec, data, 0, size))
3955     goto end;
3956
3957   /* Step zero: Scan the input bfds looking for .rsrc sections and record
3958      their lengths.  Note - we rely upon the fact that the linker script
3959      does *not* sort the input .rsrc sections, so that the order in the
3960      linkinfo list matches the order in the output .rsrc section.
3961
3962      We need to know the lengths because each input .rsrc section has padding
3963      at the end of a variable amount.  (It does not appear to be based upon
3964      the section alignment or the file alignment).  We need to skip any
3965      padding bytes when parsing the input .rsrc sections.  */
3966   rsrc_sizes = bfd_malloc (max_num_input_rsrc * sizeof * rsrc_sizes);
3967   if (rsrc_sizes == NULL)
3968     goto end;
3969
3970   for (input = pfinfo->info->input_bfds;
3971        input != NULL;
3972        input = input->link.next)
3973     {
3974       asection * rsrc_sec = bfd_get_section_by_name (input, ".rsrc");
3975
3976       if (rsrc_sec != NULL)
3977         {
3978           if (num_input_rsrc == max_num_input_rsrc)
3979             {
3980               max_num_input_rsrc += 10;
3981               rsrc_sizes = bfd_realloc (rsrc_sizes, max_num_input_rsrc
3982                                         * sizeof * rsrc_sizes);
3983               if (rsrc_sizes == NULL)
3984                 goto end;
3985             }
3986
3987           BFD_ASSERT (rsrc_sec->size > 0);
3988           rsrc_sizes [num_input_rsrc ++] = rsrc_sec->size;
3989         }
3990     }
3991
3992   if (num_input_rsrc < 2)
3993     goto end;
3994
3995   /* Step one: Walk the section, computing the size of the tables,
3996      leaves and data and decide if we need to do anything.  */
3997   dataend = data + size;
3998   num_resource_sets = 0;
3999
4000   while (data < dataend)
4001     {
4002       bfd_byte * p = data;
4003
4004       data = rsrc_count_directory (abfd, data, data, dataend, rva_bias);
4005
4006       if (data > dataend)
4007         {
4008           /* Corrupted .rsrc section - cannot merge.  */
4009           _bfd_error_handler (_("%s: .rsrc merge failure: corrupt .rsrc section"),
4010                               bfd_get_filename (abfd));
4011           bfd_set_error (bfd_error_file_truncated);
4012           goto end;
4013         }
4014
4015       if ((data - p) > rsrc_sizes [num_resource_sets])
4016         {
4017           _bfd_error_handler (_("%s: .rsrc merge failure: unexpected .rsrc size"),
4018                               bfd_get_filename (abfd));
4019           bfd_set_error (bfd_error_file_truncated);
4020           goto end;
4021         }
4022       /* FIXME: Should we add a check for "data - p" being much smaller
4023          than rsrc_sizes[num_resource_sets] ?  */
4024
4025       data = p + rsrc_sizes[num_resource_sets];
4026       rva_bias += data - p;
4027       ++ num_resource_sets;
4028     }
4029   BFD_ASSERT (num_resource_sets == num_input_rsrc);
4030
4031   /* Step two: Walk the data again, building trees of the resources.  */
4032   data = datastart;
4033   rva_bias = sec->vma - pe->pe_opthdr.ImageBase;
4034
4035   type_tables = bfd_malloc (num_resource_sets * sizeof * type_tables);
4036   if (type_tables == NULL)
4037     goto end;
4038
4039   indx = 0;
4040   while (data < dataend)
4041     {
4042       bfd_byte * p = data;
4043
4044       (void) rsrc_parse_directory (abfd, type_tables + indx, data, data,
4045                                    dataend, rva_bias, NULL);
4046       data = p + rsrc_sizes[indx];
4047       rva_bias += data - p;
4048       ++ indx;
4049     }
4050   BFD_ASSERT (indx == num_resource_sets);
4051
4052   /* Step three: Merge the top level tables (there can be only one).
4053
4054      We must ensure that the merged entries are in ascending order.
4055
4056      We also thread the top level table entries from the old tree onto
4057      the new table, so that they can be pulled off later.  */
4058
4059   /* FIXME: Should we verify that all type tables are the same ?  */
4060   new_table.characteristics = type_tables[0].characteristics;
4061   new_table.time            = type_tables[0].time;
4062   new_table.major           = type_tables[0].major;
4063   new_table.minor           = type_tables[0].minor;
4064
4065   /* Chain the NAME entries onto the table.  */
4066   new_table.names.first_entry = NULL;
4067   new_table.names.last_entry = NULL;
4068
4069   for (indx = 0; indx < num_resource_sets; indx++)
4070     rsrc_attach_chain (& new_table.names, & type_tables[indx].names);
4071
4072   rsrc_sort_entries (& new_table.names, TRUE, & new_table);
4073
4074   /* Chain the ID entries onto the table.  */
4075   new_table.ids.first_entry = NULL;
4076   new_table.ids.last_entry = NULL;
4077
4078   for (indx = 0; indx < num_resource_sets; indx++)
4079     rsrc_attach_chain (& new_table.ids, & type_tables[indx].ids);
4080
4081   rsrc_sort_entries (& new_table.ids, FALSE, & new_table);
4082
4083   /* Step four: Create new contents for the .rsrc section.  */
4084   /* Step four point one: Compute the size of each region of the .rsrc section.
4085      We do this now, rather than earlier, as the merging above may have dropped
4086      some entries.  */
4087   sizeof_leaves = sizeof_strings = sizeof_tables_and_entries = 0;
4088   rsrc_compute_region_sizes (& new_table);
4089   /* We increment sizeof_strings to make sure that resource data
4090      starts on an 8-byte boundary.  FIXME: Is this correct ?  */
4091   sizeof_strings = (sizeof_strings + 7) & ~ 7;
4092
4093   new_data = bfd_zalloc (abfd, size);
4094   if (new_data == NULL)
4095     goto end;
4096
4097   write_data.abfd        = abfd;
4098   write_data.datastart   = new_data;
4099   write_data.next_table  = new_data;
4100   write_data.next_leaf   = new_data + sizeof_tables_and_entries;
4101   write_data.next_string = write_data.next_leaf + sizeof_leaves;
4102   write_data.next_data   = write_data.next_string + sizeof_strings;
4103   write_data.rva_bias    = sec->vma - pe->pe_opthdr.ImageBase;
4104
4105   rsrc_write_directory (& write_data, & new_table);
4106
4107   /* Step five: Replace the old contents with the new.
4108      We recompute the size as we may have lost entries due to mergeing.  */
4109   size = ((write_data.next_data - new_data) + 3) & ~ 3;
4110
4111   {
4112     int page_size;
4113
4114     if (coff_data (abfd)->link_info)
4115       {
4116         page_size = pe_data (abfd)->pe_opthdr.FileAlignment;
4117
4118         /* If no file alignment has been set, default to one.
4119            This repairs 'ld -r' for arm-wince-pe target.  */
4120         if (page_size == 0)
4121           page_size = 1;
4122       }
4123     else
4124       page_size = PE_DEF_FILE_ALIGNMENT;
4125     size = (size + page_size - 1) & - page_size;
4126   }
4127
4128   bfd_set_section_contents (pfinfo->output_bfd, sec, new_data, 0, size);
4129   sec->size = sec->rawsize = size;
4130
4131  end:
4132   /* Step six: Free all the memory that we have used.  */
4133   /* FIXME: Free the resource tree, if we have one.  */
4134   free (datastart);
4135   free (rsrc_sizes);
4136 }
4137
4138 /* Handle the .idata section and other things that need symbol table
4139    access.  */
4140
4141 bfd_boolean
4142 _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
4143 {
4144   struct coff_link_hash_entry *h1;
4145   struct bfd_link_info *info = pfinfo->info;
4146   bfd_boolean result = TRUE;
4147
4148   /* There are a few fields that need to be filled in now while we
4149      have symbol table access.
4150
4151      The .idata subsections aren't directly available as sections, but
4152      they are in the symbol table, so get them from there.  */
4153
4154   /* The import directory.  This is the address of .idata$2, with size
4155      of .idata$2 + .idata$3.  */
4156   h1 = coff_link_hash_lookup (coff_hash_table (info),
4157                               ".idata$2", FALSE, FALSE, TRUE);
4158   if (h1 != NULL)
4159     {
4160       /* PR ld/2729: We cannot rely upon all the output sections having been
4161          created properly, so check before referencing them.  Issue a warning
4162          message for any sections tht could not be found.  */
4163       if ((h1->root.type == bfd_link_hash_defined
4164            || h1->root.type == bfd_link_hash_defweak)
4165           && h1->root.u.def.section != NULL
4166           && h1->root.u.def.section->output_section != NULL)
4167         pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].VirtualAddress =
4168           (h1->root.u.def.value
4169            + h1->root.u.def.section->output_section->vma
4170            + h1->root.u.def.section->output_offset);
4171       else
4172         {
4173           _bfd_error_handler
4174             (_("%B: unable to fill in DataDictionary[1] because .idata$2 is missing"),
4175              abfd);
4176           result = FALSE;
4177         }
4178
4179       h1 = coff_link_hash_lookup (coff_hash_table (info),
4180                                   ".idata$4", FALSE, FALSE, TRUE);
4181       if (h1 != NULL
4182           && (h1->root.type == bfd_link_hash_defined
4183            || h1->root.type == bfd_link_hash_defweak)
4184           && h1->root.u.def.section != NULL
4185           && h1->root.u.def.section->output_section != NULL)
4186         pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].Size =
4187           ((h1->root.u.def.value
4188             + h1->root.u.def.section->output_section->vma
4189             + h1->root.u.def.section->output_offset)
4190            - pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].VirtualAddress);
4191       else
4192         {
4193           _bfd_error_handler
4194             (_("%B: unable to fill in DataDictionary[1] because .idata$4 is missing"),
4195              abfd);
4196           result = FALSE;
4197         }
4198
4199       /* The import address table.  This is the size/address of
4200          .idata$5.  */
4201       h1 = coff_link_hash_lookup (coff_hash_table (info),
4202                                   ".idata$5", FALSE, FALSE, TRUE);
4203       if (h1 != NULL
4204           && (h1->root.type == bfd_link_hash_defined
4205            || h1->root.type == bfd_link_hash_defweak)
4206           && h1->root.u.def.section != NULL
4207           && h1->root.u.def.section->output_section != NULL)
4208         pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress =
4209           (h1->root.u.def.value
4210            + h1->root.u.def.section->output_section->vma
4211            + h1->root.u.def.section->output_offset);
4212       else
4213         {
4214           _bfd_error_handler
4215             (_("%B: unable to fill in DataDictionary[12] because .idata$5 is missing"),
4216              abfd);
4217           result = FALSE;
4218         }
4219
4220       h1 = coff_link_hash_lookup (coff_hash_table (info),
4221                                   ".idata$6", FALSE, FALSE, TRUE);
4222       if (h1 != NULL
4223           && (h1->root.type == bfd_link_hash_defined
4224            || h1->root.type == bfd_link_hash_defweak)
4225           && h1->root.u.def.section != NULL
4226           && h1->root.u.def.section->output_section != NULL)
4227         pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size =
4228           ((h1->root.u.def.value
4229             + h1->root.u.def.section->output_section->vma
4230             + h1->root.u.def.section->output_offset)
4231            - pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress);
4232       else
4233         {
4234           _bfd_error_handler
4235             (_("%B: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE (12)] because .idata$6 is missing"),
4236              abfd);
4237           result = FALSE;
4238         }
4239     }
4240   else
4241     {
4242       h1 = coff_link_hash_lookup (coff_hash_table (info),
4243                                   "__IAT_start__", FALSE, FALSE, TRUE);
4244       if (h1 != NULL
4245           && (h1->root.type == bfd_link_hash_defined
4246            || h1->root.type == bfd_link_hash_defweak)
4247           && h1->root.u.def.section != NULL
4248           && h1->root.u.def.section->output_section != NULL)
4249         {
4250           bfd_vma iat_va;
4251
4252           iat_va =
4253             (h1->root.u.def.value
4254              + h1->root.u.def.section->output_section->vma
4255              + h1->root.u.def.section->output_offset);
4256
4257           h1 = coff_link_hash_lookup (coff_hash_table (info),
4258                                       "__IAT_end__", FALSE, FALSE, TRUE);
4259           if (h1 != NULL
4260               && (h1->root.type == bfd_link_hash_defined
4261                || h1->root.type == bfd_link_hash_defweak)
4262               && h1->root.u.def.section != NULL
4263               && h1->root.u.def.section->output_section != NULL)
4264             {
4265               pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size =
4266                 ((h1->root.u.def.value
4267                   + h1->root.u.def.section->output_section->vma
4268                   + h1->root.u.def.section->output_offset)
4269                  - iat_va);
4270               if (pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size != 0)
4271                 pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress =
4272                   iat_va - pe_data (abfd)->pe_opthdr.ImageBase;
4273             }
4274           else
4275             {
4276               _bfd_error_handler
4277                 (_("%B: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE(12)]"
4278                    " because .idata$6 is missing"), abfd);
4279               result = FALSE;
4280             }
4281         }
4282     }
4283
4284   h1 = coff_link_hash_lookup (coff_hash_table (info),
4285                               (bfd_get_symbol_leading_char (abfd) != 0
4286                                ? "__tls_used" : "_tls_used"),
4287                               FALSE, FALSE, TRUE);
4288   if (h1 != NULL)
4289     {
4290       if ((h1->root.type == bfd_link_hash_defined
4291            || h1->root.type == bfd_link_hash_defweak)
4292           && h1->root.u.def.section != NULL
4293           && h1->root.u.def.section->output_section != NULL)
4294         pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].VirtualAddress =
4295           (h1->root.u.def.value
4296            + h1->root.u.def.section->output_section->vma
4297            + h1->root.u.def.section->output_offset
4298            - pe_data (abfd)->pe_opthdr.ImageBase);
4299       else
4300         {
4301           _bfd_error_handler
4302             (_("%B: unable to fill in DataDictionary[9] because __tls_used is missing"),
4303              abfd);
4304           result = FALSE;
4305         }
4306      /* According to PECOFF sepcifications by Microsoft version 8.2
4307         the TLS data directory consists of 4 pointers, followed
4308         by two 4-byte integer. This implies that the total size
4309         is different for 32-bit and 64-bit executables.  */
4310 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
4311       pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].Size = 0x18;
4312 #else
4313       pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].Size = 0x28;
4314 #endif
4315     }
4316
4317 /* If there is a .pdata section and we have linked pdata finally, we
4318      need to sort the entries ascending.  */
4319 #if !defined(COFF_WITH_pep) && defined(COFF_WITH_pex64)
4320   {
4321     asection *sec = bfd_get_section_by_name (abfd, ".pdata");
4322
4323     if (sec)
4324       {
4325         bfd_size_type x = sec->rawsize;
4326         bfd_byte *tmp_data = NULL;
4327
4328         if (x)
4329           tmp_data = bfd_malloc (x);
4330
4331         if (tmp_data != NULL)
4332           {
4333             if (bfd_get_section_contents (abfd, sec, tmp_data, 0, x))
4334               {
4335                 qsort (tmp_data,
4336                        (size_t) (x / 12),
4337                        12, sort_x64_pdata);
4338                 bfd_set_section_contents (pfinfo->output_bfd, sec,
4339                                           tmp_data, 0, x);
4340               }
4341             free (tmp_data);
4342           }
4343       }
4344   }
4345 #endif
4346
4347   rsrc_process_section (abfd, pfinfo);
4348
4349   /* If we couldn't find idata$2, we either have an excessively
4350      trivial program or are in DEEP trouble; we have to assume trivial
4351      program....  */
4352   return result;
4353 }