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