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