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