1 /* Support for the generic parts of PE/PEI; the common executable parts.
2 Copyright 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
3 Written by Cygnus Solutions.
5 This file is part of BFD, the Binary File Descriptor library.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
22 Most of this hacked by Steve Chamberlain,
25 PE/PEI rearrangement (and code added): Donn Terry
29 /* Hey look, some documentation [and in a place you expect to find it]!
31 The main reference for the pei format is "Microsoft Portable Executable
32 and Common Object File Format Specification 4.1". Get it if you need to
33 do some serious hacking on this code.
36 "Peering Inside the PE: A Tour of the Win32 Portable Executable
37 File Format", MSJ 1994, Volume 9.
39 The *sole* difference between the pe format and the pei format is that the
40 latter has an MSDOS 2.0 .exe header on the front that prints the message
41 "This app must be run under Windows." (or some such).
42 (FIXME: Whether that statement is *really* true or not is unknown.
43 Are there more subtle differences between pe and pei formats?
44 For now assume there aren't. If you find one, then for God sakes
47 The Microsoft docs use the word "image" instead of "executable" because
48 the former can also refer to a DLL (shared library). Confusion can arise
49 because the `i' in `pei' also refers to "image". The `pe' format can
50 also create images (i.e. executables), it's just that to run on a win32
51 system you need to use the pei format.
53 FIXME: Please add more docs here so the next poor fool that has to hack
54 on this code has a chance of getting something accomplished without
55 wasting too much time.
61 #include "coff/internal.h"
63 /* NOTE: it's strange to be including an architecture specific header
64 in what's supposed to be general (to PE/PEI) code. However, that's
65 where the definitions are, and they don't vary per architecture
66 within PE/PEI, so we get them from there. FIXME: The lack of
67 variance is an assumption which may prove to be incorrect if new
68 PE/PEI targets are created. */
69 #include "coff/i386.h"
75 /* FIXME: This file has various tests of POWERPC_LE_PE. Those tests
76 worked when the code was in peicode.h, but no longer work now that
77 the code is in peigen.c. PowerPC NT is said to be dead. If
78 anybody wants to revive the code, you will have to figure out how
79 to handle those issues. */
81 boolean in_reloc_p PARAMS((bfd *, reloc_howto_type *));
83 /**********************************************************************/
86 _bfd_pei_swap_sym_in (abfd, ext1, in1)
91 SYMENT *ext = (SYMENT *)ext1;
92 struct internal_syment *in = (struct internal_syment *)in1;
94 if( ext->e.e_name[0] == 0) {
95 in->_n._n_n._n_zeroes = 0;
96 in->_n._n_n._n_offset = bfd_h_get_32(abfd, (bfd_byte *) ext->e.e.e_offset);
99 memcpy(in->_n._n_name, ext->e.e_name, SYMNMLEN);
102 in->n_value = bfd_h_get_32(abfd, (bfd_byte *) ext->e_value);
103 in->n_scnum = bfd_h_get_16(abfd, (bfd_byte *) ext->e_scnum);
104 if (sizeof(ext->e_type) == 2){
105 in->n_type = bfd_h_get_16(abfd, (bfd_byte *) ext->e_type);
108 in->n_type = bfd_h_get_32(abfd, (bfd_byte *) ext->e_type);
110 in->n_sclass = bfd_h_get_8(abfd, ext->e_sclass);
111 in->n_numaux = bfd_h_get_8(abfd, ext->e_numaux);
113 #ifndef STRICT_PE_FORMAT
114 /* This is for Gnu-created DLLs */
116 /* The section symbols for the .idata$ sections have class 0x68
117 (C_SECTION), which MS documentation indicates is a section
118 symbol. Unfortunately, the value field in the symbol is simply a
119 copy of the .idata section's flags rather than something useful.
120 When these symbols are encountered, change the value to 0 so that
121 they will be handled somewhat correctly in the bfd code. */
122 if (in->n_sclass == C_SECTION)
127 /* FIXME: This is clearly wrong. The problem seems to be that
128 undefined C_SECTION symbols appear in the first object of a
129 MS generated .lib file, and the symbols are not defined
133 /* I have tried setting the class to 3 and using the following
134 to set the section number. This will put the address of the
135 pointer to the string kernel32.dll at addresses 0 and 0x10
136 off start of idata section which is not correct */
137 /* if (strcmp (in->_n._n_name, ".idata$4") == 0) */
138 /* in->n_scnum = 3; */
140 /* in->n_scnum = 2; */
142 /* Create synthetic empty sections as needed. DJ */
143 if (in->n_scnum == 0)
146 for (sec=abfd->sections; sec; sec=sec->next)
148 if (strcmp (sec->name, in->n_name) == 0)
150 in->n_scnum = sec->target_index;
155 if (in->n_scnum == 0)
157 int unused_section_number = 0;
160 for (sec=abfd->sections; sec; sec=sec->next)
161 if (unused_section_number <= sec->target_index)
162 unused_section_number = sec->target_index+1;
164 name = bfd_alloc (abfd, strlen (in->n_name) + 10);
167 strcpy (name, in->n_name);
168 sec = bfd_make_section_anyway (abfd, name);
172 sec->_cooked_size = 0;
175 sec->rel_filepos = 0;
176 sec->reloc_count = 0;
177 sec->line_filepos = 0;
178 sec->lineno_count = 0;
179 sec->userdata = NULL;
180 sec->next = (asection *) NULL;
182 sec->alignment_power = 2;
183 sec->flags = SEC_HAS_CONTENTS | SEC_ALLOC | SEC_DATA | SEC_LOAD;
185 sec->target_index = unused_section_number;
187 in->n_scnum = unused_section_number;
189 in->n_sclass = C_STAT;
194 #ifdef coff_swap_sym_in_hook
195 /* This won't work in peigen.c, but since it's for PPC PE, it's not
197 coff_swap_sym_in_hook(abfd, ext1, in1);
202 _bfd_pei_swap_sym_out (abfd, inp, extp)
207 struct internal_syment *in = (struct internal_syment *)inp;
208 SYMENT *ext =(SYMENT *)extp;
209 if(in->_n._n_name[0] == 0) {
210 bfd_h_put_32(abfd, 0, (bfd_byte *) ext->e.e.e_zeroes);
211 bfd_h_put_32(abfd, in->_n._n_n._n_offset, (bfd_byte *) ext->e.e.e_offset);
214 memcpy(ext->e.e_name, in->_n._n_name, SYMNMLEN);
217 bfd_h_put_32(abfd, in->n_value , (bfd_byte *) ext->e_value);
218 bfd_h_put_16(abfd, in->n_scnum , (bfd_byte *) ext->e_scnum);
219 if (sizeof(ext->e_type) == 2)
221 bfd_h_put_16(abfd, in->n_type , (bfd_byte *) ext->e_type);
225 bfd_h_put_32(abfd, in->n_type , (bfd_byte *) ext->e_type);
227 bfd_h_put_8(abfd, in->n_sclass , ext->e_sclass);
228 bfd_h_put_8(abfd, in->n_numaux , ext->e_numaux);
234 _bfd_pei_swap_aux_in (abfd, ext1, type, class, indx, numaux, in1)
239 int indx ATTRIBUTE_UNUSED;
240 int numaux ATTRIBUTE_UNUSED;
243 AUXENT *ext = (AUXENT *)ext1;
244 union internal_auxent *in = (union internal_auxent *)in1;
248 if (ext->x_file.x_fname[0] == 0) {
249 in->x_file.x_n.x_zeroes = 0;
250 in->x_file.x_n.x_offset =
251 bfd_h_get_32(abfd, (bfd_byte *) ext->x_file.x_n.x_offset);
253 memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
261 if (type == T_NULL) {
262 in->x_scn.x_scnlen = GET_SCN_SCNLEN(abfd, ext);
263 in->x_scn.x_nreloc = GET_SCN_NRELOC(abfd, ext);
264 in->x_scn.x_nlinno = GET_SCN_NLINNO(abfd, ext);
265 in->x_scn.x_checksum = bfd_h_get_32 (abfd,
266 (bfd_byte *) ext->x_scn.x_checksum);
267 in->x_scn.x_associated =
268 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_scn.x_associated);
269 in->x_scn.x_comdat = bfd_h_get_8 (abfd,
270 (bfd_byte *) ext->x_scn.x_comdat);
276 in->x_sym.x_tagndx.l = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_tagndx);
277 in->x_sym.x_tvndx = bfd_h_get_16(abfd, (bfd_byte *) ext->x_sym.x_tvndx);
279 if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
281 in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR (abfd, ext);
282 in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX (abfd, ext);
286 in->x_sym.x_fcnary.x_ary.x_dimen[0] =
287 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
288 in->x_sym.x_fcnary.x_ary.x_dimen[1] =
289 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
290 in->x_sym.x_fcnary.x_ary.x_dimen[2] =
291 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
292 in->x_sym.x_fcnary.x_ary.x_dimen[3] =
293 bfd_h_get_16 (abfd, (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
297 in->x_sym.x_misc.x_fsize = bfd_h_get_32(abfd, (bfd_byte *) ext->x_sym.x_misc.x_fsize);
300 in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO(abfd, ext);
301 in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE(abfd, ext);
306 _bfd_pei_swap_aux_out (abfd, inp, type, class, indx, numaux, extp)
311 int indx ATTRIBUTE_UNUSED;
312 int numaux ATTRIBUTE_UNUSED;
315 union internal_auxent *in = (union internal_auxent *)inp;
316 AUXENT *ext = (AUXENT *)extp;
318 memset((PTR)ext, 0, AUXESZ);
321 if (in->x_file.x_fname[0] == 0) {
322 bfd_h_put_32(abfd, 0, (bfd_byte *) ext->x_file.x_n.x_zeroes);
324 in->x_file.x_n.x_offset,
325 (bfd_byte *) ext->x_file.x_n.x_offset);
328 memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
336 if (type == T_NULL) {
337 PUT_SCN_SCNLEN(abfd, in->x_scn.x_scnlen, ext);
338 PUT_SCN_NRELOC(abfd, in->x_scn.x_nreloc, ext);
339 PUT_SCN_NLINNO(abfd, in->x_scn.x_nlinno, ext);
340 bfd_h_put_32 (abfd, in->x_scn.x_checksum,
341 (bfd_byte *) ext->x_scn.x_checksum);
342 bfd_h_put_16 (abfd, in->x_scn.x_associated,
343 (bfd_byte *) ext->x_scn.x_associated);
344 bfd_h_put_8 (abfd, in->x_scn.x_comdat,
345 (bfd_byte *) ext->x_scn.x_comdat);
351 bfd_h_put_32(abfd, in->x_sym.x_tagndx.l, (bfd_byte *) ext->x_sym.x_tagndx);
352 bfd_h_put_16(abfd, in->x_sym.x_tvndx , (bfd_byte *) ext->x_sym.x_tvndx);
354 if (class == C_BLOCK || class == C_FCN || ISFCN (type) || ISTAG (class))
356 PUT_FCN_LNNOPTR(abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
357 PUT_FCN_ENDNDX(abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
361 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
362 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
363 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
364 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
365 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
366 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
367 bfd_h_put_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
368 (bfd_byte *) ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
372 bfd_h_put_32 (abfd, in->x_sym.x_misc.x_fsize,
373 (bfd_byte *) ext->x_sym.x_misc.x_fsize);
376 PUT_LNSZ_LNNO (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext);
377 PUT_LNSZ_SIZE (abfd, in->x_sym.x_misc.x_lnsz.x_size, ext);
384 _bfd_pei_swap_lineno_in (abfd, ext1, in1)
389 LINENO *ext = (LINENO *)ext1;
390 struct internal_lineno *in = (struct internal_lineno *)in1;
392 in->l_addr.l_symndx = bfd_h_get_32(abfd, (bfd_byte *) ext->l_addr.l_symndx);
393 in->l_lnno = GET_LINENO_LNNO(abfd, ext);
397 _bfd_pei_swap_lineno_out (abfd, inp, outp)
402 struct internal_lineno *in = (struct internal_lineno *)inp;
403 struct external_lineno *ext = (struct external_lineno *)outp;
404 bfd_h_put_32(abfd, in->l_addr.l_symndx, (bfd_byte *)
405 ext->l_addr.l_symndx);
407 PUT_LINENO_LNNO (abfd, in->l_lnno, ext);
412 _bfd_pei_swap_aouthdr_in (abfd, aouthdr_ext1, aouthdr_int1)
417 struct internal_extra_pe_aouthdr *a;
418 PEAOUTHDR *src = (PEAOUTHDR *)(aouthdr_ext1);
419 AOUTHDR *aouthdr_ext = (AOUTHDR *) aouthdr_ext1;
420 struct internal_aouthdr *aouthdr_int = (struct internal_aouthdr *)aouthdr_int1;
422 aouthdr_int->magic = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->magic);
423 aouthdr_int->vstamp = bfd_h_get_16(abfd, (bfd_byte *) aouthdr_ext->vstamp);
425 GET_AOUTHDR_TSIZE (abfd, (bfd_byte *) aouthdr_ext->tsize);
427 GET_AOUTHDR_DSIZE (abfd, (bfd_byte *) aouthdr_ext->dsize);
429 GET_AOUTHDR_BSIZE (abfd, (bfd_byte *) aouthdr_ext->bsize);
431 GET_AOUTHDR_ENTRY (abfd, (bfd_byte *) aouthdr_ext->entry);
432 aouthdr_int->text_start =
433 GET_AOUTHDR_TEXT_START (abfd, (bfd_byte *) aouthdr_ext->text_start);
434 aouthdr_int->data_start =
435 GET_AOUTHDR_DATA_START (abfd, (bfd_byte *) aouthdr_ext->data_start);
437 a = &aouthdr_int->pe;
438 a->ImageBase = bfd_h_get_32 (abfd, (bfd_byte *)src->ImageBase);
439 a->SectionAlignment = bfd_h_get_32 (abfd, (bfd_byte *)src->SectionAlignment);
440 a->FileAlignment = bfd_h_get_32 (abfd, (bfd_byte *)src->FileAlignment);
441 a->MajorOperatingSystemVersion =
442 bfd_h_get_16 (abfd, (bfd_byte *)src->MajorOperatingSystemVersion);
443 a->MinorOperatingSystemVersion =
444 bfd_h_get_16 (abfd, (bfd_byte *)src->MinorOperatingSystemVersion);
445 a->MajorImageVersion = bfd_h_get_16 (abfd, (bfd_byte *)src->MajorImageVersion);
446 a->MinorImageVersion = bfd_h_get_16 (abfd, (bfd_byte *)src->MinorImageVersion);
447 a->MajorSubsystemVersion = bfd_h_get_16 (abfd, (bfd_byte *)src->MajorSubsystemVersion);
448 a->MinorSubsystemVersion = bfd_h_get_16 (abfd, (bfd_byte *)src->MinorSubsystemVersion);
449 a->Reserved1 = bfd_h_get_32 (abfd, (bfd_byte *)src->Reserved1);
450 a->SizeOfImage = bfd_h_get_32 (abfd, (bfd_byte *)src->SizeOfImage);
451 a->SizeOfHeaders = bfd_h_get_32 (abfd, (bfd_byte *)src->SizeOfHeaders);
452 a->CheckSum = bfd_h_get_32 (abfd, (bfd_byte *)src->CheckSum);
453 a->Subsystem = bfd_h_get_16 (abfd, (bfd_byte *)src->Subsystem);
454 a->DllCharacteristics = bfd_h_get_16 (abfd, (bfd_byte *)src->DllCharacteristics);
455 a->SizeOfStackReserve = bfd_h_get_32 (abfd, (bfd_byte *)src->SizeOfStackReserve);
456 a->SizeOfStackCommit = bfd_h_get_32 (abfd, (bfd_byte *)src->SizeOfStackCommit);
457 a->SizeOfHeapReserve = bfd_h_get_32 (abfd, (bfd_byte *)src->SizeOfHeapReserve);
458 a->SizeOfHeapCommit = bfd_h_get_32 (abfd, (bfd_byte *)src->SizeOfHeapCommit);
459 a->LoaderFlags = bfd_h_get_32 (abfd, (bfd_byte *)src->LoaderFlags);
460 a->NumberOfRvaAndSizes = bfd_h_get_32 (abfd, (bfd_byte *)src->NumberOfRvaAndSizes);
464 for (idx=0; idx < 16; idx++)
466 a->DataDirectory[idx].VirtualAddress =
467 bfd_h_get_32 (abfd, (bfd_byte *)src->DataDirectory[idx][0]);
468 a->DataDirectory[idx].Size =
469 bfd_h_get_32 (abfd, (bfd_byte *)src->DataDirectory[idx][1]);
473 if (aouthdr_int->entry)
475 aouthdr_int->entry += a->ImageBase;
476 aouthdr_int->entry &= 0xffffffff;
478 if (aouthdr_int->tsize)
480 aouthdr_int->text_start += a->ImageBase;
481 aouthdr_int->text_start &= 0xffffffff;
483 if (aouthdr_int->dsize)
485 aouthdr_int->data_start += a->ImageBase;
486 aouthdr_int->data_start &= 0xffffffff;
490 /* These three fields are normally set up by ppc_relocate_section.
491 In the case of reading a file in, we can pick them up from the
493 first_thunk_address = a->DataDirectory[12].VirtualAddress ;
494 thunk_size = a->DataDirectory[12].Size;
495 import_table_size = a->DataDirectory[1].Size;
500 static void add_data_entry (abfd, aout, idx, name, base)
502 struct internal_extra_pe_aouthdr *aout;
507 asection *sec = bfd_get_section_by_name (abfd, name);
509 /* add import directory information if it exists */
511 && (coff_section_data (abfd, sec) != NULL)
512 && (pei_section_data (abfd, sec) != NULL))
514 aout->DataDirectory[idx].VirtualAddress = (sec->vma - base) & 0xffffffff;
515 aout->DataDirectory[idx].Size = pei_section_data (abfd, sec)->virt_size;
516 sec->flags |= SEC_DATA;
521 _bfd_pei_swap_aouthdr_out (abfd, in, out)
526 struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *)in;
527 struct internal_extra_pe_aouthdr *extra = &pe_data (abfd)->pe_opthdr;
528 PEAOUTHDR *aouthdr_out = (PEAOUTHDR *)out;
530 bfd_vma sa = extra->SectionAlignment;
531 bfd_vma fa = extra->FileAlignment;
532 bfd_vma ib = extra->ImageBase ;
534 if (aouthdr_in->tsize)
536 aouthdr_in->text_start -= ib;
537 aouthdr_in->text_start &= 0xffffffff;
539 if (aouthdr_in->dsize)
541 aouthdr_in->data_start -= ib;
542 aouthdr_in->data_start &= 0xffffffff;
544 if (aouthdr_in->entry)
546 aouthdr_in->entry -= ib;
547 aouthdr_in->entry &= 0xffffffff;
550 #define FA(x) (((x) + fa -1 ) & (- fa))
551 #define SA(x) (((x) + sa -1 ) & (- sa))
553 /* We like to have the sizes aligned */
555 aouthdr_in->bsize = FA (aouthdr_in->bsize);
558 extra->NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
560 /* first null out all data directory entries .. */
561 memset (extra->DataDirectory, sizeof (extra->DataDirectory), 0);
563 add_data_entry (abfd, extra, 0, ".edata", ib);
564 add_data_entry (abfd, extra, 1, ".idata", ib);
565 add_data_entry (abfd, extra, 2, ".rsrc" ,ib);
568 /* FIXME: do other PE platforms use this? */
569 add_data_entry (abfd, extra, 3, ".pdata" ,ib);
572 add_data_entry (abfd, extra, 5, ".reloc", ib);
575 /* On the PPC NT system, this field is set up as follows. It is not
576 an "officially" reserved field, so it currently has no title.
577 first_thunk_address is idata$5, and the thunk_size is the size of
578 the idata$5 chunk of the idata section. */
579 extra->DataDirectory[12].VirtualAddress = first_thunk_address;
580 extra->DataDirectory[12].Size = thunk_size;
582 /* On the PPC NT system, the size of the directory entry is not the
583 size of the entire section. It's actually offset to the end of
584 the idata$3 component of the idata section. This is the size of
585 the entire import table. (also known as the start of idata$4). */
586 extra->DataDirectory[1].Size = import_table_size;
592 bfd_vma isize = SA(abfd->sections->filepos);
595 for (sec = abfd->sections; sec; sec = sec->next)
597 int rounded = FA(sec->_raw_size);
599 if (sec->flags & SEC_DATA)
601 if (sec->flags & SEC_CODE)
603 isize += SA(rounded);
606 aouthdr_in->dsize = dsize;
607 aouthdr_in->tsize = tsize;
608 extra->SizeOfImage = isize;
611 extra->SizeOfHeaders = abfd->sections->filepos;
612 bfd_h_put_16(abfd, aouthdr_in->magic, (bfd_byte *) aouthdr_out->standard.magic);
615 /* this little piece of magic sets the "linker version" field to 2.60 */
616 bfd_h_put_16(abfd, 2 + 60 * 256, (bfd_byte *) aouthdr_out->standard.vstamp);
618 /* this little piece of magic sets the "linker version" field to 2.55 */
619 bfd_h_put_16(abfd, 2 + 55 * 256, (bfd_byte *) aouthdr_out->standard.vstamp);
622 PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, (bfd_byte *) aouthdr_out->standard.tsize);
623 PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, (bfd_byte *) aouthdr_out->standard.dsize);
624 PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, (bfd_byte *) aouthdr_out->standard.bsize);
625 PUT_AOUTHDR_ENTRY (abfd, aouthdr_in->entry, (bfd_byte *) aouthdr_out->standard.entry);
626 PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start,
627 (bfd_byte *) aouthdr_out->standard.text_start);
629 PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
630 (bfd_byte *) aouthdr_out->standard.data_start);
633 bfd_h_put_32 (abfd, extra->ImageBase,
634 (bfd_byte *) aouthdr_out->ImageBase);
635 bfd_h_put_32 (abfd, extra->SectionAlignment,
636 (bfd_byte *) aouthdr_out->SectionAlignment);
637 bfd_h_put_32 (abfd, extra->FileAlignment,
638 (bfd_byte *) aouthdr_out->FileAlignment);
639 bfd_h_put_16 (abfd, extra->MajorOperatingSystemVersion,
640 (bfd_byte *) aouthdr_out->MajorOperatingSystemVersion);
641 bfd_h_put_16 (abfd, extra->MinorOperatingSystemVersion,
642 (bfd_byte *) aouthdr_out->MinorOperatingSystemVersion);
643 bfd_h_put_16 (abfd, extra->MajorImageVersion,
644 (bfd_byte *) aouthdr_out->MajorImageVersion);
645 bfd_h_put_16 (abfd, extra->MinorImageVersion,
646 (bfd_byte *) aouthdr_out->MinorImageVersion);
647 bfd_h_put_16 (abfd, extra->MajorSubsystemVersion,
648 (bfd_byte *) aouthdr_out->MajorSubsystemVersion);
649 bfd_h_put_16 (abfd, extra->MinorSubsystemVersion,
650 (bfd_byte *) aouthdr_out->MinorSubsystemVersion);
651 bfd_h_put_32 (abfd, extra->Reserved1,
652 (bfd_byte *) aouthdr_out->Reserved1);
653 bfd_h_put_32 (abfd, extra->SizeOfImage,
654 (bfd_byte *) aouthdr_out->SizeOfImage);
655 bfd_h_put_32 (abfd, extra->SizeOfHeaders,
656 (bfd_byte *) aouthdr_out->SizeOfHeaders);
657 bfd_h_put_32 (abfd, extra->CheckSum,
658 (bfd_byte *) aouthdr_out->CheckSum);
659 bfd_h_put_16 (abfd, extra->Subsystem,
660 (bfd_byte *) aouthdr_out->Subsystem);
661 bfd_h_put_16 (abfd, extra->DllCharacteristics,
662 (bfd_byte *) aouthdr_out->DllCharacteristics);
663 bfd_h_put_32 (abfd, extra->SizeOfStackReserve,
664 (bfd_byte *) aouthdr_out->SizeOfStackReserve);
665 bfd_h_put_32 (abfd, extra->SizeOfStackCommit,
666 (bfd_byte *) aouthdr_out->SizeOfStackCommit);
667 bfd_h_put_32 (abfd, extra->SizeOfHeapReserve,
668 (bfd_byte *) aouthdr_out->SizeOfHeapReserve);
669 bfd_h_put_32 (abfd, extra->SizeOfHeapCommit,
670 (bfd_byte *) aouthdr_out->SizeOfHeapCommit);
671 bfd_h_put_32 (abfd, extra->LoaderFlags,
672 (bfd_byte *) aouthdr_out->LoaderFlags);
673 bfd_h_put_32 (abfd, extra->NumberOfRvaAndSizes,
674 (bfd_byte *) aouthdr_out->NumberOfRvaAndSizes);
677 for (idx=0; idx < 16; idx++)
679 bfd_h_put_32 (abfd, extra->DataDirectory[idx].VirtualAddress,
680 (bfd_byte *) aouthdr_out->DataDirectory[idx][0]);
681 bfd_h_put_32 (abfd, extra->DataDirectory[idx].Size,
682 (bfd_byte *) aouthdr_out->DataDirectory[idx][1]);
690 _bfd_pei_only_swap_filehdr_out (abfd, in, out)
696 struct internal_filehdr *filehdr_in = (struct internal_filehdr *)in;
697 struct external_PEI_filehdr *filehdr_out = (struct external_PEI_filehdr *)out;
699 if (pe_data (abfd)->has_reloc_section)
700 filehdr_in->f_flags &= ~F_RELFLG;
702 if (pe_data (abfd)->dll)
703 filehdr_in->f_flags |= F_DLL;
705 filehdr_in->pe.e_magic = DOSMAGIC;
706 filehdr_in->pe.e_cblp = 0x90;
707 filehdr_in->pe.e_cp = 0x3;
708 filehdr_in->pe.e_crlc = 0x0;
709 filehdr_in->pe.e_cparhdr = 0x4;
710 filehdr_in->pe.e_minalloc = 0x0;
711 filehdr_in->pe.e_maxalloc = 0xffff;
712 filehdr_in->pe.e_ss = 0x0;
713 filehdr_in->pe.e_sp = 0xb8;
714 filehdr_in->pe.e_csum = 0x0;
715 filehdr_in->pe.e_ip = 0x0;
716 filehdr_in->pe.e_cs = 0x0;
717 filehdr_in->pe.e_lfarlc = 0x40;
718 filehdr_in->pe.e_ovno = 0x0;
720 for (idx=0; idx < 4; idx++)
721 filehdr_in->pe.e_res[idx] = 0x0;
723 filehdr_in->pe.e_oemid = 0x0;
724 filehdr_in->pe.e_oeminfo = 0x0;
726 for (idx=0; idx < 10; idx++)
727 filehdr_in->pe.e_res2[idx] = 0x0;
729 filehdr_in->pe.e_lfanew = 0x80;
731 /* this next collection of data are mostly just characters. It appears
732 to be constant within the headers put on NT exes */
733 filehdr_in->pe.dos_message[0] = 0x0eba1f0e;
734 filehdr_in->pe.dos_message[1] = 0xcd09b400;
735 filehdr_in->pe.dos_message[2] = 0x4c01b821;
736 filehdr_in->pe.dos_message[3] = 0x685421cd;
737 filehdr_in->pe.dos_message[4] = 0x70207369;
738 filehdr_in->pe.dos_message[5] = 0x72676f72;
739 filehdr_in->pe.dos_message[6] = 0x63206d61;
740 filehdr_in->pe.dos_message[7] = 0x6f6e6e61;
741 filehdr_in->pe.dos_message[8] = 0x65622074;
742 filehdr_in->pe.dos_message[9] = 0x6e757220;
743 filehdr_in->pe.dos_message[10] = 0x206e6920;
744 filehdr_in->pe.dos_message[11] = 0x20534f44;
745 filehdr_in->pe.dos_message[12] = 0x65646f6d;
746 filehdr_in->pe.dos_message[13] = 0x0a0d0d2e;
747 filehdr_in->pe.dos_message[14] = 0x24;
748 filehdr_in->pe.dos_message[15] = 0x0;
749 filehdr_in->pe.nt_signature = NT_SIGNATURE;
753 bfd_h_put_16(abfd, filehdr_in->f_magic, (bfd_byte *) filehdr_out->f_magic);
754 bfd_h_put_16(abfd, filehdr_in->f_nscns, (bfd_byte *) filehdr_out->f_nscns);
756 bfd_h_put_32(abfd, time (0), (bfd_byte *) filehdr_out->f_timdat);
757 PUT_FILEHDR_SYMPTR (abfd, (bfd_vma) filehdr_in->f_symptr,
758 (bfd_byte *) filehdr_out->f_symptr);
759 bfd_h_put_32(abfd, filehdr_in->f_nsyms, (bfd_byte *) filehdr_out->f_nsyms);
760 bfd_h_put_16(abfd, filehdr_in->f_opthdr, (bfd_byte *) filehdr_out->f_opthdr);
761 bfd_h_put_16(abfd, filehdr_in->f_flags, (bfd_byte *) filehdr_out->f_flags);
763 /* put in extra dos header stuff. This data remains essentially
764 constant, it just has to be tacked on to the beginning of all exes
766 bfd_h_put_16(abfd, filehdr_in->pe.e_magic, (bfd_byte *) filehdr_out->e_magic);
767 bfd_h_put_16(abfd, filehdr_in->pe.e_cblp, (bfd_byte *) filehdr_out->e_cblp);
768 bfd_h_put_16(abfd, filehdr_in->pe.e_cp, (bfd_byte *) filehdr_out->e_cp);
769 bfd_h_put_16(abfd, filehdr_in->pe.e_crlc, (bfd_byte *) filehdr_out->e_crlc);
770 bfd_h_put_16(abfd, filehdr_in->pe.e_cparhdr,
771 (bfd_byte *) filehdr_out->e_cparhdr);
772 bfd_h_put_16(abfd, filehdr_in->pe.e_minalloc,
773 (bfd_byte *) filehdr_out->e_minalloc);
774 bfd_h_put_16(abfd, filehdr_in->pe.e_maxalloc,
775 (bfd_byte *) filehdr_out->e_maxalloc);
776 bfd_h_put_16(abfd, filehdr_in->pe.e_ss, (bfd_byte *) filehdr_out->e_ss);
777 bfd_h_put_16(abfd, filehdr_in->pe.e_sp, (bfd_byte *) filehdr_out->e_sp);
778 bfd_h_put_16(abfd, filehdr_in->pe.e_csum, (bfd_byte *) filehdr_out->e_csum);
779 bfd_h_put_16(abfd, filehdr_in->pe.e_ip, (bfd_byte *) filehdr_out->e_ip);
780 bfd_h_put_16(abfd, filehdr_in->pe.e_cs, (bfd_byte *) filehdr_out->e_cs);
781 bfd_h_put_16(abfd, filehdr_in->pe.e_lfarlc, (bfd_byte *) filehdr_out->e_lfarlc);
782 bfd_h_put_16(abfd, filehdr_in->pe.e_ovno, (bfd_byte *) filehdr_out->e_ovno);
785 for (idx=0; idx < 4; idx++)
786 bfd_h_put_16(abfd, filehdr_in->pe.e_res[idx],
787 (bfd_byte *) filehdr_out->e_res[idx]);
789 bfd_h_put_16(abfd, filehdr_in->pe.e_oemid, (bfd_byte *) filehdr_out->e_oemid);
790 bfd_h_put_16(abfd, filehdr_in->pe.e_oeminfo,
791 (bfd_byte *) filehdr_out->e_oeminfo);
794 for (idx=0; idx < 10; idx++)
795 bfd_h_put_16(abfd, filehdr_in->pe.e_res2[idx],
796 (bfd_byte *) filehdr_out->e_res2[idx]);
798 bfd_h_put_32(abfd, filehdr_in->pe.e_lfanew, (bfd_byte *) filehdr_out->e_lfanew);
802 for (idx=0; idx < 16; idx++)
803 bfd_h_put_32(abfd, filehdr_in->pe.dos_message[idx],
804 (bfd_byte *) filehdr_out->dos_message[idx]);
807 /* also put in the NT signature */
808 bfd_h_put_32(abfd, filehdr_in->pe.nt_signature,
809 (bfd_byte *) filehdr_out->nt_signature);
818 _bfd_pe_only_swap_filehdr_out (abfd, in, out)
823 struct internal_filehdr *filehdr_in = (struct internal_filehdr *)in;
824 FILHDR *filehdr_out = (FILHDR *)out;
826 bfd_h_put_16(abfd, filehdr_in->f_magic, (bfd_byte *) filehdr_out->f_magic);
827 bfd_h_put_16(abfd, filehdr_in->f_nscns, (bfd_byte *) filehdr_out->f_nscns);
828 bfd_h_put_32(abfd, filehdr_in->f_timdat, (bfd_byte *) filehdr_out->f_timdat);
829 PUT_FILEHDR_SYMPTR (abfd, (bfd_vma) filehdr_in->f_symptr,
830 (bfd_byte *) filehdr_out->f_symptr);
831 bfd_h_put_32(abfd, filehdr_in->f_nsyms, (bfd_byte *) filehdr_out->f_nsyms);
832 bfd_h_put_16(abfd, filehdr_in->f_opthdr, (bfd_byte *) filehdr_out->f_opthdr);
833 bfd_h_put_16(abfd, filehdr_in->f_flags, (bfd_byte *) filehdr_out->f_flags);
839 _bfd_pei_swap_scnhdr_out (abfd, in, out)
844 struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *)in;
845 SCNHDR *scnhdr_ext = (SCNHDR *)out;
846 unsigned int ret = SCNHSZ;
850 memcpy(scnhdr_ext->s_name, scnhdr_int->s_name, sizeof(scnhdr_int->s_name));
852 PUT_SCNHDR_VADDR (abfd,
853 ((scnhdr_int->s_vaddr
854 - pe_data(abfd)->pe_opthdr.ImageBase)
856 (bfd_byte *) scnhdr_ext->s_vaddr);
858 /* NT wants the size data to be rounded up to the next NT_FILE_ALIGNMENT
859 value except for the BSS section, its s_size should be 0 */
862 if (strcmp (scnhdr_int->s_name, _BSS) == 0)
864 ps = scnhdr_int->s_size;
869 ps = scnhdr_int->s_paddr;
870 ss = scnhdr_int->s_size;
873 PUT_SCNHDR_SIZE (abfd, ss,
874 (bfd_byte *) scnhdr_ext->s_size);
877 PUT_SCNHDR_PADDR (abfd, ps, (bfd_byte *) scnhdr_ext->s_paddr);
879 PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr,
880 (bfd_byte *) scnhdr_ext->s_scnptr);
881 PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr,
882 (bfd_byte *) scnhdr_ext->s_relptr);
883 PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr,
884 (bfd_byte *) scnhdr_ext->s_lnnoptr);
886 /* Extra flags must be set when dealing with NT. All sections should also
887 have the IMAGE_SCN_MEM_READ (0x40000000) flag set. In addition, the
888 .text section must have IMAGE_SCN_MEM_EXECUTE (0x20000000) and the data
889 sections (.idata, .data, .bss, .CRT) must have IMAGE_SCN_MEM_WRITE set
890 (this is especially important when dealing with the .idata section since
891 the addresses for routines from .dlls must be overwritten). If .reloc
892 section data is ever generated, we must add IMAGE_SCN_MEM_DISCARDABLE
893 (0x02000000). Also, the resource data should also be read and
896 /* FIXME: alignment is also encoded in this field, at least on ppc (krk) */
897 /* FIXME: even worse, I don't see how to get the original alignment field*/
900 /* FIXME: Basing this on section names is bogus. Also, this should
901 be in sec_to_styp_flags. */
904 int flags = scnhdr_int->s_flags;
905 if (strcmp (scnhdr_int->s_name, ".data") == 0 ||
906 strcmp (scnhdr_int->s_name, ".CRT") == 0 ||
907 strcmp (scnhdr_int->s_name, ".bss") == 0)
908 flags |= IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE;
909 else if (strcmp (scnhdr_int->s_name, ".text") == 0)
910 flags |= IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_EXECUTE;
911 else if (strcmp (scnhdr_int->s_name, ".reloc") == 0)
912 flags = (SEC_DATA | IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_DISCARDABLE
913 | IMAGE_SCN_MEM_SHARED);
914 else if (strcmp (scnhdr_int->s_name, ".idata") == 0)
915 flags = IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE | SEC_DATA;
916 else if (strcmp (scnhdr_int->s_name, ".rdata") == 0
917 || strcmp (scnhdr_int->s_name, ".edata") == 0)
918 flags = IMAGE_SCN_MEM_READ | SEC_DATA;
919 else if (strcmp (scnhdr_int->s_name, ".pdata") == 0)
920 flags = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_4BYTES |
922 /* Remember this field is a max of 8 chars, so the null is _not_ there
923 for an 8 character name like ".reldata". (yep. Stupid bug) */
924 else if (strncmp (scnhdr_int->s_name, ".reldata", 8) == 0)
925 flags = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_8BYTES |
926 IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE ;
927 else if (strcmp (scnhdr_int->s_name, ".ydata") == 0)
928 flags = IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_ALIGN_8BYTES |
929 IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_WRITE ;
930 else if (strncmp (scnhdr_int->s_name, ".drectve", 8) == 0)
931 flags = IMAGE_SCN_LNK_INFO | IMAGE_SCN_LNK_REMOVE ;
932 else if (strncmp (scnhdr_int->s_name, ".stab", 5) == 0)
933 flags |= (IMAGE_SCN_LNK_INFO | IMAGE_SCN_MEM_DISCARDABLE
934 | IMAGE_SCN_MEM_SHARED | IMAGE_SCN_MEM_READ);
935 else if (strcmp (scnhdr_int->s_name, ".rsrc") == 0)
936 flags |= IMAGE_SCN_MEM_READ | IMAGE_SCN_MEM_SHARED;
939 flags |= IMAGE_SCN_MEM_READ;
940 if (! (flags & SEC_READONLY))
941 flags |= IMAGE_SCN_MEM_WRITE;
942 if (flags & SEC_SHARED)
943 flags |= IMAGE_SCN_MEM_SHARED;
946 bfd_h_put_32(abfd, flags, (bfd_byte *) scnhdr_ext->s_flags);
949 if (scnhdr_int->s_nlnno <= 0xffff)
950 bfd_h_put_16(abfd, scnhdr_int->s_nlnno, (bfd_byte *) scnhdr_ext->s_nlnno);
953 (*_bfd_error_handler) (_("%s: line number overflow: 0x%lx > 0xffff"),
954 bfd_get_filename (abfd),
955 scnhdr_int->s_nlnno);
956 bfd_set_error (bfd_error_file_truncated);
957 bfd_h_put_16 (abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nlnno);
960 if (scnhdr_int->s_nreloc <= 0xffff)
961 bfd_h_put_16(abfd, scnhdr_int->s_nreloc, (bfd_byte *) scnhdr_ext->s_nreloc);
964 (*_bfd_error_handler) (_("%s: reloc overflow: 0x%lx > 0xffff"),
965 bfd_get_filename (abfd),
966 scnhdr_int->s_nreloc);
967 bfd_set_error (bfd_error_file_truncated);
968 bfd_h_put_16 (abfd, 0xffff, (bfd_byte *) scnhdr_ext->s_nreloc);
974 static char * dir_names[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] =
976 N_ ("Export Directory [.edata (or where ever we found it)]"),
977 N_ ("Import Directory [parts of .idata]"),
978 N_ ("Resource Directory [.rsrc]"),
979 N_ ("Exception Directory [.pdata]"),
980 N_ ("Security Directory"),
981 N_ ("Base Relocation Directory [.reloc]"),
982 N_ ("Debug Directory"),
983 N_ ("Description Directory"),
984 N_ ("Special Directory"),
985 N_ ("Thread Storage Directory [.tls]"),
986 N_ ("Load Configuration Directory"),
987 N_ ("Bound Import Directory"),
988 N_ ("Import Address Table Directory"),
994 /**********************************************************************/
996 /* The code for the PPC really falls in the "architecture dependent"
997 category. However, it's not clear that anyone will ever care, so
998 we're ignoring the issue for now; if/when PPC matters, some of this
999 may need to go into peicode.h, or arguments passed to enable the
1000 PPC- specific code. */
1003 /**********************************************************************/
1005 pe_print_idata(abfd, vfile)
1009 FILE *file = (FILE *) vfile;
1011 asection *section = bfd_get_section_by_name (abfd, ".idata");
1014 #ifdef POWERPC_LE_PE
1015 asection *rel_section = bfd_get_section_by_name (abfd, ".reldata");
1018 bfd_size_type datasize;
1019 bfd_size_type dataoff;
1020 bfd_size_type secsize;
1022 bfd_size_type start, stop;
1025 pe_data_type *pe = pe_data (abfd);
1026 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1028 if (section != NULL)
1030 datasize = bfd_section_size (abfd, section);
1040 addr = extra->DataDirectory[1].VirtualAddress;
1041 size = extra->DataDirectory[1].Size;
1043 if (addr == 0 || size == 0)
1046 for (section = abfd->sections; section != NULL; section = section->next)
1048 if (section->vma - extra->ImageBase <= addr
1049 && ((section->vma - extra->ImageBase
1050 + bfd_section_size (abfd, section))
1054 if (section == NULL)
1057 /* For some reason the import table size is not reliable. The
1058 import data will extend past the indicated size, and before
1059 the indicated address. */
1060 dataoff = addr - (section->vma - extra->ImageBase);
1064 #ifdef POWERPC_LE_PE
1065 if (rel_section != 0 && bfd_section_size (abfd, rel_section) != 0)
1067 /* The toc address can be found by taking the starting address,
1068 which on the PPC locates a function descriptor. The
1069 descriptor consists of the function code starting address
1070 followed by the address of the toc. The starting address we
1071 get from the bfd, and the descriptor is supposed to be in the
1072 .reldata section. */
1074 bfd_vma loadable_toc_address;
1075 bfd_vma toc_address;
1076 bfd_vma start_address;
1079 data = (bfd_byte *) bfd_malloc ((size_t) bfd_section_size (abfd,
1081 if (data == NULL && bfd_section_size (abfd, rel_section) != 0)
1084 datasize = bfd_section_size (abfd, rel_section);
1086 bfd_get_section_contents (abfd,
1089 bfd_section_size (abfd, rel_section));
1091 offset = abfd->start_address - rel_section->vma;
1093 start_address = bfd_get_32(abfd, data+offset);
1094 loadable_toc_address = bfd_get_32(abfd, data+offset+4);
1095 toc_address = loadable_toc_address - 32768;
1098 _("\nFunction descriptor located at the start address: %04lx\n"),
1099 (unsigned long int) (abfd->start_address));
1101 _("\tcode-base %08lx toc (loadable/actual) %08lx/%08lx\n"),
1102 start_address, loadable_toc_address, toc_address);
1107 _("\nNo reldata section! Function descriptor not decoded.\n"));
1112 _("\nThe Import Tables (interpreted .idata section contents)\n"));
1114 _(" vma: Hint Time Forward DLL First\n"));
1116 _(" Table Stamp Chain Name Thunk\n"));
1118 secsize = bfd_section_size (abfd, section);
1119 data = (bfd_byte *) bfd_malloc (secsize);
1120 if (data == NULL && secsize != 0)
1123 if (! bfd_get_section_contents (abfd, section, (PTR) data, 0, secsize))
1126 adj = (extra->ImageBase - section->vma) & 0xffffffff;
1129 stop = dataoff + datasize;
1130 for (i = start; i < stop; i += onaline)
1134 bfd_vma forward_chain;
1136 bfd_vma first_thunk;
1143 (unsigned long int) (i + section->vma + dataoff));
1151 hint_addr = bfd_get_32(abfd, data+i);
1152 time_stamp = bfd_get_32(abfd, data+i+4);
1153 forward_chain = bfd_get_32(abfd, data+i+8);
1154 dll_name = bfd_get_32(abfd, data+i+12);
1155 first_thunk = bfd_get_32(abfd, data+i+16);
1157 fprintf(file, "%08lx %08lx %08lx %08lx %08lx\n",
1164 if (hint_addr == 0 && first_thunk == 0)
1167 /* the image base is present in the section->vma */
1168 dll = (char *) data + dll_name + adj;
1169 fprintf(file, _("\n\tDLL Name: %s\n"), dll);
1173 fprintf (file, _("\tvma: Hint/Ord Member-Name\n"));
1175 idx = hint_addr + adj;
1177 for (j = 0; j < stop; j += 4)
1179 unsigned long member = bfd_get_32 (abfd, data + idx + j);
1183 if (member & 0x80000000)
1184 fprintf (file, "\t%04lx\t %4lu", member,
1185 member & 0x7fffffff);
1191 ordinal = bfd_get_16 (abfd, data + member + adj);
1192 member_name = (char *) data + member + adj + 2;
1193 fprintf (file, "\t%04lx\t %4d %s",
1194 member, ordinal, member_name);
1197 /* If the time stamp is not zero, the import address
1198 table holds actual addresses. */
1201 && first_thunk != hint_addr)
1202 fprintf (file, "\t%04lx",
1203 bfd_get_32 (abfd, data + first_thunk + adj + j));
1205 fprintf (file, "\n");
1209 if (hint_addr != first_thunk && time_stamp == 0)
1214 idx2 = first_thunk + adj;
1216 for (j=0;j<stop;j+=4)
1220 bfd_vma hint_member = 0;
1224 hint_member = bfd_get_32 (abfd, data + idx + j);
1225 iat_member = bfd_get_32 (abfd, data + idx2 + j);
1227 if (hint_addr == 0 && iat_member == 0)
1230 if (hint_addr == 0 || hint_member != iat_member)
1235 _("\tThe Import Address Table (difference found)\n"));
1236 fprintf(file, _("\tvma: Hint/Ord Member-Name\n"));
1239 if (iat_member == 0)
1242 _("\t>>> Ran out of IAT members!\n"));
1246 ordinal = bfd_get_16(abfd,
1247 data + iat_member + adj);
1248 member_name = (char *) data + iat_member + adj + 2;
1249 fprintf(file, "\t%04lx\t %4d %s\n",
1250 iat_member, ordinal, member_name);
1254 if (hint_addr != 0 && hint_member == 0)
1260 _("\tThe Import Address Table is identical\n"));
1264 fprintf(file, "\n");
1274 pe_print_edata (abfd, vfile)
1278 FILE *file = (FILE *) vfile;
1280 asection *section = bfd_get_section_by_name (abfd, ".edata");
1282 bfd_size_type datasize;
1283 bfd_size_type dataoff;
1289 long export_flags; /* reserved - should be zero */
1293 bfd_vma name; /* rva - relative to image base */
1294 long base; /* ordinal base */
1295 unsigned long num_functions; /* Number in the export address table */
1296 unsigned long num_names; /* Number in the name pointer table */
1297 bfd_vma eat_addr; /* rva to the export address table */
1298 bfd_vma npt_addr; /* rva to the Export Name Pointer Table */
1299 bfd_vma ot_addr; /* rva to the Ordinal Table */
1302 pe_data_type *pe = pe_data (abfd);
1303 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1305 if (section != NULL)
1307 datasize = bfd_section_size (abfd, section);
1314 addr = extra->DataDirectory[0].VirtualAddress;
1315 size = extra->DataDirectory[0].Size;
1317 if (addr == 0 || size == 0)
1320 for (section = abfd->sections; section != NULL; section = section->next)
1322 if (section->vma - extra->ImageBase <= addr
1323 && ((section->vma - extra->ImageBase
1324 + bfd_section_size (abfd, section))
1328 if (section == NULL)
1332 dataoff = addr - (section->vma - extra->ImageBase);
1335 data = (bfd_byte *) bfd_malloc (datasize);
1336 if (data == NULL && datasize != 0)
1339 if (! bfd_get_section_contents (abfd, section, (PTR) data, dataoff,
1343 /* Go get Export Directory Table */
1344 edt.export_flags = bfd_get_32(abfd, data+0);
1345 edt.time_stamp = bfd_get_32(abfd, data+4);
1346 edt.major_ver = bfd_get_16(abfd, data+8);
1347 edt.minor_ver = bfd_get_16(abfd, data+10);
1348 edt.name = bfd_get_32(abfd, data+12);
1349 edt.base = bfd_get_32(abfd, data+16);
1350 edt.num_functions = bfd_get_32(abfd, data+20);
1351 edt.num_names = bfd_get_32(abfd, data+24);
1352 edt.eat_addr = bfd_get_32(abfd, data+28);
1353 edt.npt_addr = bfd_get_32(abfd, data+32);
1354 edt.ot_addr = bfd_get_32(abfd, data+36);
1356 adj = (extra->ImageBase - (section->vma + dataoff)) & 0xffffffff;
1358 /* Dump the EDT first first */
1360 _("\nThe Export Tables (interpreted .edata section contents)\n\n"));
1363 _("Export Flags \t\t\t%lx\n"), (unsigned long) edt.export_flags);
1366 _("Time/Date stamp \t\t%lx\n"), (unsigned long) edt.time_stamp);
1369 _("Major/Minor \t\t\t%d/%d\n"), edt.major_ver, edt.minor_ver);
1372 _("Name \t\t\t\t"));
1373 fprintf_vma (file, edt.name);
1375 " %s\n", data + edt.name + adj);
1378 _("Ordinal Base \t\t\t%ld\n"), edt.base);
1384 _("\tExport Address Table \t\t%lx\n"),
1388 _("\t[Name Pointer/Ordinal] Table\t%lu\n"), edt.num_names);
1391 _("Table Addresses\n"));
1394 _("\tExport Address Table \t\t"));
1395 fprintf_vma (file, edt.eat_addr);
1396 fprintf (file, "\n");
1399 _("\tName Pointer Table \t\t"));
1400 fprintf_vma (file, edt.npt_addr);
1401 fprintf (file, "\n");
1404 _("\tOrdinal Table \t\t\t"));
1405 fprintf_vma (file, edt.ot_addr);
1406 fprintf (file, "\n");
1409 /* The next table to find si the Export Address Table. It's basically
1410 a list of pointers that either locate a function in this dll, or
1411 forward the call to another dll. Something like:
1416 } export_address_table_entry;
1420 _("\nExport Address Table -- Ordinal Base %ld\n"),
1423 for (i = 0; i < edt.num_functions; ++i)
1425 bfd_vma eat_member = bfd_get_32 (abfd,
1426 data + edt.eat_addr + (i * 4) + adj);
1427 bfd_vma eat_actual = (extra->ImageBase + eat_member) & 0xffffffff;
1428 bfd_vma edata_start = bfd_get_section_vma (abfd,section) + dataoff;
1429 bfd_vma edata_end = edata_start + datasize;
1431 if (eat_member == 0)
1434 if (edata_start < eat_actual && eat_actual < edata_end)
1436 /* this rva is to a name (forwarding function) in our section */
1437 /* Should locate a function descriptor */
1439 "\t[%4ld] +base[%4ld] %04lx %s -- %s\n",
1440 (long) i, (long) (i + edt.base), eat_member,
1441 "Forwarder RVA", data + eat_member + adj);
1445 /* Should locate a function descriptor in the reldata section */
1447 "\t[%4ld] +base[%4ld] %04lx %s\n",
1448 (long) i, (long) (i + edt.base), eat_member, "Export RVA");
1452 /* The Export Name Pointer Table is paired with the Export Ordinal Table */
1453 /* Dump them in parallel for clarity */
1455 _("\n[Ordinal/Name Pointer] Table\n"));
1457 for (i = 0; i < edt.num_names; ++i)
1459 bfd_vma name_ptr = bfd_get_32(abfd,
1464 char *name = (char *) data + name_ptr + adj;
1466 bfd_vma ord = bfd_get_16(abfd,
1471 "\t[%4ld] %s\n", (long) ord, name);
1481 pe_print_pdata (abfd, vfile)
1485 FILE *file = (FILE *) vfile;
1487 asection *section = bfd_get_section_by_name (abfd, ".pdata");
1488 bfd_size_type datasize = 0;
1490 bfd_size_type start, stop;
1496 stop = bfd_section_size (abfd, section);
1497 if ((stop % onaline) != 0)
1498 fprintf (file, _("Warning, .pdata section size (%ld) is not a multiple of %d\n"),
1499 (long)stop, onaline);
1502 _("\nThe Function Table (interpreted .pdata section contents)\n"));
1504 _(" vma:\t\tBegin End EH EH PrologEnd\n"));
1506 _(" \t\tAddress Address Handler Data Address\n"));
1508 if (bfd_section_size (abfd, section) == 0)
1511 data = (bfd_byte *) bfd_malloc ((size_t) bfd_section_size (abfd, section));
1512 datasize = bfd_section_size (abfd, section);
1513 if (data == NULL && datasize != 0)
1516 bfd_get_section_contents (abfd,
1519 bfd_section_size (abfd, section));
1523 for (i = start; i < stop; i += onaline)
1529 bfd_vma prolog_end_addr;
1534 begin_addr = bfd_get_32(abfd, data+i);
1535 end_addr = bfd_get_32(abfd, data+i+4);
1536 eh_handler = bfd_get_32(abfd, data+i+8);
1537 eh_data = bfd_get_32(abfd, data+i+12);
1538 prolog_end_addr = bfd_get_32(abfd, data+i+16);
1540 if (begin_addr == 0 && end_addr == 0 && eh_handler == 0
1541 && eh_data == 0 && prolog_end_addr == 0)
1543 /* We are probably into the padding of the section now. */
1549 (unsigned long int) (i + section->vma));
1551 fprintf(file, "%08lx %08lx %08lx %08lx %08lx",
1558 #ifdef POWERPC_LE_PE
1559 if (eh_handler == 0 && eh_data != 0)
1561 /* Special bits here, although the meaning may */
1562 /* be a little mysterious. The only one I know */
1563 /* for sure is 0x03. */
1564 /* Code Significance */
1566 /* 0x01 Register Save Millicode */
1567 /* 0x02 Register Restore Millicode */
1568 /* 0x03 Glue Code Sequence */
1572 fprintf(file, _(" Register save millicode"));
1575 fprintf(file, _(" Register restore millicode"));
1578 fprintf(file, _(" Glue code sequence"));
1585 fprintf(file, "\n");
1593 static const char *tbl[6] =
1604 pe_print_reloc (abfd, vfile)
1608 FILE *file = (FILE *) vfile;
1610 asection *section = bfd_get_section_by_name (abfd, ".reloc");
1611 bfd_size_type datasize = 0;
1613 bfd_size_type start, stop;
1618 if (bfd_section_size (abfd, section) == 0)
1622 _("\n\nPE File Base Relocations (interpreted .reloc section contents)\n"));
1624 data = (bfd_byte *) bfd_malloc ((size_t) bfd_section_size (abfd, section));
1625 datasize = bfd_section_size (abfd, section);
1626 if (data == NULL && datasize != 0)
1629 bfd_get_section_contents (abfd,
1632 bfd_section_size (abfd, section));
1636 stop = bfd_section_size (abfd, section);
1638 for (i = start; i < stop;)
1641 bfd_vma virtual_address;
1644 /* The .reloc section is a sequence of blocks, with a header consisting
1645 of two 32 bit quantities, followed by a number of 16 bit entries */
1647 virtual_address = bfd_get_32(abfd, data+i);
1648 size = bfd_get_32(abfd, data+i+4);
1649 number = (size - 8) / 2;
1657 _("\nVirtual Address: %08lx Chunk size %ld (0x%lx) Number of fixups %ld\n"),
1658 virtual_address, size, size, number);
1660 for (j = 0; j < number; ++j)
1662 unsigned short e = bfd_get_16(abfd, data + i + 8 + j*2);
1663 int t = (e & 0xF000) >> 12;
1664 int off = e & 0x0FFF;
1670 _("\treloc %4d offset %4x [%4lx] %s\n"),
1671 j, off, (long) (off + virtual_address), tbl[t]);
1682 /* Print out the program headers. */
1685 _bfd_pe_print_private_bfd_data_common (abfd, vfile)
1689 FILE *file = (FILE *) vfile;
1691 pe_data_type *pe = pe_data (abfd);
1692 struct internal_extra_pe_aouthdr *i = &pe->pe_opthdr;
1694 /* The MS dumpbin program reportedly ands with 0xff0f before
1695 printing the characteristics field. Not sure why. No reason to
1697 fprintf (file, _("\nCharacteristics 0x%x\n"), pe->real_flags);
1699 #define PF(x, y) if (pe->real_flags & x) { fprintf (file, "\t%s\n", y); }
1700 PF (F_RELFLG, "relocations stripped");
1701 PF (F_EXEC, "executable");
1702 PF (F_LNNO, "line numbers stripped");
1703 PF (F_LSYMS, "symbols stripped");
1704 PF (0x80, "little endian");
1705 PF (F_AR32WR, "32 bit words");
1706 PF (0x200, "debugging information removed");
1707 PF (0x1000, "system file");
1709 PF (0x8000, "big endian");
1712 fprintf (file,"\nImageBase\t\t");
1713 fprintf_vma (file, i->ImageBase);
1714 fprintf (file,"\nSectionAlignment\t");
1715 fprintf_vma (file, i->SectionAlignment);
1716 fprintf (file,"\nFileAlignment\t\t");
1717 fprintf_vma (file, i->FileAlignment);
1718 fprintf (file,"\nMajorOSystemVersion\t%d\n", i->MajorOperatingSystemVersion);
1719 fprintf (file,"MinorOSystemVersion\t%d\n", i->MinorOperatingSystemVersion);
1720 fprintf (file,"MajorImageVersion\t%d\n", i->MajorImageVersion);
1721 fprintf (file,"MinorImageVersion\t%d\n", i->MinorImageVersion);
1722 fprintf (file,"MajorSubsystemVersion\t%d\n", i->MajorSubsystemVersion);
1723 fprintf (file,"MinorSubsystemVersion\t%d\n", i->MinorSubsystemVersion);
1724 fprintf (file,"Reserved1\t\t%08lx\n", i->Reserved1);
1725 fprintf (file,"SizeOfImage\t\t%08lx\n", i->SizeOfImage);
1726 fprintf (file,"SizeOfHeaders\t\t%08lx\n", i->SizeOfHeaders);
1727 fprintf (file,"CheckSum\t\t%08lx\n", i->CheckSum);
1728 fprintf (file,"Subsystem\t\t%08x\n", i->Subsystem);
1729 fprintf (file,"DllCharacteristics\t%08x\n", i->DllCharacteristics);
1730 fprintf (file,"SizeOfStackReserve\t");
1731 fprintf_vma (file, i->SizeOfStackReserve);
1732 fprintf (file,"\nSizeOfStackCommit\t");
1733 fprintf_vma (file, i->SizeOfStackCommit);
1734 fprintf (file,"\nSizeOfHeapReserve\t");
1735 fprintf_vma (file, i->SizeOfHeapReserve);
1736 fprintf (file,"\nSizeOfHeapCommit\t");
1737 fprintf_vma (file, i->SizeOfHeapCommit);
1738 fprintf (file,"\nLoaderFlags\t\t%08lx\n", i->LoaderFlags);
1739 fprintf (file,"NumberOfRvaAndSizes\t%08lx\n", i->NumberOfRvaAndSizes);
1741 fprintf (file,"\nThe Data Directory\n");
1742 for (j = 0; j < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; j++)
1744 fprintf (file, "Entry %1x ", j);
1745 fprintf_vma (file, i->DataDirectory[j].VirtualAddress);
1746 fprintf (file, " %08lx ", i->DataDirectory[j].Size);
1747 fprintf (file, "%s\n", dir_names[j]);
1750 pe_print_idata (abfd, vfile);
1751 pe_print_edata (abfd, vfile);
1752 pe_print_pdata (abfd, vfile);
1753 pe_print_reloc (abfd, vfile);
1758 /* Copy any private info we understand from the input bfd
1759 to the output bfd. */
1762 _bfd_pe_bfd_copy_private_bfd_data_common (ibfd, obfd)
1765 /* One day we may try to grok other private data. */
1766 if (ibfd->xvec->flavour != bfd_target_coff_flavour
1767 || obfd->xvec->flavour != bfd_target_coff_flavour)
1770 pe_data (obfd)->pe_opthdr = pe_data (ibfd)->pe_opthdr;
1771 pe_data (obfd)->dll = pe_data (ibfd)->dll;
1776 /* Copy private section data. */
1778 _bfd_pe_bfd_copy_private_section_data (ibfd, isec, obfd, osec)
1784 if (bfd_get_flavour (ibfd) != bfd_target_coff_flavour
1785 || bfd_get_flavour (obfd) != bfd_target_coff_flavour)
1788 if (coff_section_data (ibfd, isec) != NULL
1789 && pei_section_data (ibfd, isec) != NULL)
1791 if (coff_section_data (obfd, osec) == NULL)
1794 (PTR) bfd_zalloc (obfd, sizeof (struct coff_section_tdata));
1795 if (osec->used_by_bfd == NULL)
1798 if (pei_section_data (obfd, osec) == NULL)
1800 coff_section_data (obfd, osec)->tdata =
1801 (PTR) bfd_zalloc (obfd, sizeof (struct pei_section_tdata));
1802 if (coff_section_data (obfd, osec)->tdata == NULL)
1805 pei_section_data (obfd, osec)->virt_size =
1806 pei_section_data (ibfd, isec)->virt_size;
1813 _bfd_pe_get_symbol_info (abfd, symbol, ret)
1818 coff_get_symbol_info (abfd, symbol, ret);
1820 if (pe_data (abfd) != NULL
1821 && ((symbol->flags & BSF_DEBUGGING) == 0
1822 || (symbol->flags & BSF_DEBUGGING_RELOC) != 0)
1823 && ! bfd_is_abs_section (symbol->section))
1824 ret->value += pe_data (abfd)->pe_opthdr.ImageBase;