1 /* Support for the generic parts of PE/PEI; the common executable parts.
2    Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
3    2005, 2006, 2007, 2008  Free Software Foundation, Inc.
4    Written by Cygnus Solutions.
5 
6    This file is part of BFD, the Binary File Descriptor library.
7 
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12 
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17 
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
21    MA 02110-1301, USA.  */
22 
23 
24 /* Most of this hacked by Steve Chamberlain <sac@cygnus.com>.
25 
26    PE/PEI rearrangement (and code added): Donn Terry
27 					  Softway Systems, Inc.  */
28 
29 /* Hey look, some documentation [and in a place you expect to find it]!
30 
31    The main reference for the pei format is "Microsoft Portable Executable
32    and Common Object File Format Specification 4.1".  Get it if you need to
33    do some serious hacking on this code.
34 
35    Another reference:
36    "Peering Inside the PE: A Tour of the Win32 Portable Executable
37    File Format", MSJ 1994, Volume 9.
38 
39    The *sole* difference between the pe format and the pei format is that the
40    latter has an MSDOS 2.0 .exe header on the front that prints the message
41    "This app must be run under Windows." (or some such).
42    (FIXME: Whether that statement is *really* true or not is unknown.
43    Are there more subtle differences between pe and pei formats?
44    For now assume there aren't.  If you find one, then for God sakes
45    document it here!)
46 
47    The Microsoft docs use the word "image" instead of "executable" because
48    the former can also refer to a DLL (shared library).  Confusion can arise
49    because the `i' in `pei' also refers to "image".  The `pe' format can
50    also create images (i.e. executables), it's just that to run on a win32
51    system you need to use the pei format.
52 
53    FIXME: Please add more docs here so the next poor fool that has to hack
54    on this code has a chance of getting something accomplished without
55    wasting too much time.  */
56 
57 /* This expands into COFF_WITH_pe, COFF_WITH_pep, or COFF_WITH_pex64
58    depending on whether we're compiling for straight PE or PE+.  */
59 #define COFF_WITH_XX
60 
61 #include "sysdep.h"
62 #include "bfd.h"
63 #include "libbfd.h"
64 #include "coff/internal.h"
65 
66 /* NOTE: it's strange to be including an architecture specific header
67    in what's supposed to be general (to PE/PEI) code.  However, that's
68    where the definitions are, and they don't vary per architecture
69    within PE/PEI, so we get them from there.  FIXME: The lack of
70    variance is an assumption which may prove to be incorrect if new
71    PE/PEI targets are created.  */
72 #if defined COFF_WITH_pex64
73 # include "coff/x86_64.h"
74 #elif defined COFF_WITH_pep
75 # include "coff/ia64.h"
76 #else
77 # include "coff/i386.h"
78 #endif
79 
80 #include "coff/pe.h"
81 #include "libcoff.h"
82 #include "libpei.h"
83 
84 #if defined COFF_WITH_pep || defined COFF_WITH_pex64
85 # undef AOUTSZ
86 # define AOUTSZ		PEPAOUTSZ
87 # define PEAOUTHDR	PEPAOUTHDR
88 #endif
89 
90 /* FIXME: This file has various tests of POWERPC_LE_PE.  Those tests
91    worked when the code was in peicode.h, but no longer work now that
92    the code is in peigen.c.  PowerPC NT is said to be dead.  If
93    anybody wants to revive the code, you will have to figure out how
94    to handle those issues.  */
95 
96 void
97 _bfd_XXi_swap_sym_in (bfd * abfd, void * ext1, void * in1)
98 {
99   SYMENT *ext = (SYMENT *) ext1;
100   struct internal_syment *in = (struct internal_syment *) in1;
101 
102   if (ext->e.e_name[0] == 0)
103     {
104       in->_n._n_n._n_zeroes = 0;
105       in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e.e.e_offset);
106     }
107   else
108     memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN);
109 
110   in->n_value = H_GET_32 (abfd, ext->e_value);
111   in->n_scnum = H_GET_16 (abfd, ext->e_scnum);
112 
113   if (sizeof (ext->e_type) == 2)
114     in->n_type = H_GET_16 (abfd, ext->e_type);
115   else
116     in->n_type = H_GET_32 (abfd, ext->e_type);
117 
118   in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
119   in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
120 
121 #ifndef STRICT_PE_FORMAT
122   /* This is for Gnu-created DLLs.  */
123 
124   /* The section symbols for the .idata$ sections have class 0x68
125      (C_SECTION), which MS documentation indicates is a section
126      symbol.  Unfortunately, the value field in the symbol is simply a
127      copy of the .idata section's flags rather than something useful.
128      When these symbols are encountered, change the value to 0 so that
129      they will be handled somewhat correctly in the bfd code.  */
130   if (in->n_sclass == C_SECTION)
131     {
132       in->n_value = 0x0;
133 
134       /* Create synthetic empty sections as needed.  DJ */
135       if (in->n_scnum == 0)
136 	{
137 	  asection *sec;
138 
139 	  for (sec = abfd->sections; sec; sec = sec->next)
140 	    {
141 	      if (strcmp (sec->name, in->n_name) == 0)
142 		{
143 		  in->n_scnum = sec->target_index;
144 		  break;
145 		}
146 	    }
147 	}
148 
149       if (in->n_scnum == 0)
150 	{
151 	  int unused_section_number = 0;
152 	  asection *sec;
153 	  char *name;
154 	  flagword flags;
155 
156 	  for (sec = abfd->sections; sec; sec = sec->next)
157 	    if (unused_section_number <= sec->target_index)
158 	      unused_section_number = sec->target_index + 1;
159 
160 	  name = bfd_alloc (abfd, (bfd_size_type) strlen (in->n_name) + 10);
161 	  if (name == NULL)
162 	    return;
163 	  strcpy (name, in->n_name);
164 	  flags = SEC_HAS_CONTENTS | SEC_ALLOC | SEC_DATA | SEC_LOAD;
165 	  sec = bfd_make_section_anyway_with_flags (abfd, name, flags);
166 
167 	  sec->vma = 0;
168 	  sec->lma = 0;
169 	  sec->size = 0;
170 	  sec->filepos = 0;
171 	  sec->rel_filepos = 0;
172 	  sec->reloc_count = 0;
173 	  sec->line_filepos = 0;
174 	  sec->lineno_count = 0;
175 	  sec->userdata = NULL;
176 	  sec->next = NULL;
177 	  sec->alignment_power = 2;
178 
179 	  sec->target_index = unused_section_number;
180 
181 	  in->n_scnum = unused_section_number;
182 	}
183       in->n_sclass = C_STAT;
184     }
185 #endif
186 
187 #ifdef coff_swap_sym_in_hook
188   /* This won't work in peigen.c, but since it's for PPC PE, it's not
189      worth fixing.  */
190   coff_swap_sym_in_hook (abfd, ext1, in1);
191 #endif
192 }
193 
194 unsigned int
195 _bfd_XXi_swap_sym_out (bfd * abfd, void * inp, void * extp)
196 {
197   struct internal_syment *in = (struct internal_syment *) inp;
198   SYMENT *ext = (SYMENT *) extp;
199 
200   if (in->_n._n_name[0] == 0)
201     {
202       H_PUT_32 (abfd, 0, ext->e.e.e_zeroes);
203       H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e.e.e_offset);
204     }
205   else
206     memcpy (ext->e.e_name, in->_n._n_name, SYMNMLEN);
207 
208   H_PUT_32 (abfd, in->n_value, ext->e_value);
209   H_PUT_16 (abfd, in->n_scnum, ext->e_scnum);
210 
211   if (sizeof (ext->e_type) == 2)
212     H_PUT_16 (abfd, in->n_type, ext->e_type);
213   else
214     H_PUT_32 (abfd, in->n_type, ext->e_type);
215 
216   H_PUT_8 (abfd, in->n_sclass, ext->e_sclass);
217   H_PUT_8 (abfd, in->n_numaux, ext->e_numaux);
218 
219   return SYMESZ;
220 }
221 
222 void
223 _bfd_XXi_swap_aux_in (bfd *	abfd,
224 		      void *	ext1,
225 		      int       type,
226 		      int       class,
227 		      int	indx ATTRIBUTE_UNUSED,
228 		      int	numaux ATTRIBUTE_UNUSED,
229 		      void * 	in1)
230 {
231   AUXENT *ext = (AUXENT *) ext1;
232   union internal_auxent *in = (union internal_auxent *) in1;
233 
234   switch (class)
235     {
236     case C_FILE:
237       if (ext->x_file.x_fname[0] == 0)
238 	{
239 	  in->x_file.x_n.x_zeroes = 0;
240 	  in->x_file.x_n.x_offset = H_GET_32 (abfd, ext->x_file.x_n.x_offset);
241 	}
242       else
243 	memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
244       return;
245 
246     case C_STAT:
247     case C_LEAFSTAT:
248     case C_HIDDEN:
249       if (type == T_NULL)
250 	{
251 	  in->x_scn.x_scnlen = GET_SCN_SCNLEN (abfd, ext);
252 	  in->x_scn.x_nreloc = GET_SCN_NRELOC (abfd, ext);
253 	  in->x_scn.x_nlinno = GET_SCN_NLINNO (abfd, ext);
254 	  in->x_scn.x_checksum = H_GET_32 (abfd, ext->x_scn.x_checksum);
255 	  in->x_scn.x_associated = H_GET_16 (abfd, ext->x_scn.x_associated);
256 	  in->x_scn.x_comdat = H_GET_8 (abfd, ext->x_scn.x_comdat);
257 	  return;
258 	}
259       break;
260     }
261 
262   in->x_sym.x_tagndx.l = H_GET_32 (abfd, ext->x_sym.x_tagndx);
263   in->x_sym.x_tvndx = H_GET_16 (abfd, ext->x_sym.x_tvndx);
264 
265   if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
266     {
267       in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR (abfd, ext);
268       in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX (abfd, ext);
269     }
270   else
271     {
272       in->x_sym.x_fcnary.x_ary.x_dimen[0] =
273 	H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
274       in->x_sym.x_fcnary.x_ary.x_dimen[1] =
275 	H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
276       in->x_sym.x_fcnary.x_ary.x_dimen[2] =
277 	H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
278       in->x_sym.x_fcnary.x_ary.x_dimen[3] =
279 	H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
280     }
281 
282   if (ISFCN (type))
283     {
284       in->x_sym.x_misc.x_fsize = H_GET_32 (abfd, ext->x_sym.x_misc.x_fsize);
285     }
286   else
287     {
288       in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO (abfd, ext);
289       in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE (abfd, ext);
290     }
291 }
292 
293 unsigned int
294 _bfd_XXi_swap_aux_out (bfd *  abfd,
295 		       void * inp,
296 		       int    type,
297 		       int    class,
298 		       int    indx ATTRIBUTE_UNUSED,
299 		       int    numaux ATTRIBUTE_UNUSED,
300 		       void * extp)
301 {
302   union internal_auxent *in = (union internal_auxent *) inp;
303   AUXENT *ext = (AUXENT *) extp;
304 
305   memset (ext, 0, AUXESZ);
306 
307   switch (class)
308     {
309     case C_FILE:
310       if (in->x_file.x_fname[0] == 0)
311 	{
312 	  H_PUT_32 (abfd, 0, ext->x_file.x_n.x_zeroes);
313 	  H_PUT_32 (abfd, in->x_file.x_n.x_offset, ext->x_file.x_n.x_offset);
314 	}
315       else
316 	memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
317 
318       return AUXESZ;
319 
320     case C_STAT:
321     case C_LEAFSTAT:
322     case C_HIDDEN:
323       if (type == T_NULL)
324 	{
325 	  PUT_SCN_SCNLEN (abfd, in->x_scn.x_scnlen, ext);
326 	  PUT_SCN_NRELOC (abfd, in->x_scn.x_nreloc, ext);
327 	  PUT_SCN_NLINNO (abfd, in->x_scn.x_nlinno, ext);
328 	  H_PUT_32 (abfd, in->x_scn.x_checksum, ext->x_scn.x_checksum);
329 	  H_PUT_16 (abfd, in->x_scn.x_associated, ext->x_scn.x_associated);
330 	  H_PUT_8 (abfd, in->x_scn.x_comdat, ext->x_scn.x_comdat);
331 	  return AUXESZ;
332 	}
333       break;
334     }
335 
336   H_PUT_32 (abfd, in->x_sym.x_tagndx.l, ext->x_sym.x_tagndx);
337   H_PUT_16 (abfd, in->x_sym.x_tvndx, ext->x_sym.x_tvndx);
338 
339   if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
340     {
341       PUT_FCN_LNNOPTR (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr,  ext);
342       PUT_FCN_ENDNDX  (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
343     }
344   else
345     {
346       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
347 		ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
348       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
349 		ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
350       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
351 		ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
352       H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
353 		ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
354     }
355 
356   if (ISFCN (type))
357     H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_sym.x_misc.x_fsize);
358   else
359     {
360       PUT_LNSZ_LNNO (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext);
361       PUT_LNSZ_SIZE (abfd, in->x_sym.x_misc.x_lnsz.x_size, ext);
362     }
363 
364   return AUXESZ;
365 }
366 
367 void
368 _bfd_XXi_swap_lineno_in (bfd * abfd, void * ext1, void * in1)
369 {
370   LINENO *ext = (LINENO *) ext1;
371   struct internal_lineno *in = (struct internal_lineno *) in1;
372 
373   in->l_addr.l_symndx = H_GET_32 (abfd, ext->l_addr.l_symndx);
374   in->l_lnno = GET_LINENO_LNNO (abfd, ext);
375 }
376 
377 unsigned int
378 _bfd_XXi_swap_lineno_out (bfd * abfd, void * inp, void * outp)
379 {
380   struct internal_lineno *in = (struct internal_lineno *) inp;
381   struct external_lineno *ext = (struct external_lineno *) outp;
382   H_PUT_32 (abfd, in->l_addr.l_symndx, ext->l_addr.l_symndx);
383 
384   PUT_LINENO_LNNO (abfd, in->l_lnno, ext);
385   return LINESZ;
386 }
387 
388 void
389 _bfd_XXi_swap_aouthdr_in (bfd * abfd,
390 			  void * aouthdr_ext1,
391 			  void * aouthdr_int1)
392 {
393   PEAOUTHDR * src = (PEAOUTHDR *) aouthdr_ext1;
394   AOUTHDR * aouthdr_ext = (AOUTHDR *) aouthdr_ext1;
395   struct internal_aouthdr *aouthdr_int
396     = (struct internal_aouthdr *) aouthdr_int1;
397   struct internal_extra_pe_aouthdr *a = &aouthdr_int->pe;
398 
399   aouthdr_int->magic = H_GET_16 (abfd, aouthdr_ext->magic);
400   aouthdr_int->vstamp = H_GET_16 (abfd, aouthdr_ext->vstamp);
401   aouthdr_int->tsize = GET_AOUTHDR_TSIZE (abfd, aouthdr_ext->tsize);
402   aouthdr_int->dsize = GET_AOUTHDR_DSIZE (abfd, aouthdr_ext->dsize);
403   aouthdr_int->bsize = GET_AOUTHDR_BSIZE (abfd, aouthdr_ext->bsize);
404   aouthdr_int->entry = GET_AOUTHDR_ENTRY (abfd, aouthdr_ext->entry);
405   aouthdr_int->text_start =
406     GET_AOUTHDR_TEXT_START (abfd, aouthdr_ext->text_start);
407 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
408   /* PE32+ does not have data_start member!  */
409   aouthdr_int->data_start =
410     GET_AOUTHDR_DATA_START (abfd, aouthdr_ext->data_start);
411   a->BaseOfData = aouthdr_int->data_start;
412 #endif
413 
414   a->Magic = aouthdr_int->magic;
415   a->MajorLinkerVersion = H_GET_8 (abfd, aouthdr_ext->vstamp);
416   a->MinorLinkerVersion = H_GET_8 (abfd, aouthdr_ext->vstamp + 1);
417   a->SizeOfCode = aouthdr_int->tsize ;
418   a->SizeOfInitializedData = aouthdr_int->dsize ;
419   a->SizeOfUninitializedData = aouthdr_int->bsize ;
420   a->AddressOfEntryPoint = aouthdr_int->entry;
421   a->BaseOfCode = aouthdr_int->text_start;
422   a->ImageBase = GET_OPTHDR_IMAGE_BASE (abfd, src->ImageBase);
423   a->SectionAlignment = H_GET_32 (abfd, src->SectionAlignment);
424   a->FileAlignment = H_GET_32 (abfd, src->FileAlignment);
425   a->MajorOperatingSystemVersion =
426     H_GET_16 (abfd, src->MajorOperatingSystemVersion);
427   a->MinorOperatingSystemVersion =
428     H_GET_16 (abfd, src->MinorOperatingSystemVersion);
429   a->MajorImageVersion = H_GET_16 (abfd, src->MajorImageVersion);
430   a->MinorImageVersion = H_GET_16 (abfd, src->MinorImageVersion);
431   a->MajorSubsystemVersion = H_GET_16 (abfd, src->MajorSubsystemVersion);
432   a->MinorSubsystemVersion = H_GET_16 (abfd, src->MinorSubsystemVersion);
433   a->Reserved1 = H_GET_32 (abfd, src->Reserved1);
434   a->SizeOfImage = H_GET_32 (abfd, src->SizeOfImage);
435   a->SizeOfHeaders = H_GET_32 (abfd, src->SizeOfHeaders);
436   a->CheckSum = H_GET_32 (abfd, src->CheckSum);
437   a->Subsystem = H_GET_16 (abfd, src->Subsystem);
438   a->DllCharacteristics = H_GET_16 (abfd, src->DllCharacteristics);
439   a->SizeOfStackReserve =
440     GET_OPTHDR_SIZE_OF_STACK_RESERVE (abfd, src->SizeOfStackReserve);
441   a->SizeOfStackCommit =
442     GET_OPTHDR_SIZE_OF_STACK_COMMIT (abfd, src->SizeOfStackCommit);
443   a->SizeOfHeapReserve =
444     GET_OPTHDR_SIZE_OF_HEAP_RESERVE (abfd, src->SizeOfHeapReserve);
445   a->SizeOfHeapCommit =
446     GET_OPTHDR_SIZE_OF_HEAP_COMMIT (abfd, src->SizeOfHeapCommit);
447   a->LoaderFlags = H_GET_32 (abfd, src->LoaderFlags);
448   a->NumberOfRvaAndSizes = H_GET_32 (abfd, src->NumberOfRvaAndSizes);
449 
450   {
451     int idx;
452 
453     for (idx = 0; idx < 16; idx++)
454       {
455         /* If data directory is empty, rva also should be 0.  */
456 	int size =
457 	  H_GET_32 (abfd, src->DataDirectory[idx][1]);
458 
459 	a->DataDirectory[idx].Size = size;
460 
461 	if (size)
462 	  a->DataDirectory[idx].VirtualAddress =
463 	    H_GET_32 (abfd, src->DataDirectory[idx][0]);
464 	else
465 	  a->DataDirectory[idx].VirtualAddress = 0;
466       }
467   }
468 
469   if (aouthdr_int->entry)
470     {
471       aouthdr_int->entry += a->ImageBase;
472 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
473       aouthdr_int->entry &= 0xffffffff;
474 #endif
475     }
476 
477   if (aouthdr_int->tsize)
478     {
479       aouthdr_int->text_start += a->ImageBase;
480 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
481       aouthdr_int->text_start &= 0xffffffff;
482 #endif
483     }
484 
485 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
486   /* PE32+ does not have data_start member!  */
487   if (aouthdr_int->dsize)
488     {
489       aouthdr_int->data_start += a->ImageBase;
490       aouthdr_int->data_start &= 0xffffffff;
491     }
492 #endif
493 
494 #ifdef POWERPC_LE_PE
495   /* These three fields are normally set up by ppc_relocate_section.
496      In the case of reading a file in, we can pick them up from the
497      DataDirectory.  */
498   first_thunk_address = a->DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress;
499   thunk_size = a->DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size;
500   import_table_size = a->DataDirectory[PE_IMPORT_TABLE].Size;
501 #endif
502 }
503 
504 /* A support function for below.  */
505 
506 static void
507 add_data_entry (bfd * abfd,
508 		struct internal_extra_pe_aouthdr *aout,
509 		int idx,
510 		char *name,
511 		bfd_vma base)
512 {
513   asection *sec = bfd_get_section_by_name (abfd, name);
514 
515   /* Add import directory information if it exists.  */
516   if ((sec != NULL)
517       && (coff_section_data (abfd, sec) != NULL)
518       && (pei_section_data (abfd, sec) != NULL))
519     {
520       /* If data directory is empty, rva also should be 0.  */
521       int size = pei_section_data (abfd, sec)->virt_size;
522       aout->DataDirectory[idx].Size = size;
523 
524       if (size)
525 	{
526 	  aout->DataDirectory[idx].VirtualAddress =
527 	    (sec->vma - base) & 0xffffffff;
528 	  sec->flags |= SEC_DATA;
529 	}
530     }
531 }
532 
533 unsigned int
534 _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out)
535 {
536   struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *) in;
537   pe_data_type *pe = pe_data (abfd);
538   struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
539   PEAOUTHDR *aouthdr_out = (PEAOUTHDR *) out;
540   bfd_vma sa, fa, ib;
541   IMAGE_DATA_DIRECTORY idata2, idata5, tls;
542 
543   if (pe->force_minimum_alignment)
544     {
545       if (!extra->FileAlignment)
546 	extra->FileAlignment = PE_DEF_FILE_ALIGNMENT;
547       if (!extra->SectionAlignment)
548 	extra->SectionAlignment = PE_DEF_SECTION_ALIGNMENT;
549     }
550 
551   if (extra->Subsystem == IMAGE_SUBSYSTEM_UNKNOWN)
552     extra->Subsystem = pe->target_subsystem;
553 
554   sa = extra->SectionAlignment;
555   fa = extra->FileAlignment;
556   ib = extra->ImageBase;
557 
558   idata2 = pe->pe_opthdr.DataDirectory[PE_IMPORT_TABLE];
559   idata5 = pe->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE];
560   tls = pe->pe_opthdr.DataDirectory[PE_TLS_TABLE];
561 
562   if (aouthdr_in->tsize)
563     {
564       aouthdr_in->text_start -= ib;
565 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
566       aouthdr_in->text_start &= 0xffffffff;
567 #endif
568     }
569 
570   if (aouthdr_in->dsize)
571     {
572       aouthdr_in->data_start -= ib;
573 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
574       aouthdr_in->data_start &= 0xffffffff;
575 #endif
576     }
577 
578   if (aouthdr_in->entry)
579     {
580       aouthdr_in->entry -= ib;
581 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
582       aouthdr_in->entry &= 0xffffffff;
583 #endif
584     }
585 
586 #define FA(x) (((x) + fa -1 ) & (- fa))
587 #define SA(x) (((x) + sa -1 ) & (- sa))
588 
589   /* We like to have the sizes aligned.  */
590   aouthdr_in->bsize = FA (aouthdr_in->bsize);
591 
592   extra->NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
593 
594   /* First null out all data directory entries.  */
595   memset (extra->DataDirectory, 0, sizeof (extra->DataDirectory));
596 
597   add_data_entry (abfd, extra, 0, ".edata", ib);
598   add_data_entry (abfd, extra, 2, ".rsrc", ib);
599   add_data_entry (abfd, extra, 3, ".pdata", ib);
600 
601   /* In theory we do not need to call add_data_entry for .idata$2 or
602      .idata$5.  It will be done in bfd_coff_final_link where all the
603      required information is available.  If however, we are not going
604      to perform a final link, eg because we have been invoked by objcopy
605      or strip, then we need to make sure that these Data Directory
606      entries are initialised properly.
607 
608      So - we copy the input values into the output values, and then, if
609      a final link is going to be performed, it can overwrite them.  */
610   extra->DataDirectory[PE_IMPORT_TABLE]  = idata2;
611   extra->DataDirectory[PE_IMPORT_ADDRESS_TABLE] = idata5;
612   extra->DataDirectory[PE_TLS_TABLE] = tls;
613 
614   if (extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress == 0)
615     /* Until other .idata fixes are made (pending patch), the entry for
616        .idata is needed for backwards compatibility.  FIXME.  */
617     add_data_entry (abfd, extra, 1, ".idata", ib);
618 
619   /* For some reason, the virtual size (which is what's set by
620      add_data_entry) for .reloc is not the same as the size recorded
621      in this slot by MSVC; it doesn't seem to cause problems (so far),
622      but since it's the best we've got, use it.  It does do the right
623      thing for .pdata.  */
624   if (pe->has_reloc_section)
625     add_data_entry (abfd, extra, 5, ".reloc", ib);
626 
627   {
628     asection *sec;
629     bfd_vma hsize = 0;
630     bfd_vma dsize = 0;
631     bfd_vma isize = 0;
632     bfd_vma tsize = 0;
633 
634     for (sec = abfd->sections; sec; sec = sec->next)
635       {
636 	int rounded = FA (sec->size);
637 
638 	/* The first non-zero section filepos is the header size.
639 	   Sections without contents will have a filepos of 0.  */
640 	if (hsize == 0)
641 	  hsize = sec->filepos;
642 	if (sec->flags & SEC_DATA)
643 	  dsize += rounded;
644 	if (sec->flags & SEC_CODE)
645 	  tsize += rounded;
646 	/* The image size is the total VIRTUAL size (which is what is
647 	   in the virt_size field).  Files have been seen (from MSVC
648 	   5.0 link.exe) where the file size of the .data segment is
649 	   quite small compared to the virtual size.  Without this
650 	   fix, strip munges the file.
651 
652 	   FIXME: We need to handle holes between sections, which may
653 	   happpen when we covert from another format.  We just use
654 	   the virtual address and virtual size of the last section
655 	   for the image size.  */
656 	if (coff_section_data (abfd, sec) != NULL
657 	    && pei_section_data (abfd, sec) != NULL)
658 	  isize = (sec->vma - extra->ImageBase
659 		   + SA (FA (pei_section_data (abfd, sec)->virt_size)));
660       }
661 
662     aouthdr_in->dsize = dsize;
663     aouthdr_in->tsize = tsize;
664     extra->SizeOfHeaders = hsize;
665     extra->SizeOfImage = isize;
666   }
667 
668   H_PUT_16 (abfd, aouthdr_in->magic, aouthdr_out->standard.magic);
669 
670 #define LINKER_VERSION 256 /* That is, 2.56 */
671 
672   /* This piece of magic sets the "linker version" field to
673      LINKER_VERSION.  */
674   H_PUT_16 (abfd, (LINKER_VERSION / 100 + (LINKER_VERSION % 100) * 256),
675 	    aouthdr_out->standard.vstamp);
676 
677   PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, aouthdr_out->standard.tsize);
678   PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, aouthdr_out->standard.dsize);
679   PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, aouthdr_out->standard.bsize);
680   PUT_AOUTHDR_ENTRY (abfd, aouthdr_in->entry, aouthdr_out->standard.entry);
681   PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start,
682 			  aouthdr_out->standard.text_start);
683 
684 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
685   /* PE32+ does not have data_start member!  */
686   PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
687 			  aouthdr_out->standard.data_start);
688 #endif
689 
690   PUT_OPTHDR_IMAGE_BASE (abfd, extra->ImageBase, aouthdr_out->ImageBase);
691   H_PUT_32 (abfd, extra->SectionAlignment, aouthdr_out->SectionAlignment);
692   H_PUT_32 (abfd, extra->FileAlignment, aouthdr_out->FileAlignment);
693   H_PUT_16 (abfd, extra->MajorOperatingSystemVersion,
694 	    aouthdr_out->MajorOperatingSystemVersion);
695   H_PUT_16 (abfd, extra->MinorOperatingSystemVersion,
696 	    aouthdr_out->MinorOperatingSystemVersion);
697   H_PUT_16 (abfd, extra->MajorImageVersion, aouthdr_out->MajorImageVersion);
698   H_PUT_16 (abfd, extra->MinorImageVersion, aouthdr_out->MinorImageVersion);
699   H_PUT_16 (abfd, extra->MajorSubsystemVersion,
700 	    aouthdr_out->MajorSubsystemVersion);
701   H_PUT_16 (abfd, extra->MinorSubsystemVersion,
702 	    aouthdr_out->MinorSubsystemVersion);
703   H_PUT_32 (abfd, extra->Reserved1, aouthdr_out->Reserved1);
704   H_PUT_32 (abfd, extra->SizeOfImage, aouthdr_out->SizeOfImage);
705   H_PUT_32 (abfd, extra->SizeOfHeaders, aouthdr_out->SizeOfHeaders);
706   H_PUT_32 (abfd, extra->CheckSum, aouthdr_out->CheckSum);
707   H_PUT_16 (abfd, extra->Subsystem, aouthdr_out->Subsystem);
708   H_PUT_16 (abfd, extra->DllCharacteristics, aouthdr_out->DllCharacteristics);
709   PUT_OPTHDR_SIZE_OF_STACK_RESERVE (abfd, extra->SizeOfStackReserve,
710 				    aouthdr_out->SizeOfStackReserve);
711   PUT_OPTHDR_SIZE_OF_STACK_COMMIT (abfd, extra->SizeOfStackCommit,
712 				   aouthdr_out->SizeOfStackCommit);
713   PUT_OPTHDR_SIZE_OF_HEAP_RESERVE (abfd, extra->SizeOfHeapReserve,
714 				   aouthdr_out->SizeOfHeapReserve);
715   PUT_OPTHDR_SIZE_OF_HEAP_COMMIT (abfd, extra->SizeOfHeapCommit,
716 				  aouthdr_out->SizeOfHeapCommit);
717   H_PUT_32 (abfd, extra->LoaderFlags, aouthdr_out->LoaderFlags);
718   H_PUT_32 (abfd, extra->NumberOfRvaAndSizes,
719 	    aouthdr_out->NumberOfRvaAndSizes);
720   {
721     int idx;
722 
723     for (idx = 0; idx < 16; idx++)
724       {
725 	H_PUT_32 (abfd, extra->DataDirectory[idx].VirtualAddress,
726 		  aouthdr_out->DataDirectory[idx][0]);
727 	H_PUT_32 (abfd, extra->DataDirectory[idx].Size,
728 		  aouthdr_out->DataDirectory[idx][1]);
729       }
730   }
731 
732   return AOUTSZ;
733 }
734 
735 unsigned int
736 _bfd_XXi_only_swap_filehdr_out (bfd * abfd, void * in, void * out)
737 {
738   int idx;
739   struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
740   struct external_PEI_filehdr *filehdr_out = (struct external_PEI_filehdr *) out;
741 
742   if (pe_data (abfd)->has_reloc_section)
743     filehdr_in->f_flags &= ~F_RELFLG;
744 
745   if (pe_data (abfd)->dll)
746     filehdr_in->f_flags |= F_DLL;
747 
748   filehdr_in->pe.e_magic    = DOSMAGIC;
749   filehdr_in->pe.e_cblp     = 0x90;
750   filehdr_in->pe.e_cp       = 0x3;
751   filehdr_in->pe.e_crlc     = 0x0;
752   filehdr_in->pe.e_cparhdr  = 0x4;
753   filehdr_in->pe.e_minalloc = 0x0;
754   filehdr_in->pe.e_maxalloc = 0xffff;
755   filehdr_in->pe.e_ss       = 0x0;
756   filehdr_in->pe.e_sp       = 0xb8;
757   filehdr_in->pe.e_csum     = 0x0;
758   filehdr_in->pe.e_ip       = 0x0;
759   filehdr_in->pe.e_cs       = 0x0;
760   filehdr_in->pe.e_lfarlc   = 0x40;
761   filehdr_in->pe.e_ovno     = 0x0;
762 
763   for (idx = 0; idx < 4; idx++)
764     filehdr_in->pe.e_res[idx] = 0x0;
765 
766   filehdr_in->pe.e_oemid   = 0x0;
767   filehdr_in->pe.e_oeminfo = 0x0;
768 
769   for (idx = 0; idx < 10; idx++)
770     filehdr_in->pe.e_res2[idx] = 0x0;
771 
772   filehdr_in->pe.e_lfanew = 0x80;
773 
774   /* This next collection of data are mostly just characters.  It
775      appears to be constant within the headers put on NT exes.  */
776   filehdr_in->pe.dos_message[0]  = 0x0eba1f0e;
777   filehdr_in->pe.dos_message[1]  = 0xcd09b400;
778   filehdr_in->pe.dos_message[2]  = 0x4c01b821;
779   filehdr_in->pe.dos_message[3]  = 0x685421cd;
780   filehdr_in->pe.dos_message[4]  = 0x70207369;
781   filehdr_in->pe.dos_message[5]  = 0x72676f72;
782   filehdr_in->pe.dos_message[6]  = 0x63206d61;
783   filehdr_in->pe.dos_message[7]  = 0x6f6e6e61;
784   filehdr_in->pe.dos_message[8]  = 0x65622074;
785   filehdr_in->pe.dos_message[9]  = 0x6e757220;
786   filehdr_in->pe.dos_message[10] = 0x206e6920;
787   filehdr_in->pe.dos_message[11] = 0x20534f44;
788   filehdr_in->pe.dos_message[12] = 0x65646f6d;
789   filehdr_in->pe.dos_message[13] = 0x0a0d0d2e;
790   filehdr_in->pe.dos_message[14] = 0x24;
791   filehdr_in->pe.dos_message[15] = 0x0;
792   filehdr_in->pe.nt_signature = NT_SIGNATURE;
793 
794   H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->f_magic);
795   H_PUT_16 (abfd, filehdr_in->f_nscns, filehdr_out->f_nscns);
796 
797   H_PUT_32 (abfd, time (0), filehdr_out->f_timdat);
798   PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr,
799 		      filehdr_out->f_symptr);
800   H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->f_nsyms);
801   H_PUT_16 (abfd, filehdr_in->f_opthdr, filehdr_out->f_opthdr);
802   H_PUT_16 (abfd, filehdr_in->f_flags, filehdr_out->f_flags);
803 
804   /* Put in extra dos header stuff.  This data remains essentially
805      constant, it just has to be tacked on to the beginning of all exes
806      for NT.  */
807   H_PUT_16 (abfd, filehdr_in->pe.e_magic, filehdr_out->e_magic);
808   H_PUT_16 (abfd, filehdr_in->pe.e_cblp, filehdr_out->e_cblp);
809   H_PUT_16 (abfd, filehdr_in->pe.e_cp, filehdr_out->e_cp);
810   H_PUT_16 (abfd, filehdr_in->pe.e_crlc, filehdr_out->e_crlc);
811   H_PUT_16 (abfd, filehdr_in->pe.e_cparhdr, filehdr_out->e_cparhdr);
812   H_PUT_16 (abfd, filehdr_in->pe.e_minalloc, filehdr_out->e_minalloc);
813   H_PUT_16 (abfd, filehdr_in->pe.e_maxalloc, filehdr_out->e_maxalloc);
814   H_PUT_16 (abfd, filehdr_in->pe.e_ss, filehdr_out->e_ss);
815   H_PUT_16 (abfd, filehdr_in->pe.e_sp, filehdr_out->e_sp);
816   H_PUT_16 (abfd, filehdr_in->pe.e_csum, filehdr_out->e_csum);
817   H_PUT_16 (abfd, filehdr_in->pe.e_ip, filehdr_out->e_ip);
818   H_PUT_16 (abfd, filehdr_in->pe.e_cs, filehdr_out->e_cs);
819   H_PUT_16 (abfd, filehdr_in->pe.e_lfarlc, filehdr_out->e_lfarlc);
820   H_PUT_16 (abfd, filehdr_in->pe.e_ovno, filehdr_out->e_ovno);
821 
822   for (idx = 0; idx < 4; idx++)
823     H_PUT_16 (abfd, filehdr_in->pe.e_res[idx], filehdr_out->e_res[idx]);
824 
825   H_PUT_16 (abfd, filehdr_in->pe.e_oemid, filehdr_out->e_oemid);
826   H_PUT_16 (abfd, filehdr_in->pe.e_oeminfo, filehdr_out->e_oeminfo);
827 
828   for (idx = 0; idx < 10; idx++)
829     H_PUT_16 (abfd, filehdr_in->pe.e_res2[idx], filehdr_out->e_res2[idx]);
830 
831   H_PUT_32 (abfd, filehdr_in->pe.e_lfanew, filehdr_out->e_lfanew);
832 
833   for (idx = 0; idx < 16; idx++)
834     H_PUT_32 (abfd, filehdr_in->pe.dos_message[idx],
835 	      filehdr_out->dos_message[idx]);
836 
837   /* Also put in the NT signature.  */
838   H_PUT_32 (abfd, filehdr_in->pe.nt_signature, filehdr_out->nt_signature);
839 
840   return FILHSZ;
841 }
842 
843 unsigned int
844 _bfd_XX_only_swap_filehdr_out (bfd * abfd, void * in, void * out)
845 {
846   struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
847   FILHDR *filehdr_out = (FILHDR *) out;
848 
849   H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->f_magic);
850   H_PUT_16 (abfd, filehdr_in->f_nscns, filehdr_out->f_nscns);
851   H_PUT_32 (abfd, filehdr_in->f_timdat, filehdr_out->f_timdat);
852   PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr, filehdr_out->f_symptr);
853   H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->f_nsyms);
854   H_PUT_16 (abfd, filehdr_in->f_opthdr, filehdr_out->f_opthdr);
855   H_PUT_16 (abfd, filehdr_in->f_flags, filehdr_out->f_flags);
856 
857   return FILHSZ;
858 }
859 
860 unsigned int
861 _bfd_XXi_swap_scnhdr_out (bfd * abfd, void * in, void * out)
862 {
863   struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
864   SCNHDR *scnhdr_ext = (SCNHDR *) out;
865   unsigned int ret = SCNHSZ;
866   bfd_vma ps;
867   bfd_vma ss;
868 
869   memcpy (scnhdr_ext->s_name, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
870 
871   PUT_SCNHDR_VADDR (abfd,
872 		    ((scnhdr_int->s_vaddr
873 		      - pe_data (abfd)->pe_opthdr.ImageBase)
874 		     & 0xffffffff),
875 		    scnhdr_ext->s_vaddr);
876 
877   /* NT wants the size data to be rounded up to the next
878      NT_FILE_ALIGNMENT, but zero if it has no content (as in .bss,
879      sometimes).  */
880   if ((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0)
881     {
882       if (bfd_pe_executable_p (abfd))
883 	{
884 	  ps = scnhdr_int->s_size;
885 	  ss = 0;
886 	}
887       else
888        {
889          ps = 0;
890          ss = scnhdr_int->s_size;
891        }
892     }
893   else
894     {
895       if (bfd_pe_executable_p (abfd))
896 	ps = scnhdr_int->s_paddr;
897       else
898 	ps = 0;
899 
900       ss = scnhdr_int->s_size;
901     }
902 
903   PUT_SCNHDR_SIZE (abfd, ss,
904 		   scnhdr_ext->s_size);
905 
906   /* s_paddr in PE is really the virtual size.  */
907   PUT_SCNHDR_PADDR (abfd, ps, scnhdr_ext->s_paddr);
908 
909   PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr,
910 		     scnhdr_ext->s_scnptr);
911   PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr,
912 		     scnhdr_ext->s_relptr);
913   PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr,
914 		      scnhdr_ext->s_lnnoptr);
915 
916   {
917     /* Extra flags must be set when dealing with PE.  All sections should also
918        have the IMAGE_SCN_MEM_READ (0x40000000) flag set.  In addition, the
919        .text section must have IMAGE_SCN_MEM_EXECUTE (0x20000000) and the data
920        sections (.idata, .data, .bss, .CRT) must have IMAGE_SCN_MEM_WRITE set
921        (this is especially important when dealing with the .idata section since
922        the addresses for routines from .dlls must be overwritten).  If .reloc
923        section data is ever generated, we must add IMAGE_SCN_MEM_DISCARDABLE
924        (0x02000000).  Also, the resource data should also be read and
925        writable.  */
926 
927     /* FIXME: Alignment is also encoded in this field, at least on PPC and
928        ARM-WINCE.  Although - how do we get the original alignment field
929        back ?  */
930 
931     typedef struct
932     {
933       const char * 	section_name;
934       unsigned long	must_have;
935     }
936     pe_required_section_flags;
937 
938     pe_required_section_flags known_sections [] =
939       {
940 	{ ".arch",  IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_ALIGN_8BYTES },
941 	{ ".bss",   IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
942 	{ ".data",  IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
943 	{ ".edata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
944 	{ ".idata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
945 	{ ".pdata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
946 	{ ".rdata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
947 	{ ".reloc", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE },
948 	{ ".rsrc",  IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
949 	{ ".text" , IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE },
950 	{ ".tls",   IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
951 	{ ".xdata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
952 	{ NULL, 0}
953       };
954 
955     pe_required_section_flags * p;
956 
957     /* We have defaulted to adding the IMAGE_SCN_MEM_WRITE flag, but now
958        we know exactly what this specific section wants so we remove it
959        and then allow the must_have field to add it back in if necessary.
960        However, we don't remove IMAGE_SCN_MEM_WRITE flag from .text if the
961        default WP_TEXT file flag has been cleared.  WP_TEXT may be cleared
962        by ld --enable-auto-import (if auto-import is actually needed),
963        by ld --omagic, or by obcopy --writable-text.  */
964 
965     for (p = known_sections; p->section_name; p++)
966       if (strcmp (scnhdr_int->s_name, p->section_name) == 0)
967 	{
968 	  if (strcmp (scnhdr_int->s_name, ".text")
969 	      || (bfd_get_file_flags (abfd) & WP_TEXT))
970 	    scnhdr_int->s_flags &= ~IMAGE_SCN_MEM_WRITE;
971 	  scnhdr_int->s_flags |= p->must_have;
972 	  break;
973 	}
974 
975     H_PUT_32 (abfd, scnhdr_int->s_flags, scnhdr_ext->s_flags);
976   }
977 
978   if (coff_data (abfd)->link_info
979       && ! coff_data (abfd)->link_info->relocatable
980       && ! coff_data (abfd)->link_info->shared
981       && strcmp (scnhdr_int->s_name, ".text") == 0)
982     {
983       /* By inference from looking at MS output, the 32 bit field
984 	 which is the combination of the number_of_relocs and
985 	 number_of_linenos is used for the line number count in
986 	 executables.  A 16-bit field won't do for cc1.  The MS
987 	 document says that the number of relocs is zero for
988 	 executables, but the 17-th bit has been observed to be there.
989 	 Overflow is not an issue: a 4G-line program will overflow a
990 	 bunch of other fields long before this!  */
991       H_PUT_16 (abfd, (scnhdr_int->s_nlnno & 0xffff), scnhdr_ext->s_nlnno);
992       H_PUT_16 (abfd, (scnhdr_int->s_nlnno >> 16), scnhdr_ext->s_nreloc);
993     }
994   else
995     {
996       if (scnhdr_int->s_nlnno <= 0xffff)
997 	H_PUT_16 (abfd, scnhdr_int->s_nlnno, scnhdr_ext->s_nlnno);
998       else
999 	{
1000 	  (*_bfd_error_handler) (_("%s: line number overflow: 0x%lx > 0xffff"),
1001 				 bfd_get_filename (abfd),
1002 				 scnhdr_int->s_nlnno);
1003 	  bfd_set_error (bfd_error_file_truncated);
1004 	  H_PUT_16 (abfd, 0xffff, scnhdr_ext->s_nlnno);
1005 	  ret = 0;
1006 	}
1007 
1008       /* Although we could encode 0xffff relocs here, we do not, to be
1009          consistent with other parts of bfd. Also it lets us warn, as
1010          we should never see 0xffff here w/o having the overflow flag
1011          set.  */
1012       if (scnhdr_int->s_nreloc < 0xffff)
1013 	H_PUT_16 (abfd, scnhdr_int->s_nreloc, scnhdr_ext->s_nreloc);
1014       else
1015 	{
1016 	  /* PE can deal with large #s of relocs, but not here.  */
1017 	  H_PUT_16 (abfd, 0xffff, scnhdr_ext->s_nreloc);
1018 	  scnhdr_int->s_flags |= IMAGE_SCN_LNK_NRELOC_OVFL;
1019 	  H_PUT_32 (abfd, scnhdr_int->s_flags, scnhdr_ext->s_flags);
1020 	}
1021     }
1022   return ret;
1023 }
1024 
1025 static char * dir_names[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] =
1026 {
1027   N_("Export Directory [.edata (or where ever we found it)]"),
1028   N_("Import Directory [parts of .idata]"),
1029   N_("Resource Directory [.rsrc]"),
1030   N_("Exception Directory [.pdata]"),
1031   N_("Security Directory"),
1032   N_("Base Relocation Directory [.reloc]"),
1033   N_("Debug Directory"),
1034   N_("Description Directory"),
1035   N_("Special Directory"),
1036   N_("Thread Storage Directory [.tls]"),
1037   N_("Load Configuration Directory"),
1038   N_("Bound Import Directory"),
1039   N_("Import Address Table Directory"),
1040   N_("Delay Import Directory"),
1041   N_("CLR Runtime Header"),
1042   N_("Reserved")
1043 };
1044 
1045 #ifdef POWERPC_LE_PE
1046 /* The code for the PPC really falls in the "architecture dependent"
1047    category.  However, it's not clear that anyone will ever care, so
1048    we're ignoring the issue for now; if/when PPC matters, some of this
1049    may need to go into peicode.h, or arguments passed to enable the
1050    PPC- specific code.  */
1051 #endif
1052 
1053 static bfd_boolean
1054 pe_print_idata (bfd * abfd, void * vfile)
1055 {
1056   FILE *file = (FILE *) vfile;
1057   bfd_byte *data;
1058   asection *section;
1059   bfd_signed_vma adj;
1060 
1061 #ifdef POWERPC_LE_PE
1062   asection *rel_section = bfd_get_section_by_name (abfd, ".reldata");
1063 #endif
1064 
1065   bfd_size_type datasize = 0;
1066   bfd_size_type dataoff;
1067   bfd_size_type i;
1068   int onaline = 20;
1069 
1070   pe_data_type *pe = pe_data (abfd);
1071   struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1072 
1073   bfd_vma addr;
1074 
1075   addr = extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress;
1076 
1077   if (addr == 0 && extra->DataDirectory[PE_IMPORT_TABLE].Size == 0)
1078     {
1079       /* Maybe the extra header isn't there.  Look for the section.  */
1080       section = bfd_get_section_by_name (abfd, ".idata");
1081       if (section == NULL)
1082 	return TRUE;
1083 
1084       addr = section->vma;
1085       datasize = section->size;
1086       if (datasize == 0)
1087 	return TRUE;
1088     }
1089   else
1090     {
1091       addr += extra->ImageBase;
1092       for (section = abfd->sections; section != NULL; section = section->next)
1093 	{
1094 	  datasize = section->size;
1095 	  if (addr >= section->vma && addr < section->vma + datasize)
1096 	    break;
1097 	}
1098 
1099       if (section == NULL)
1100 	{
1101 	  fprintf (file,
1102 		   _("\nThere is an import table, but the section containing it could not be found\n"));
1103 	  return TRUE;
1104 	}
1105     }
1106 
1107   fprintf (file, _("\nThere is an import table in %s at 0x%lx\n"),
1108 	   section->name, (unsigned long) addr);
1109 
1110   dataoff = addr - section->vma;
1111   datasize -= dataoff;
1112 
1113 #ifdef POWERPC_LE_PE
1114   if (rel_section != 0 && rel_section->size != 0)
1115     {
1116       /* The toc address can be found by taking the starting address,
1117 	 which on the PPC locates a function descriptor. The
1118 	 descriptor consists of the function code starting address
1119 	 followed by the address of the toc. The starting address we
1120 	 get from the bfd, and the descriptor is supposed to be in the
1121 	 .reldata section.  */
1122 
1123       bfd_vma loadable_toc_address;
1124       bfd_vma toc_address;
1125       bfd_vma start_address;
1126       bfd_byte *data;
1127       bfd_vma offset;
1128 
1129       if (!bfd_malloc_and_get_section (abfd, rel_section, &data))
1130 	{
1131 	  if (data != NULL)
1132 	    free (data);
1133 	  return FALSE;
1134 	}
1135 
1136       offset = abfd->start_address - rel_section->vma;
1137 
1138       if (offset >= rel_section->size || offset + 8 > rel_section->size)
1139         {
1140           if (data != NULL)
1141             free (data);
1142           return FALSE;
1143         }
1144 
1145       start_address = bfd_get_32 (abfd, data + offset);
1146       loadable_toc_address = bfd_get_32 (abfd, data + offset + 4);
1147       toc_address = loadable_toc_address - 32768;
1148 
1149       fprintf (file,
1150 	       _("\nFunction descriptor located at the start address: %04lx\n"),
1151 	       (unsigned long int) (abfd->start_address));
1152       fprintf (file,
1153 	       _("\tcode-base %08lx toc (loadable/actual) %08lx/%08lx\n"),
1154 	       start_address, loadable_toc_address, toc_address);
1155       if (data != NULL)
1156 	free (data);
1157     }
1158   else
1159     {
1160       fprintf (file,
1161 	       _("\nNo reldata section! Function descriptor not decoded.\n"));
1162     }
1163 #endif
1164 
1165   fprintf (file,
1166 	   _("\nThe Import Tables (interpreted %s section contents)\n"),
1167 	   section->name);
1168   fprintf (file,
1169 	   _("\
1170  vma:            Hint    Time      Forward  DLL       First\n\
1171                  Table   Stamp     Chain    Name      Thunk\n"));
1172 
1173   /* Read the whole section.  Some of the fields might be before dataoff.  */
1174   if (!bfd_malloc_and_get_section (abfd, section, &data))
1175     {
1176       if (data != NULL)
1177 	free (data);
1178       return FALSE;
1179     }
1180 
1181   adj = section->vma - extra->ImageBase;
1182 
1183   /* Print all image import descriptors.  */
1184   for (i = 0; i < datasize; i += onaline)
1185     {
1186       bfd_vma hint_addr;
1187       bfd_vma time_stamp;
1188       bfd_vma forward_chain;
1189       bfd_vma dll_name;
1190       bfd_vma first_thunk;
1191       int idx = 0;
1192       bfd_size_type j;
1193       char *dll;
1194 
1195       /* Print (i + extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress).  */
1196       fprintf (file, " %08lx\t", (unsigned long) (i + adj + dataoff));
1197       hint_addr = bfd_get_32 (abfd, data + i + dataoff);
1198       time_stamp = bfd_get_32 (abfd, data + i + 4 + dataoff);
1199       forward_chain = bfd_get_32 (abfd, data + i + 8 + dataoff);
1200       dll_name = bfd_get_32 (abfd, data + i + 12 + dataoff);
1201       first_thunk = bfd_get_32 (abfd, data + i + 16 + dataoff);
1202 
1203       fprintf (file, "%08lx %08lx %08lx %08lx %08lx\n",
1204 	       (unsigned long) hint_addr,
1205 	       (unsigned long) time_stamp,
1206 	       (unsigned long) forward_chain,
1207 	       (unsigned long) dll_name,
1208 	       (unsigned long) first_thunk);
1209 
1210       if (hint_addr == 0 && first_thunk == 0)
1211 	break;
1212 
1213       if (dll_name - adj >= section->size)
1214         break;
1215 
1216       dll = (char *) data + dll_name - adj;
1217       fprintf (file, _("\n\tDLL Name: %s\n"), dll);
1218 
1219       if (hint_addr != 0)
1220 	{
1221 	  bfd_byte *ft_data;
1222 	  asection *ft_section;
1223 	  bfd_vma ft_addr;
1224 	  bfd_size_type ft_datasize;
1225 	  int ft_idx;
1226 	  int ft_allocated = 0;
1227 
1228 	  fprintf (file, _("\tvma:  Hint/Ord Member-Name Bound-To\n"));
1229 
1230 	  idx = hint_addr - adj;
1231 
1232 	  ft_addr = first_thunk + extra->ImageBase;
1233 	  ft_data = data;
1234 	  ft_idx = first_thunk - adj;
1235 	  ft_allocated = 0;
1236 
1237 	  if (first_thunk != hint_addr)
1238 	    {
1239 	      /* Find the section which contains the first thunk.  */
1240 	      for (ft_section = abfd->sections;
1241 		   ft_section != NULL;
1242 		   ft_section = ft_section->next)
1243 		{
1244 		  ft_datasize = ft_section->size;
1245 		  if (ft_addr >= ft_section->vma
1246 		      && ft_addr < ft_section->vma + ft_datasize)
1247 		    break;
1248 		}
1249 
1250 	      if (ft_section == NULL)
1251 		{
1252 		  fprintf (file,
1253 		       _("\nThere is a first thunk, but the section containing it could not be found\n"));
1254 		  continue;
1255 		}
1256 
1257 	      /* Now check to see if this section is the same as our current
1258 		 section.  If it is not then we will have to load its data in.  */
1259 	      if (ft_section == section)
1260 		{
1261 		  ft_data = data;
1262 		  ft_idx = first_thunk - adj;
1263 		}
1264 	      else
1265 		{
1266 		  ft_idx = first_thunk - (ft_section->vma - extra->ImageBase);
1267 		  ft_data = bfd_malloc (datasize);
1268 		  if (ft_data == NULL)
1269 		    continue;
1270 
1271 		  /* Read datasize bfd_bytes starting at offset ft_idx.  */
1272 		  if (! bfd_get_section_contents
1273 		      (abfd, ft_section, ft_data, (bfd_vma) ft_idx, datasize))
1274 		    {
1275 		      free (ft_data);
1276 		      continue;
1277 		    }
1278 
1279 		  ft_idx = 0;
1280 		  ft_allocated = 1;
1281 		}
1282 	    }
1283 
1284 	  /* Print HintName vector entries.  */
1285 #ifdef COFF_WITH_pex64
1286 	  for (j = 0; j < datasize; j += 8)
1287 	    {
1288 	      unsigned long member = bfd_get_32 (abfd, data + idx + j);
1289 	      unsigned long member_high = bfd_get_32 (abfd, data + idx + j + 4);
1290 
1291 	      if (!member && !member_high)
1292 		break;
1293 
1294 	      if (member_high & 0x80000000)
1295 		fprintf (file, "\t%lx%08lx\t %4lx%08lx  <none>",
1296 			 member_high,member, member_high & 0x7fffffff, member);
1297 	      else
1298 		{
1299 		  int ordinal;
1300 		  char *member_name;
1301 
1302 		  ordinal = bfd_get_16 (abfd, data + member - adj);
1303 		  member_name = (char *) data + member - adj + 2;
1304 		  fprintf (file, "\t%04lx\t %4d  %s",member, ordinal, member_name);
1305 		}
1306 
1307 	      /* If the time stamp is not zero, the import address
1308 		 table holds actual addresses.  */
1309 	      if (time_stamp != 0
1310 		  && first_thunk != 0
1311 		  && first_thunk != hint_addr)
1312 		fprintf (file, "\t%04lx",
1313 			 (unsigned long) bfd_get_32 (abfd, ft_data + ft_idx + j));
1314 	      fprintf (file, "\n");
1315 	    }
1316 #else
1317 	  for (j = 0; j < datasize; j += 4)
1318 	    {
1319 	      unsigned long member = bfd_get_32 (abfd, data + idx + j);
1320 
1321 	      /* Print single IMAGE_IMPORT_BY_NAME vector.  */
1322 	      if (member == 0)
1323 		break;
1324 
1325 	      if (member & 0x80000000)
1326 		fprintf (file, "\t%04lx\t %4lu  <none>",
1327 			 member, member & 0x7fffffff);
1328 	      else
1329 		{
1330 		  int ordinal;
1331 		  char *member_name;
1332 
1333 		  ordinal = bfd_get_16 (abfd, data + member - adj);
1334 		  member_name = (char *) data + member - adj + 2;
1335 		  fprintf (file, "\t%04lx\t %4d  %s",
1336 			   member, ordinal, member_name);
1337 		}
1338 
1339 	      /* If the time stamp is not zero, the import address
1340 		 table holds actual addresses.  */
1341 	      if (time_stamp != 0
1342 		  && first_thunk != 0
1343 		  && first_thunk != hint_addr)
1344 		fprintf (file, "\t%04lx",
1345 			 (unsigned long) bfd_get_32 (abfd, ft_data + ft_idx + j));
1346 
1347 	      fprintf (file, "\n");
1348 	    }
1349 #endif
1350 	  if (ft_allocated)
1351 	    free (ft_data);
1352 	}
1353 
1354       fprintf (file, "\n");
1355     }
1356 
1357   free (data);
1358 
1359   return TRUE;
1360 }
1361 
1362 static bfd_boolean
1363 pe_print_edata (bfd * abfd, void * vfile)
1364 {
1365   FILE *file = (FILE *) vfile;
1366   bfd_byte *data;
1367   asection *section;
1368   bfd_size_type datasize = 0;
1369   bfd_size_type dataoff;
1370   bfd_size_type i;
1371   bfd_signed_vma adj;
1372   struct EDT_type
1373   {
1374     long export_flags;          /* Reserved - should be zero.  */
1375     long time_stamp;
1376     short major_ver;
1377     short minor_ver;
1378     bfd_vma name;               /* RVA - relative to image base.  */
1379     long base;                  /* Ordinal base.  */
1380     unsigned long num_functions;/* Number in the export address table.  */
1381     unsigned long num_names;    /* Number in the name pointer table.  */
1382     bfd_vma eat_addr;		/* RVA to the export address table.  */
1383     bfd_vma npt_addr;		/* RVA to the Export Name Pointer Table.  */
1384     bfd_vma ot_addr;		/* RVA to the Ordinal Table.  */
1385   } edt;
1386 
1387   pe_data_type *pe = pe_data (abfd);
1388   struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1389 
1390   bfd_vma addr;
1391 
1392   addr = extra->DataDirectory[PE_EXPORT_TABLE].VirtualAddress;
1393 
1394   if (addr == 0 && extra->DataDirectory[PE_EXPORT_TABLE].Size == 0)
1395     {
1396       /* Maybe the extra header isn't there.  Look for the section.  */
1397       section = bfd_get_section_by_name (abfd, ".edata");
1398       if (section == NULL)
1399 	return TRUE;
1400 
1401       addr = section->vma;
1402       dataoff = 0;
1403       datasize = section->size;
1404       if (datasize == 0)
1405 	return TRUE;
1406     }
1407   else
1408     {
1409       addr += extra->ImageBase;
1410 
1411       for (section = abfd->sections; section != NULL; section = section->next)
1412 	if (addr >= section->vma && addr < section->vma + section->size)
1413 	  break;
1414 
1415       if (section == NULL)
1416 	{
1417 	  fprintf (file,
1418 		   _("\nThere is an export table, but the section containing it could not be found\n"));
1419 	  return TRUE;
1420 	}
1421 
1422       dataoff = addr - section->vma;
1423       datasize = extra->DataDirectory[PE_EXPORT_TABLE].Size;
1424       if (datasize > section->size - dataoff)
1425 	{
1426 	  fprintf (file,
1427 		   _("\nThere is an export table in %s, but it does not fit into that section\n"),
1428 		   section->name);
1429 	  return TRUE;
1430 	}
1431     }
1432 
1433   fprintf (file, _("\nThere is an export table in %s at 0x%lx\n"),
1434 	   section->name, (unsigned long) addr);
1435 
1436   data = bfd_malloc (datasize);
1437   if (data == NULL)
1438     return FALSE;
1439 
1440   if (! bfd_get_section_contents (abfd, section, data,
1441 				  (file_ptr) dataoff, datasize))
1442     return FALSE;
1443 
1444   /* Go get Export Directory Table.  */
1445   edt.export_flags   = bfd_get_32 (abfd, data +  0);
1446   edt.time_stamp     = bfd_get_32 (abfd, data +  4);
1447   edt.major_ver      = bfd_get_16 (abfd, data +  8);
1448   edt.minor_ver      = bfd_get_16 (abfd, data + 10);
1449   edt.name           = bfd_get_32 (abfd, data + 12);
1450   edt.base           = bfd_get_32 (abfd, data + 16);
1451   edt.num_functions  = bfd_get_32 (abfd, data + 20);
1452   edt.num_names      = bfd_get_32 (abfd, data + 24);
1453   edt.eat_addr       = bfd_get_32 (abfd, data + 28);
1454   edt.npt_addr       = bfd_get_32 (abfd, data + 32);
1455   edt.ot_addr        = bfd_get_32 (abfd, data + 36);
1456 
1457   adj = section->vma - extra->ImageBase + dataoff;
1458 
1459   /* Dump the EDT first.  */
1460   fprintf (file,
1461 	   _("\nThe Export Tables (interpreted %s section contents)\n\n"),
1462 	   section->name);
1463 
1464   fprintf (file,
1465 	   _("Export Flags \t\t\t%lx\n"), (unsigned long) edt.export_flags);
1466 
1467   fprintf (file,
1468 	   _("Time/Date stamp \t\t%lx\n"), (unsigned long) edt.time_stamp);
1469 
1470   fprintf (file,
1471 	   _("Major/Minor \t\t\t%d/%d\n"), edt.major_ver, edt.minor_ver);
1472 
1473   fprintf (file,
1474 	   _("Name \t\t\t\t"));
1475   fprintf_vma (file, edt.name);
1476   fprintf (file,
1477 	   " %s\n", data + edt.name - adj);
1478 
1479   fprintf (file,
1480 	   _("Ordinal Base \t\t\t%ld\n"), edt.base);
1481 
1482   fprintf (file,
1483 	   _("Number in:\n"));
1484 
1485   fprintf (file,
1486 	   _("\tExport Address Table \t\t%08lx\n"),
1487 	   edt.num_functions);
1488 
1489   fprintf (file,
1490 	   _("\t[Name Pointer/Ordinal] Table\t%08lx\n"), edt.num_names);
1491 
1492   fprintf (file,
1493 	   _("Table Addresses\n"));
1494 
1495   fprintf (file,
1496 	   _("\tExport Address Table \t\t"));
1497   fprintf_vma (file, edt.eat_addr);
1498   fprintf (file, "\n");
1499 
1500   fprintf (file,
1501 	   _("\tName Pointer Table \t\t"));
1502   fprintf_vma (file, edt.npt_addr);
1503   fprintf (file, "\n");
1504 
1505   fprintf (file,
1506 	   _("\tOrdinal Table \t\t\t"));
1507   fprintf_vma (file, edt.ot_addr);
1508   fprintf (file, "\n");
1509 
1510   /* The next table to find is the Export Address Table. It's basically
1511      a list of pointers that either locate a function in this dll, or
1512      forward the call to another dll. Something like:
1513       typedef union
1514       {
1515         long export_rva;
1516         long forwarder_rva;
1517       } export_address_table_entry;  */
1518 
1519   fprintf (file,
1520 	  _("\nExport Address Table -- Ordinal Base %ld\n"),
1521 	  edt.base);
1522 
1523   for (i = 0; i < edt.num_functions; ++i)
1524     {
1525       bfd_vma eat_member = bfd_get_32 (abfd,
1526 				       data + edt.eat_addr + (i * 4) - adj);
1527       if (eat_member == 0)
1528 	continue;
1529 
1530       if (eat_member - adj <= datasize)
1531 	{
1532 	  /* This rva is to a name (forwarding function) in our section.  */
1533 	  /* Should locate a function descriptor.  */
1534 	  fprintf (file,
1535 		   "\t[%4ld] +base[%4ld] %04lx %s -- %s\n",
1536 		   (long) i,
1537 		   (long) (i + edt.base),
1538 		   (unsigned long) eat_member,
1539 		   _("Forwarder RVA"),
1540 		   data + eat_member - adj);
1541 	}
1542       else
1543 	{
1544 	  /* Should locate a function descriptor in the reldata section.  */
1545 	  fprintf (file,
1546 		   "\t[%4ld] +base[%4ld] %04lx %s\n",
1547 		   (long) i,
1548 		   (long) (i + edt.base),
1549 		   (unsigned long) eat_member,
1550 		   _("Export RVA"));
1551 	}
1552     }
1553 
1554   /* The Export Name Pointer Table is paired with the Export Ordinal Table.  */
1555   /* Dump them in parallel for clarity.  */
1556   fprintf (file,
1557 	   _("\n[Ordinal/Name Pointer] Table\n"));
1558 
1559   for (i = 0; i < edt.num_names; ++i)
1560     {
1561       bfd_vma name_ptr = bfd_get_32 (abfd,
1562 				    data +
1563 				    edt.npt_addr
1564 				    + (i*4) - adj);
1565 
1566       char *name = (char *) data + name_ptr - adj;
1567 
1568       bfd_vma ord = bfd_get_16 (abfd,
1569 				    data +
1570 				    edt.ot_addr
1571 				    + (i*2) - adj);
1572       fprintf (file,
1573 	      "\t[%4ld] %s\n", (long) ord, name);
1574     }
1575 
1576   free (data);
1577 
1578   return TRUE;
1579 }
1580 
1581 /* This really is architecture dependent.  On IA-64, a .pdata entry
1582    consists of three dwords containing relative virtual addresses that
1583    specify the start and end address of the code range the entry
1584    covers and the address of the corresponding unwind info data.
1585 
1586    On ARM and SH-4, a compressed PDATA structure is used :
1587    _IMAGE_CE_RUNTIME_FUNCTION_ENTRY, whereas MIPS is documented to use
1588    _IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY.
1589    See http://msdn2.microsoft.com/en-us/library/ms253988(VS.80).aspx .
1590 
1591    This is the version for uncompressed data.  */
1592 
1593 static bfd_boolean
1594 pe_print_pdata (bfd * abfd, void * vfile)
1595 {
1596 #if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
1597 # define PDATA_ROW_SIZE	(3 * 8)
1598 #else
1599 # define PDATA_ROW_SIZE	(5 * 4)
1600 #endif
1601   FILE *file = (FILE *) vfile;
1602   bfd_byte *data = 0;
1603   asection *section = bfd_get_section_by_name (abfd, ".pdata");
1604   bfd_size_type datasize = 0;
1605   bfd_size_type i;
1606   bfd_size_type start, stop;
1607   int onaline = PDATA_ROW_SIZE;
1608 
1609   if (section == NULL
1610       || coff_section_data (abfd, section) == NULL
1611       || pei_section_data (abfd, section) == NULL)
1612     return TRUE;
1613 
1614   stop = pei_section_data (abfd, section)->virt_size;
1615   if ((stop % onaline) != 0)
1616     fprintf (file,
1617 	     _("Warning, .pdata section size (%ld) is not a multiple of %d\n"),
1618 	     (long) stop, onaline);
1619 
1620   fprintf (file,
1621 	   _("\nThe Function Table (interpreted .pdata section contents)\n"));
1622 #if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
1623   fprintf (file,
1624 	   _(" vma:\t\t\tBegin Address    End Address      Unwind Info\n"));
1625 #else
1626   fprintf (file, _("\
1627  vma:\t\tBegin    End      EH       EH       PrologEnd  Exception\n\
1628      \t\tAddress  Address  Handler  Data     Address    Mask\n"));
1629 #endif
1630 
1631   datasize = section->size;
1632   if (datasize == 0)
1633     return TRUE;
1634 
1635   if (! bfd_malloc_and_get_section (abfd, section, &data))
1636     {
1637       if (data != NULL)
1638 	free (data);
1639       return FALSE;
1640     }
1641 
1642   start = 0;
1643 
1644   for (i = start; i < stop; i += onaline)
1645     {
1646       bfd_vma begin_addr;
1647       bfd_vma end_addr;
1648       bfd_vma eh_handler;
1649       bfd_vma eh_data;
1650       bfd_vma prolog_end_addr;
1651       int em_data;
1652 
1653       if (i + PDATA_ROW_SIZE > stop)
1654 	break;
1655 
1656       begin_addr      = GET_PDATA_ENTRY (abfd, data + i     );
1657       end_addr        = GET_PDATA_ENTRY (abfd, data + i +  4);
1658       eh_handler      = GET_PDATA_ENTRY (abfd, data + i +  8);
1659       eh_data         = GET_PDATA_ENTRY (abfd, data + i + 12);
1660       prolog_end_addr = GET_PDATA_ENTRY (abfd, data + i + 16);
1661 
1662       if (begin_addr == 0 && end_addr == 0 && eh_handler == 0
1663 	  && eh_data == 0 && prolog_end_addr == 0)
1664 	/* We are probably into the padding of the section now.  */
1665 	break;
1666 
1667       em_data = ((eh_handler & 0x1) << 2) | (prolog_end_addr & 0x3);
1668       eh_handler &= ~(bfd_vma) 0x3;
1669       prolog_end_addr &= ~(bfd_vma) 0x3;
1670 
1671       fputc (' ', file);
1672       fprintf_vma (file, i + section->vma); fputc ('\t', file);
1673       fprintf_vma (file, begin_addr); fputc (' ', file);
1674       fprintf_vma (file, end_addr); fputc (' ', file);
1675       fprintf_vma (file, eh_handler);
1676 #if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64)
1677       fputc (' ', file);
1678       fprintf_vma (file, eh_data); fputc (' ', file);
1679       fprintf_vma (file, prolog_end_addr);
1680       fprintf (file, "   %x", em_data);
1681 #endif
1682 
1683 #ifdef POWERPC_LE_PE
1684       if (eh_handler == 0 && eh_data != 0)
1685 	{
1686 	  /* Special bits here, although the meaning may be a little
1687 	     mysterious. The only one I know for sure is 0x03
1688 	     Code Significance
1689 	     0x00 None
1690 	     0x01 Register Save Millicode
1691 	     0x02 Register Restore Millicode
1692 	     0x03 Glue Code Sequence.  */
1693 	  switch (eh_data)
1694 	    {
1695 	    case 0x01:
1696 	      fprintf (file, _(" Register save millicode"));
1697 	      break;
1698 	    case 0x02:
1699 	      fprintf (file, _(" Register restore millicode"));
1700 	      break;
1701 	    case 0x03:
1702 	      fprintf (file, _(" Glue code sequence"));
1703 	      break;
1704 	    default:
1705 	      break;
1706 	    }
1707 	}
1708 #endif
1709       fprintf (file, "\n");
1710     }
1711 
1712   free (data);
1713 
1714   return TRUE;
1715 #undef PDATA_ROW_SIZE
1716 }
1717 
1718 typedef struct sym_cache
1719 {
1720   int        symcount;
1721   asymbol ** syms;
1722 } sym_cache;
1723 
1724 static asymbol **
1725 slurp_symtab (bfd *abfd, sym_cache *psc)
1726 {
1727   asymbol ** sy = NULL;
1728   long storage;
1729 
1730   if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
1731     {
1732       psc->symcount = 0;
1733       return NULL;
1734     }
1735 
1736   storage = bfd_get_symtab_upper_bound (abfd);
1737   if (storage < 0)
1738     return NULL;
1739   if (storage)
1740     sy = bfd_malloc (storage);
1741 
1742   psc->symcount = bfd_canonicalize_symtab (abfd, sy);
1743   if (psc->symcount < 0)
1744     return NULL;
1745   return sy;
1746 }
1747 
1748 static const char *
1749 my_symbol_for_address (bfd *abfd, bfd_vma func, sym_cache *psc)
1750 {
1751   int i;
1752 
1753   if (psc->syms == 0)
1754     psc->syms = slurp_symtab (abfd, psc);
1755 
1756   for (i = 0; i < psc->symcount; i++)
1757     {
1758       if (psc->syms[i]->section->vma + psc->syms[i]->value == func)
1759 	return psc->syms[i]->name;
1760     }
1761 
1762   return NULL;
1763 }
1764 
1765 static void
1766 cleanup_syms (sym_cache *psc)
1767 {
1768   psc->symcount = 0;
1769   free (psc->syms);
1770   psc->syms = NULL;
1771 }
1772 
1773 /* This is the version for "compressed" pdata.  */
1774 
1775 bfd_boolean
1776 _bfd_XX_print_ce_compressed_pdata (bfd * abfd, void * vfile)
1777 {
1778 # define PDATA_ROW_SIZE	(2 * 4)
1779   FILE *file = (FILE *) vfile;
1780   bfd_byte *data = NULL;
1781   asection *section = bfd_get_section_by_name (abfd, ".pdata");
1782   bfd_size_type datasize = 0;
1783   bfd_size_type i;
1784   bfd_size_type start, stop;
1785   int onaline = PDATA_ROW_SIZE;
1786   struct sym_cache sym_cache = {0, 0} ;
1787 
1788   if (section == NULL
1789       || coff_section_data (abfd, section) == NULL
1790       || pei_section_data (abfd, section) == NULL)
1791     return TRUE;
1792 
1793   stop = pei_section_data (abfd, section)->virt_size;
1794   if ((stop % onaline) != 0)
1795     fprintf (file,
1796 	     _("Warning, .pdata section size (%ld) is not a multiple of %d\n"),
1797 	     (long) stop, onaline);
1798 
1799   fprintf (file,
1800 	   _("\nThe Function Table (interpreted .pdata section contents)\n"));
1801 
1802   fprintf (file, _("\
1803  vma:\t\tBegin    Prolog   Function Flags    Exception EH\n\
1804      \t\tAddress  Length   Length   32b exc  Handler   Data\n"));
1805 
1806   datasize = section->size;
1807   if (datasize == 0)
1808     return TRUE;
1809 
1810   if (! bfd_malloc_and_get_section (abfd, section, &data))
1811     {
1812       if (data != NULL)
1813 	free (data);
1814       return FALSE;
1815     }
1816 
1817   start = 0;
1818 
1819   for (i = start; i < stop; i += onaline)
1820     {
1821       bfd_vma begin_addr;
1822       bfd_vma other_data;
1823       bfd_vma prolog_length, function_length;
1824       int flag32bit, exception_flag;
1825       bfd_byte *tdata = 0;
1826       asection *tsection;
1827 
1828       if (i + PDATA_ROW_SIZE > stop)
1829 	break;
1830 
1831       begin_addr = GET_PDATA_ENTRY (abfd, data + i     );
1832       other_data = GET_PDATA_ENTRY (abfd, data + i +  4);
1833 
1834       if (begin_addr == 0 && other_data == 0)
1835 	/* We are probably into the padding of the section now.  */
1836 	break;
1837 
1838       prolog_length = (other_data & 0x000000FF);
1839       function_length = (other_data & 0x3FFFFF00) >> 8;
1840       flag32bit = (int)((other_data & 0x40000000) >> 30);
1841       exception_flag = (int)((other_data & 0x80000000) >> 31);
1842 
1843       fputc (' ', file);
1844       fprintf_vma (file, i + section->vma); fputc ('\t', file);
1845       fprintf_vma (file, begin_addr); fputc (' ', file);
1846       fprintf_vma (file, prolog_length); fputc (' ', file);
1847       fprintf_vma (file, function_length); fputc (' ', file);
1848       fprintf (file, "%2d  %2d   ", flag32bit, exception_flag);
1849 
1850       /* Get the exception handler's address and the data passed from the
1851          .text section. This is really the data that belongs with the .pdata
1852          but got "compressed" out for the ARM and SH4 architectures.  */
1853       tsection = bfd_get_section_by_name (abfd, ".text");
1854       if (tsection && coff_section_data (abfd, tsection)
1855 	  && pei_section_data (abfd, tsection))
1856 	{
1857 	  if (bfd_malloc_and_get_section (abfd, tsection, & tdata))
1858 	    {
1859 	      int xx = (begin_addr - 8) - tsection->vma;
1860 
1861 	      tdata = bfd_malloc (8);
1862 	      if (bfd_get_section_contents (abfd, tsection, tdata, (bfd_vma) xx, 8))
1863 		{
1864 		  bfd_vma eh, eh_data;
1865 
1866 		  eh = bfd_get_32 (abfd, tdata);
1867 		  eh_data = bfd_get_32 (abfd, tdata + 4);
1868 		  fprintf (file, "%08x  ", (unsigned int) eh);
1869 		  fprintf (file, "%08x", (unsigned int) eh_data);
1870 		  if (eh != 0)
1871 		    {
1872 		      const char *s = my_symbol_for_address (abfd, eh, &sym_cache);
1873 
1874 		      if (s)
1875 			fprintf (file, " (%s) ", s);
1876 		    }
1877 		}
1878 	      free (tdata);
1879 	    }
1880 	  else
1881 	    {
1882 	      if (tdata)
1883 		free (tdata);
1884 	    }
1885 	}
1886 
1887       fprintf (file, "\n");
1888     }
1889 
1890   free (data);
1891 
1892   cleanup_syms (& sym_cache);
1893 
1894   return TRUE;
1895 #undef PDATA_ROW_SIZE
1896 }
1897 
1898 #define IMAGE_REL_BASED_HIGHADJ 4
1899 static const char * const tbl[] =
1900 {
1901   "ABSOLUTE",
1902   "HIGH",
1903   "LOW",
1904   "HIGHLOW",
1905   "HIGHADJ",
1906   "MIPS_JMPADDR",
1907   "SECTION",
1908   "REL32",
1909   "RESERVED1",
1910   "MIPS_JMPADDR16",
1911   "DIR64",
1912   "HIGH3ADJ",
1913   "UNKNOWN",   /* MUST be last.  */
1914 };
1915 
1916 static bfd_boolean
1917 pe_print_reloc (bfd * abfd, void * vfile)
1918 {
1919   FILE *file = (FILE *) vfile;
1920   bfd_byte *data = 0;
1921   asection *section = bfd_get_section_by_name (abfd, ".reloc");
1922   bfd_size_type datasize;
1923   bfd_size_type i;
1924   bfd_size_type start, stop;
1925 
1926   if (section == NULL)
1927     return TRUE;
1928 
1929   if (section->size == 0)
1930     return TRUE;
1931 
1932   fprintf (file,
1933 	   _("\n\nPE File Base Relocations (interpreted .reloc section contents)\n"));
1934 
1935   datasize = section->size;
1936   if (! bfd_malloc_and_get_section (abfd, section, &data))
1937     {
1938       if (data != NULL)
1939 	free (data);
1940       return FALSE;
1941     }
1942 
1943   start = 0;
1944 
1945   stop = section->size;
1946 
1947   for (i = start; i < stop;)
1948     {
1949       int j;
1950       bfd_vma virtual_address;
1951       long number, size;
1952 
1953       /* The .reloc section is a sequence of blocks, with a header consisting
1954 	 of two 32 bit quantities, followed by a number of 16 bit entries.  */
1955       virtual_address = bfd_get_32 (abfd, data+i);
1956       size = bfd_get_32 (abfd, data+i+4);
1957       number = (size - 8) / 2;
1958 
1959       if (size == 0)
1960 	break;
1961 
1962       fprintf (file,
1963 	       _("\nVirtual Address: %08lx Chunk size %ld (0x%lx) Number of fixups %ld\n"),
1964 	       (unsigned long) virtual_address, size, (unsigned long) size, number);
1965 
1966       for (j = 0; j < number; ++j)
1967 	{
1968 	  unsigned short e = bfd_get_16 (abfd, data + i + 8 + j * 2);
1969 	  unsigned int t = (e & 0xF000) >> 12;
1970 	  int off = e & 0x0FFF;
1971 
1972 	  if (t >= sizeof (tbl) / sizeof (tbl[0]))
1973 	    t = (sizeof (tbl) / sizeof (tbl[0])) - 1;
1974 
1975 	  fprintf (file,
1976 		   _("\treloc %4d offset %4x [%4lx] %s"),
1977 		   j, off, (unsigned long) (off + virtual_address), tbl[t]);
1978 
1979 	  /* HIGHADJ takes an argument, - the next record *is* the
1980 	     low 16 bits of addend.  */
1981 	  if (t == IMAGE_REL_BASED_HIGHADJ)
1982 	    {
1983 	      fprintf (file, " (%4x)",
1984 		       ((unsigned int)
1985 			bfd_get_16 (abfd, data + i + 8 + j * 2 + 2)));
1986 	      j++;
1987 	    }
1988 
1989 	  fprintf (file, "\n");
1990 	}
1991 
1992       i += size;
1993     }
1994 
1995   free (data);
1996 
1997   return TRUE;
1998 }
1999 
2000 /* Print out the program headers.  */
2001 
2002 bfd_boolean
2003 _bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile)
2004 {
2005   FILE *file = (FILE *) vfile;
2006   int j;
2007   pe_data_type *pe = pe_data (abfd);
2008   struct internal_extra_pe_aouthdr *i = &pe->pe_opthdr;
2009   const char *subsystem_name = NULL;
2010   const char *name;
2011 
2012   /* The MS dumpbin program reportedly ands with 0xff0f before
2013      printing the characteristics field.  Not sure why.  No reason to
2014      emulate it here.  */
2015   fprintf (file, _("\nCharacteristics 0x%x\n"), pe->real_flags);
2016 #undef PF
2017 #define PF(x, y) if (pe->real_flags & x) { fprintf (file, "\t%s\n", y); }
2018   PF (IMAGE_FILE_RELOCS_STRIPPED, "relocations stripped");
2019   PF (IMAGE_FILE_EXECUTABLE_IMAGE, "executable");
2020   PF (IMAGE_FILE_LINE_NUMS_STRIPPED, "line numbers stripped");
2021   PF (IMAGE_FILE_LOCAL_SYMS_STRIPPED, "symbols stripped");
2022   PF (IMAGE_FILE_LARGE_ADDRESS_AWARE, "large address aware");
2023   PF (IMAGE_FILE_BYTES_REVERSED_LO, "little endian");
2024   PF (IMAGE_FILE_32BIT_MACHINE, "32 bit words");
2025   PF (IMAGE_FILE_DEBUG_STRIPPED, "debugging information removed");
2026   PF (IMAGE_FILE_SYSTEM, "system file");
2027   PF (IMAGE_FILE_DLL, "DLL");
2028   PF (IMAGE_FILE_BYTES_REVERSED_HI, "big endian");
2029 #undef PF
2030 
2031   /* ctime implies '\n'.  */
2032   {
2033     time_t t = pe->coff.timestamp;
2034     fprintf (file, "\nTime/Date\t\t%s", ctime (&t));
2035   }
2036 
2037 #ifndef IMAGE_NT_OPTIONAL_HDR_MAGIC
2038 # define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b
2039 #endif
2040 #ifndef IMAGE_NT_OPTIONAL_HDR64_MAGIC
2041 # define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
2042 #endif
2043 #ifndef IMAGE_NT_OPTIONAL_HDRROM_MAGIC
2044 # define IMAGE_NT_OPTIONAL_HDRROM_MAGIC 0x107
2045 #endif
2046 
2047   switch (i->Magic)
2048     {
2049     case IMAGE_NT_OPTIONAL_HDR_MAGIC:
2050       name = "PE32";
2051       break;
2052     case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
2053       name = "PE32+";
2054       break;
2055     case IMAGE_NT_OPTIONAL_HDRROM_MAGIC:
2056       name = "ROM";
2057       break;
2058     default:
2059       name = NULL;
2060       break;
2061     }
2062   fprintf (file, "Magic\t\t\t%04x", i->Magic);
2063   if (name)
2064     fprintf (file, "\t(%s)",name);
2065   fprintf (file, "\nMajorLinkerVersion\t%d\n", i->MajorLinkerVersion);
2066   fprintf (file, "MinorLinkerVersion\t%d\n", i->MinorLinkerVersion);
2067   fprintf (file, "SizeOfCode\t\t%08lx\n", (unsigned long) i->SizeOfCode);
2068   fprintf (file, "SizeOfInitializedData\t%08lx\n",
2069 	   (unsigned long) i->SizeOfInitializedData);
2070   fprintf (file, "SizeOfUninitializedData\t%08lx\n",
2071 	   (unsigned long) i->SizeOfUninitializedData);
2072   fprintf (file, "AddressOfEntryPoint\t");
2073   fprintf_vma (file, i->AddressOfEntryPoint);
2074   fprintf (file, "\nBaseOfCode\t\t");
2075   fprintf_vma (file, i->BaseOfCode);
2076 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
2077   /* PE32+ does not have BaseOfData member!  */
2078   fprintf (file, "\nBaseOfData\t\t");
2079   fprintf_vma (file, i->BaseOfData);
2080 #endif
2081 
2082   fprintf (file, "\nImageBase\t\t");
2083   fprintf_vma (file, i->ImageBase);
2084   fprintf (file, "\nSectionAlignment\t");
2085   fprintf_vma (file, i->SectionAlignment);
2086   fprintf (file, "\nFileAlignment\t\t");
2087   fprintf_vma (file, i->FileAlignment);
2088   fprintf (file, "\nMajorOSystemVersion\t%d\n", i->MajorOperatingSystemVersion);
2089   fprintf (file, "MinorOSystemVersion\t%d\n", i->MinorOperatingSystemVersion);
2090   fprintf (file, "MajorImageVersion\t%d\n", i->MajorImageVersion);
2091   fprintf (file, "MinorImageVersion\t%d\n", i->MinorImageVersion);
2092   fprintf (file, "MajorSubsystemVersion\t%d\n", i->MajorSubsystemVersion);
2093   fprintf (file, "MinorSubsystemVersion\t%d\n", i->MinorSubsystemVersion);
2094   fprintf (file, "Win32Version\t\t%08lx\n", (unsigned long) i->Reserved1);
2095   fprintf (file, "SizeOfImage\t\t%08lx\n", (unsigned long) i->SizeOfImage);
2096   fprintf (file, "SizeOfHeaders\t\t%08lx\n", (unsigned long) i->SizeOfHeaders);
2097   fprintf (file, "CheckSum\t\t%08lx\n", (unsigned long) i->CheckSum);
2098 
2099   switch (i->Subsystem)
2100     {
2101     case IMAGE_SUBSYSTEM_UNKNOWN:
2102       subsystem_name = "unspecified";
2103       break;
2104     case IMAGE_SUBSYSTEM_NATIVE:
2105       subsystem_name = "NT native";
2106       break;
2107     case IMAGE_SUBSYSTEM_WINDOWS_GUI:
2108       subsystem_name = "Windows GUI";
2109       break;
2110     case IMAGE_SUBSYSTEM_WINDOWS_CUI:
2111       subsystem_name = "Windows CUI";
2112       break;
2113     case IMAGE_SUBSYSTEM_POSIX_CUI:
2114       subsystem_name = "POSIX CUI";
2115       break;
2116     case IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:
2117       subsystem_name = "Wince CUI";
2118       break;
2119     case IMAGE_SUBSYSTEM_EFI_APPLICATION:
2120       subsystem_name = "EFI application";
2121       break;
2122     case IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:
2123       subsystem_name = "EFI boot service driver";
2124       break;
2125     case IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
2126       subsystem_name = "EFI runtime driver";
2127       break;
2128     // These are from revision 8.0 of the MS PE/COFF spec
2129     case IMAGE_SUBSYSTEM_EFI_ROM:
2130       subsystem_name = "EFI ROM";
2131       break;
2132     case IMAGE_SUBSYSTEM_XBOX:
2133       subsystem_name = "XBOX";
2134       break;
2135     // Added default case for clarity - subsystem_name is NULL anyway.
2136     default:
2137       subsystem_name = NULL;
2138     }
2139 
2140   fprintf (file, "Subsystem\t\t%08x", i->Subsystem);
2141   if (subsystem_name)
2142     fprintf (file, "\t(%s)", subsystem_name);
2143   fprintf (file, "\nDllCharacteristics\t%08x\n", i->DllCharacteristics);
2144   fprintf (file, "SizeOfStackReserve\t");
2145   fprintf_vma (file, i->SizeOfStackReserve);
2146   fprintf (file, "\nSizeOfStackCommit\t");
2147   fprintf_vma (file, i->SizeOfStackCommit);
2148   fprintf (file, "\nSizeOfHeapReserve\t");
2149   fprintf_vma (file, i->SizeOfHeapReserve);
2150   fprintf (file, "\nSizeOfHeapCommit\t");
2151   fprintf_vma (file, i->SizeOfHeapCommit);
2152   fprintf (file, "\nLoaderFlags\t\t%08lx\n", (unsigned long) i->LoaderFlags);
2153   fprintf (file, "NumberOfRvaAndSizes\t%08lx\n",
2154 	   (unsigned long) i->NumberOfRvaAndSizes);
2155 
2156   fprintf (file, "\nThe Data Directory\n");
2157   for (j = 0; j < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; j++)
2158     {
2159       fprintf (file, "Entry %1x ", j);
2160       fprintf_vma (file, i->DataDirectory[j].VirtualAddress);
2161       fprintf (file, " %08lx ", (unsigned long) i->DataDirectory[j].Size);
2162       fprintf (file, "%s\n", dir_names[j]);
2163     }
2164 
2165   pe_print_idata (abfd, vfile);
2166   pe_print_edata (abfd, vfile);
2167   if (bfd_coff_have_print_pdata (abfd))
2168     bfd_coff_print_pdata (abfd, vfile);
2169   else
2170     pe_print_pdata (abfd, vfile);
2171   pe_print_reloc (abfd, vfile);
2172 
2173   return TRUE;
2174 }
2175 
2176 /* Copy any private info we understand from the input bfd
2177    to the output bfd.  */
2178 
2179 bfd_boolean
2180 _bfd_XX_bfd_copy_private_bfd_data_common (bfd * ibfd, bfd * obfd)
2181 {
2182   pe_data_type *ipe, *ope;
2183 
2184   /* One day we may try to grok other private data.  */
2185   if (ibfd->xvec->flavour != bfd_target_coff_flavour
2186       || obfd->xvec->flavour != bfd_target_coff_flavour)
2187     return TRUE;
2188 
2189   ipe = pe_data (ibfd);
2190   ope = pe_data (obfd);
2191 
2192   ope->pe_opthdr = ipe->pe_opthdr;
2193   ope->dll = ipe->dll;
2194 
2195   /* Don't copy input subsystem if output is different from input.  */
2196   if (obfd->xvec != ibfd->xvec)
2197     ope->pe_opthdr.Subsystem = IMAGE_SUBSYSTEM_UNKNOWN;
2198 
2199   /* For strip: if we removed .reloc, we'll make a real mess of things
2200      if we don't remove this entry as well.  */
2201   if (! pe_data (obfd)->has_reloc_section)
2202     {
2203       pe_data (obfd)->pe_opthdr.DataDirectory[PE_BASE_RELOCATION_TABLE].VirtualAddress = 0;
2204       pe_data (obfd)->pe_opthdr.DataDirectory[PE_BASE_RELOCATION_TABLE].Size = 0;
2205     }
2206   return TRUE;
2207 }
2208 
2209 /* Copy private section data.  */
2210 
2211 bfd_boolean
2212 _bfd_XX_bfd_copy_private_section_data (bfd *ibfd,
2213 				       asection *isec,
2214 				       bfd *obfd,
2215 				       asection *osec)
2216 {
2217   if (bfd_get_flavour (ibfd) != bfd_target_coff_flavour
2218       || bfd_get_flavour (obfd) != bfd_target_coff_flavour)
2219     return TRUE;
2220 
2221   if (coff_section_data (ibfd, isec) != NULL
2222       && pei_section_data (ibfd, isec) != NULL)
2223     {
2224       if (coff_section_data (obfd, osec) == NULL)
2225 	{
2226 	  bfd_size_type amt = sizeof (struct coff_section_tdata);
2227 	  osec->used_by_bfd = bfd_zalloc (obfd, amt);
2228 	  if (osec->used_by_bfd == NULL)
2229 	    return FALSE;
2230 	}
2231 
2232       if (pei_section_data (obfd, osec) == NULL)
2233 	{
2234 	  bfd_size_type amt = sizeof (struct pei_section_tdata);
2235 	  coff_section_data (obfd, osec)->tdata = bfd_zalloc (obfd, amt);
2236 	  if (coff_section_data (obfd, osec)->tdata == NULL)
2237 	    return FALSE;
2238 	}
2239 
2240       pei_section_data (obfd, osec)->virt_size =
2241 	pei_section_data (ibfd, isec)->virt_size;
2242       pei_section_data (obfd, osec)->pe_flags =
2243 	pei_section_data (ibfd, isec)->pe_flags;
2244     }
2245 
2246   return TRUE;
2247 }
2248 
2249 void
2250 _bfd_XX_get_symbol_info (bfd * abfd, asymbol *symbol, symbol_info *ret)
2251 {
2252   coff_get_symbol_info (abfd, symbol, ret);
2253 }
2254 
2255 /* Handle the .idata section and other things that need symbol table
2256    access.  */
2257 
2258 bfd_boolean
2259 _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
2260 {
2261   struct coff_link_hash_entry *h1;
2262   struct bfd_link_info *info = pfinfo->info;
2263   bfd_boolean result = TRUE;
2264 
2265   /* There are a few fields that need to be filled in now while we
2266      have symbol table access.
2267 
2268      The .idata subsections aren't directly available as sections, but
2269      they are in the symbol table, so get them from there.  */
2270 
2271   /* The import directory.  This is the address of .idata$2, with size
2272      of .idata$2 + .idata$3.  */
2273   h1 = coff_link_hash_lookup (coff_hash_table (info),
2274 			      ".idata$2", FALSE, FALSE, TRUE);
2275   if (h1 != NULL)
2276     {
2277       /* PR ld/2729: We cannot rely upon all the output sections having been
2278 	 created properly, so check before referencing them.  Issue a warning
2279 	 message for any sections tht could not be found.  */
2280       if (h1->root.u.def.section != NULL
2281 	  && h1->root.u.def.section->output_section != NULL)
2282 	pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].VirtualAddress =
2283 	  (h1->root.u.def.value
2284 	   + h1->root.u.def.section->output_section->vma
2285 	   + h1->root.u.def.section->output_offset);
2286       else
2287 	{
2288 	  _bfd_error_handler
2289 	    (_("%B: unable to fill in DataDictionary[1] because .idata$2 is missing"),
2290 	     abfd);
2291 	  result = FALSE;
2292 	}
2293 
2294       h1 = coff_link_hash_lookup (coff_hash_table (info),
2295 				  ".idata$4", FALSE, FALSE, TRUE);
2296       if (h1 != NULL
2297 	  && h1->root.u.def.section != NULL
2298 	  && h1->root.u.def.section->output_section != NULL)
2299 	pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].Size =
2300 	  ((h1->root.u.def.value
2301 	    + h1->root.u.def.section->output_section->vma
2302 	    + h1->root.u.def.section->output_offset)
2303 	   - pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].VirtualAddress);
2304       else
2305 	{
2306 	  _bfd_error_handler
2307 	    (_("%B: unable to fill in DataDictionary[1] because .idata$4 is missing"),
2308 	     abfd);
2309 	  result = FALSE;
2310 	}
2311 
2312       /* The import address table.  This is the size/address of
2313          .idata$5.  */
2314       h1 = coff_link_hash_lookup (coff_hash_table (info),
2315 				  ".idata$5", FALSE, FALSE, TRUE);
2316       if (h1 != NULL
2317 	  && h1->root.u.def.section != NULL
2318 	  && h1->root.u.def.section->output_section != NULL)
2319 	pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress =
2320 	  (h1->root.u.def.value
2321 	   + h1->root.u.def.section->output_section->vma
2322 	   + h1->root.u.def.section->output_offset);
2323       else
2324 	{
2325 	  _bfd_error_handler
2326 	    (_("%B: unable to fill in DataDictionary[12] because .idata$5 is missing"),
2327 	     abfd);
2328 	  result = FALSE;
2329 	}
2330 
2331       h1 = coff_link_hash_lookup (coff_hash_table (info),
2332 				  ".idata$6", FALSE, FALSE, TRUE);
2333       if (h1 != NULL
2334 	  && h1->root.u.def.section != NULL
2335 	  && h1->root.u.def.section->output_section != NULL)
2336 	pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size =
2337 	  ((h1->root.u.def.value
2338 	    + h1->root.u.def.section->output_section->vma
2339 	    + h1->root.u.def.section->output_offset)
2340 	   - pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress);
2341       else
2342 	{
2343 	  _bfd_error_handler
2344 	    (_("%B: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE (12)] because .idata$6 is missing"),
2345 	     abfd);
2346 	  result = FALSE;
2347 	}
2348     }
2349 
2350   h1 = coff_link_hash_lookup (coff_hash_table (info),
2351 			      "__tls_used", FALSE, FALSE, TRUE);
2352   if (h1 != NULL)
2353     {
2354       if (h1->root.u.def.section != NULL
2355 	  && h1->root.u.def.section->output_section != NULL)
2356 	pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].VirtualAddress =
2357 	  (h1->root.u.def.value
2358 	   + h1->root.u.def.section->output_section->vma
2359 	   + h1->root.u.def.section->output_offset
2360 	   - pe_data (abfd)->pe_opthdr.ImageBase);
2361       else
2362 	{
2363 	  _bfd_error_handler
2364 	    (_("%B: unable to fill in DataDictionary[9] because __tls_used is missing"),
2365 	     abfd);
2366 	  result = FALSE;
2367 	}
2368 
2369       pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].Size = 0x18;
2370     }
2371 
2372   /* If we couldn't find idata$2, we either have an excessively
2373      trivial program or are in DEEP trouble; we have to assume trivial
2374      program....  */
2375   return result;
2376 }
2377