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