1 /* Support for the generic parts of PE/PEI; the common executable parts.
2 Copyright (C) 1995-2014 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 3 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., 51 Franklin Street - Fifth Floor, Boston,
20 MA 02110-1301, USA. */
23 /* Most of this hacked by Steve Chamberlain <sac@cygnus.com>.
25 PE/PEI rearrangement (and code added): Donn Terry
26 Softway Systems, Inc. */
28 /* Hey look, some documentation [and in a place you expect to find it]!
30 The main reference for the pei format is "Microsoft Portable Executable
31 and Common Object File Format Specification 4.1". Get it if you need to
32 do some serious hacking on this code.
35 "Peering Inside the PE: A Tour of the Win32 Portable Executable
36 File Format", MSJ 1994, Volume 9.
38 The *sole* difference between the pe format and the pei format is that the
39 latter has an MSDOS 2.0 .exe header on the front that prints the message
40 "This app must be run under Windows." (or some such).
41 (FIXME: Whether that statement is *really* true or not is unknown.
42 Are there more subtle differences between pe and pei formats?
43 For now assume there aren't. If you find one, then for God sakes
46 The Microsoft docs use the word "image" instead of "executable" because
47 the former can also refer to a DLL (shared library). Confusion can arise
48 because the `i' in `pei' also refers to "image". The `pe' format can
49 also create images (i.e. executables), it's just that to run on a win32
50 system you need to use the pei format.
52 FIXME: Please add more docs here so the next poor fool that has to hack
53 on this code has a chance of getting something accomplished without
54 wasting too much time. */
56 /* This expands into COFF_WITH_pe, COFF_WITH_pep, or COFF_WITH_pex64
57 depending on whether we're compiling for straight PE or PE+. */
63 #include "coff/internal.h"
69 /* NOTE: it's strange to be including an architecture specific header
70 in what's supposed to be general (to PE/PEI) code. However, that's
71 where the definitions are, and they don't vary per architecture
72 within PE/PEI, so we get them from there. FIXME: The lack of
73 variance is an assumption which may prove to be incorrect if new
74 PE/PEI targets are created. */
75 #if defined COFF_WITH_pex64
76 # include "coff/x86_64.h"
77 #elif defined COFF_WITH_pep
78 # include "coff/ia64.h"
80 # include "coff/i386.h"
86 #include "safe-ctype.h"
88 #if defined COFF_WITH_pep || defined COFF_WITH_pex64
90 # define AOUTSZ PEPAOUTSZ
91 # define PEAOUTHDR PEPAOUTHDR
94 #define HighBitSet(val) ((val) & 0x80000000)
95 #define SetHighBit(val) ((val) | 0x80000000)
96 #define WithoutHighBit(val) ((val) & 0x7fffffff)
98 /* FIXME: This file has various tests of POWERPC_LE_PE. Those tests
99 worked when the code was in peicode.h, but no longer work now that
100 the code is in peigen.c. PowerPC NT is said to be dead. If
101 anybody wants to revive the code, you will have to figure out how
102 to handle those issues. */
105 _bfd_XXi_swap_sym_in (bfd * abfd, void * ext1, void * in1)
107 SYMENT *ext = (SYMENT *) ext1;
108 struct internal_syment *in = (struct internal_syment *) in1;
110 if (ext->e.e_name[0] == 0)
112 in->_n._n_n._n_zeroes = 0;
113 in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e.e.e_offset);
116 memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN);
118 in->n_value = H_GET_32 (abfd, ext->e_value);
119 in->n_scnum = H_GET_16 (abfd, ext->e_scnum);
121 if (sizeof (ext->e_type) == 2)
122 in->n_type = H_GET_16 (abfd, ext->e_type);
124 in->n_type = H_GET_32 (abfd, ext->e_type);
126 in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
127 in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
129 #ifndef STRICT_PE_FORMAT
130 /* This is for Gnu-created DLLs. */
132 /* The section symbols for the .idata$ sections have class 0x68
133 (C_SECTION), which MS documentation indicates is a section
134 symbol. Unfortunately, the value field in the symbol is simply a
135 copy of the .idata section's flags rather than something useful.
136 When these symbols are encountered, change the value to 0 so that
137 they will be handled somewhat correctly in the bfd code. */
138 if (in->n_sclass == C_SECTION)
140 char namebuf[SYMNMLEN + 1];
141 const char *name = NULL;
145 /* Create synthetic empty sections as needed. DJ */
146 if (in->n_scnum == 0)
150 name = _bfd_coff_internal_syment_name (abfd, in, namebuf);
152 /* FIXME: Return error. */
154 sec = bfd_get_section_by_name (abfd, name);
156 in->n_scnum = sec->target_index;
159 if (in->n_scnum == 0)
161 int unused_section_number = 0;
165 for (sec = abfd->sections; sec; sec = sec->next)
166 if (unused_section_number <= sec->target_index)
167 unused_section_number = sec->target_index + 1;
171 name = (const char *) bfd_alloc (abfd, strlen (namebuf) + 1);
173 /* FIXME: Return error. */
175 strcpy ((char *) name, namebuf);
177 flags = SEC_HAS_CONTENTS | SEC_ALLOC | SEC_DATA | SEC_LOAD;
178 sec = bfd_make_section_anyway_with_flags (abfd, name, flags);
180 /* FIXME: Return error. */
187 sec->rel_filepos = 0;
188 sec->reloc_count = 0;
189 sec->line_filepos = 0;
190 sec->lineno_count = 0;
191 sec->userdata = NULL;
193 sec->alignment_power = 2;
195 sec->target_index = unused_section_number;
197 in->n_scnum = unused_section_number;
199 in->n_sclass = C_STAT;
203 #ifdef coff_swap_sym_in_hook
204 /* This won't work in peigen.c, but since it's for PPC PE, it's not
206 coff_swap_sym_in_hook (abfd, ext1, in1);
211 abs_finder (bfd * abfd ATTRIBUTE_UNUSED, asection * sec, void * data)
213 bfd_vma abs_val = * (bfd_vma *) data;
215 return (sec->vma <= abs_val) && ((sec->vma + (1ULL << 32)) > abs_val);
219 _bfd_XXi_swap_sym_out (bfd * abfd, void * inp, void * extp)
221 struct internal_syment *in = (struct internal_syment *) inp;
222 SYMENT *ext = (SYMENT *) extp;
224 if (in->_n._n_name[0] == 0)
226 H_PUT_32 (abfd, 0, ext->e.e.e_zeroes);
227 H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e.e.e_offset);
230 memcpy (ext->e.e_name, in->_n._n_name, SYMNMLEN);
232 /* The PE32 and PE32+ formats only use 4 bytes to hold the value of a
233 symbol. This is a problem on 64-bit targets where we can generate
234 absolute symbols with values >= 1^32. We try to work around this
235 problem by finding a section whose base address is sufficient to
236 reduce the absolute value to < 1^32, and then transforming the
237 symbol into a section relative symbol. This of course is a hack. */
238 if (sizeof (in->n_value) > 4
239 /* The strange computation of the shift amount is here in order to
240 avoid a compile time warning about the comparison always being
241 false. It does not matter if this test fails to work as expected
242 as the worst that can happen is that some absolute symbols are
243 needlessly converted into section relative symbols. */
244 && in->n_value > ((1ULL << (sizeof (in->n_value) > 4 ? 32 : 31)) - 1)
245 && in->n_scnum == -1)
249 sec = bfd_sections_find_if (abfd, abs_finder, & in->n_value);
252 in->n_value -= sec->vma;
253 in->n_scnum = sec->target_index;
255 /* else: FIXME: The value is outside the range of any section. This
256 happens for __image_base__ and __ImageBase and maybe some other
257 symbols as well. We should find a way to handle these values. */
260 H_PUT_32 (abfd, in->n_value, ext->e_value);
261 H_PUT_16 (abfd, in->n_scnum, ext->e_scnum);
263 if (sizeof (ext->e_type) == 2)
264 H_PUT_16 (abfd, in->n_type, ext->e_type);
266 H_PUT_32 (abfd, in->n_type, ext->e_type);
268 H_PUT_8 (abfd, in->n_sclass, ext->e_sclass);
269 H_PUT_8 (abfd, in->n_numaux, ext->e_numaux);
275 _bfd_XXi_swap_aux_in (bfd * abfd,
279 int indx ATTRIBUTE_UNUSED,
280 int numaux ATTRIBUTE_UNUSED,
283 AUXENT *ext = (AUXENT *) ext1;
284 union internal_auxent *in = (union internal_auxent *) in1;
289 if (ext->x_file.x_fname[0] == 0)
291 in->x_file.x_n.x_zeroes = 0;
292 in->x_file.x_n.x_offset = H_GET_32 (abfd, ext->x_file.x_n.x_offset);
295 memcpy (in->x_file.x_fname, ext->x_file.x_fname, FILNMLEN);
303 in->x_scn.x_scnlen = GET_SCN_SCNLEN (abfd, ext);
304 in->x_scn.x_nreloc = GET_SCN_NRELOC (abfd, ext);
305 in->x_scn.x_nlinno = GET_SCN_NLINNO (abfd, ext);
306 in->x_scn.x_checksum = H_GET_32 (abfd, ext->x_scn.x_checksum);
307 in->x_scn.x_associated = H_GET_16 (abfd, ext->x_scn.x_associated);
308 in->x_scn.x_comdat = H_GET_8 (abfd, ext->x_scn.x_comdat);
314 in->x_sym.x_tagndx.l = H_GET_32 (abfd, ext->x_sym.x_tagndx);
315 in->x_sym.x_tvndx = H_GET_16 (abfd, ext->x_sym.x_tvndx);
317 if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
320 in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR (abfd, ext);
321 in->x_sym.x_fcnary.x_fcn.x_endndx.l = GET_FCN_ENDNDX (abfd, ext);
325 in->x_sym.x_fcnary.x_ary.x_dimen[0] =
326 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
327 in->x_sym.x_fcnary.x_ary.x_dimen[1] =
328 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
329 in->x_sym.x_fcnary.x_ary.x_dimen[2] =
330 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
331 in->x_sym.x_fcnary.x_ary.x_dimen[3] =
332 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
337 in->x_sym.x_misc.x_fsize = H_GET_32 (abfd, ext->x_sym.x_misc.x_fsize);
341 in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO (abfd, ext);
342 in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE (abfd, ext);
347 _bfd_XXi_swap_aux_out (bfd * abfd,
351 int indx ATTRIBUTE_UNUSED,
352 int numaux ATTRIBUTE_UNUSED,
355 union internal_auxent *in = (union internal_auxent *) inp;
356 AUXENT *ext = (AUXENT *) extp;
358 memset (ext, 0, AUXESZ);
363 if (in->x_file.x_fname[0] == 0)
365 H_PUT_32 (abfd, 0, ext->x_file.x_n.x_zeroes);
366 H_PUT_32 (abfd, in->x_file.x_n.x_offset, ext->x_file.x_n.x_offset);
369 memcpy (ext->x_file.x_fname, in->x_file.x_fname, FILNMLEN);
378 PUT_SCN_SCNLEN (abfd, in->x_scn.x_scnlen, ext);
379 PUT_SCN_NRELOC (abfd, in->x_scn.x_nreloc, ext);
380 PUT_SCN_NLINNO (abfd, in->x_scn.x_nlinno, ext);
381 H_PUT_32 (abfd, in->x_scn.x_checksum, ext->x_scn.x_checksum);
382 H_PUT_16 (abfd, in->x_scn.x_associated, ext->x_scn.x_associated);
383 H_PUT_8 (abfd, in->x_scn.x_comdat, ext->x_scn.x_comdat);
389 H_PUT_32 (abfd, in->x_sym.x_tagndx.l, ext->x_sym.x_tagndx);
390 H_PUT_16 (abfd, in->x_sym.x_tvndx, ext->x_sym.x_tvndx);
392 if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
395 PUT_FCN_LNNOPTR (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
396 PUT_FCN_ENDNDX (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.l, ext);
400 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
401 ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
402 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
403 ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
404 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
405 ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
406 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
407 ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
411 H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_sym.x_misc.x_fsize);
414 PUT_LNSZ_LNNO (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext);
415 PUT_LNSZ_SIZE (abfd, in->x_sym.x_misc.x_lnsz.x_size, ext);
422 _bfd_XXi_swap_lineno_in (bfd * abfd, void * ext1, void * in1)
424 LINENO *ext = (LINENO *) ext1;
425 struct internal_lineno *in = (struct internal_lineno *) in1;
427 in->l_addr.l_symndx = H_GET_32 (abfd, ext->l_addr.l_symndx);
428 in->l_lnno = GET_LINENO_LNNO (abfd, ext);
432 _bfd_XXi_swap_lineno_out (bfd * abfd, void * inp, void * outp)
434 struct internal_lineno *in = (struct internal_lineno *) inp;
435 struct external_lineno *ext = (struct external_lineno *) outp;
436 H_PUT_32 (abfd, in->l_addr.l_symndx, ext->l_addr.l_symndx);
438 PUT_LINENO_LNNO (abfd, in->l_lnno, ext);
443 _bfd_XXi_swap_aouthdr_in (bfd * abfd,
447 PEAOUTHDR * src = (PEAOUTHDR *) aouthdr_ext1;
448 AOUTHDR * aouthdr_ext = (AOUTHDR *) aouthdr_ext1;
449 struct internal_aouthdr *aouthdr_int
450 = (struct internal_aouthdr *) aouthdr_int1;
451 struct internal_extra_pe_aouthdr *a = &aouthdr_int->pe;
453 aouthdr_int->magic = H_GET_16 (abfd, aouthdr_ext->magic);
454 aouthdr_int->vstamp = H_GET_16 (abfd, aouthdr_ext->vstamp);
455 aouthdr_int->tsize = GET_AOUTHDR_TSIZE (abfd, aouthdr_ext->tsize);
456 aouthdr_int->dsize = GET_AOUTHDR_DSIZE (abfd, aouthdr_ext->dsize);
457 aouthdr_int->bsize = GET_AOUTHDR_BSIZE (abfd, aouthdr_ext->bsize);
458 aouthdr_int->entry = GET_AOUTHDR_ENTRY (abfd, aouthdr_ext->entry);
459 aouthdr_int->text_start =
460 GET_AOUTHDR_TEXT_START (abfd, aouthdr_ext->text_start);
461 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
462 /* PE32+ does not have data_start member! */
463 aouthdr_int->data_start =
464 GET_AOUTHDR_DATA_START (abfd, aouthdr_ext->data_start);
465 a->BaseOfData = aouthdr_int->data_start;
468 a->Magic = aouthdr_int->magic;
469 a->MajorLinkerVersion = H_GET_8 (abfd, aouthdr_ext->vstamp);
470 a->MinorLinkerVersion = H_GET_8 (abfd, aouthdr_ext->vstamp + 1);
471 a->SizeOfCode = aouthdr_int->tsize ;
472 a->SizeOfInitializedData = aouthdr_int->dsize ;
473 a->SizeOfUninitializedData = aouthdr_int->bsize ;
474 a->AddressOfEntryPoint = aouthdr_int->entry;
475 a->BaseOfCode = aouthdr_int->text_start;
476 a->ImageBase = GET_OPTHDR_IMAGE_BASE (abfd, src->ImageBase);
477 a->SectionAlignment = H_GET_32 (abfd, src->SectionAlignment);
478 a->FileAlignment = H_GET_32 (abfd, src->FileAlignment);
479 a->MajorOperatingSystemVersion =
480 H_GET_16 (abfd, src->MajorOperatingSystemVersion);
481 a->MinorOperatingSystemVersion =
482 H_GET_16 (abfd, src->MinorOperatingSystemVersion);
483 a->MajorImageVersion = H_GET_16 (abfd, src->MajorImageVersion);
484 a->MinorImageVersion = H_GET_16 (abfd, src->MinorImageVersion);
485 a->MajorSubsystemVersion = H_GET_16 (abfd, src->MajorSubsystemVersion);
486 a->MinorSubsystemVersion = H_GET_16 (abfd, src->MinorSubsystemVersion);
487 a->Reserved1 = H_GET_32 (abfd, src->Reserved1);
488 a->SizeOfImage = H_GET_32 (abfd, src->SizeOfImage);
489 a->SizeOfHeaders = H_GET_32 (abfd, src->SizeOfHeaders);
490 a->CheckSum = H_GET_32 (abfd, src->CheckSum);
491 a->Subsystem = H_GET_16 (abfd, src->Subsystem);
492 a->DllCharacteristics = H_GET_16 (abfd, src->DllCharacteristics);
493 a->SizeOfStackReserve =
494 GET_OPTHDR_SIZE_OF_STACK_RESERVE (abfd, src->SizeOfStackReserve);
495 a->SizeOfStackCommit =
496 GET_OPTHDR_SIZE_OF_STACK_COMMIT (abfd, src->SizeOfStackCommit);
497 a->SizeOfHeapReserve =
498 GET_OPTHDR_SIZE_OF_HEAP_RESERVE (abfd, src->SizeOfHeapReserve);
499 a->SizeOfHeapCommit =
500 GET_OPTHDR_SIZE_OF_HEAP_COMMIT (abfd, src->SizeOfHeapCommit);
501 a->LoaderFlags = H_GET_32 (abfd, src->LoaderFlags);
502 a->NumberOfRvaAndSizes = H_GET_32 (abfd, src->NumberOfRvaAndSizes);
507 for (idx = 0; idx < a->NumberOfRvaAndSizes; idx++)
509 /* If data directory is empty, rva also should be 0. */
511 H_GET_32 (abfd, src->DataDirectory[idx][1]);
513 a->DataDirectory[idx].Size = size;
516 a->DataDirectory[idx].VirtualAddress =
517 H_GET_32 (abfd, src->DataDirectory[idx][0]);
519 a->DataDirectory[idx].VirtualAddress = 0;
523 if (aouthdr_int->entry)
525 aouthdr_int->entry += a->ImageBase;
526 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
527 aouthdr_int->entry &= 0xffffffff;
531 if (aouthdr_int->tsize)
533 aouthdr_int->text_start += a->ImageBase;
534 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
535 aouthdr_int->text_start &= 0xffffffff;
539 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
540 /* PE32+ does not have data_start member! */
541 if (aouthdr_int->dsize)
543 aouthdr_int->data_start += a->ImageBase;
544 aouthdr_int->data_start &= 0xffffffff;
549 /* These three fields are normally set up by ppc_relocate_section.
550 In the case of reading a file in, we can pick them up from the
552 first_thunk_address = a->DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress;
553 thunk_size = a->DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size;
554 import_table_size = a->DataDirectory[PE_IMPORT_TABLE].Size;
558 /* A support function for below. */
561 add_data_entry (bfd * abfd,
562 struct internal_extra_pe_aouthdr *aout,
567 asection *sec = bfd_get_section_by_name (abfd, name);
569 /* Add import directory information if it exists. */
571 && (coff_section_data (abfd, sec) != NULL)
572 && (pei_section_data (abfd, sec) != NULL))
574 /* If data directory is empty, rva also should be 0. */
575 int size = pei_section_data (abfd, sec)->virt_size;
576 aout->DataDirectory[idx].Size = size;
580 aout->DataDirectory[idx].VirtualAddress =
581 (sec->vma - base) & 0xffffffff;
582 sec->flags |= SEC_DATA;
588 _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out)
590 struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *) in;
591 pe_data_type *pe = pe_data (abfd);
592 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
593 PEAOUTHDR *aouthdr_out = (PEAOUTHDR *) out;
595 IMAGE_DATA_DIRECTORY idata2, idata5, tls;
597 sa = extra->SectionAlignment;
598 fa = extra->FileAlignment;
599 ib = extra->ImageBase;
601 idata2 = pe->pe_opthdr.DataDirectory[PE_IMPORT_TABLE];
602 idata5 = pe->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE];
603 tls = pe->pe_opthdr.DataDirectory[PE_TLS_TABLE];
605 if (aouthdr_in->tsize)
607 aouthdr_in->text_start -= ib;
608 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
609 aouthdr_in->text_start &= 0xffffffff;
613 if (aouthdr_in->dsize)
615 aouthdr_in->data_start -= ib;
616 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
617 aouthdr_in->data_start &= 0xffffffff;
621 if (aouthdr_in->entry)
623 aouthdr_in->entry -= ib;
624 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
625 aouthdr_in->entry &= 0xffffffff;
629 #define FA(x) (((x) + fa -1 ) & (- fa))
630 #define SA(x) (((x) + sa -1 ) & (- sa))
632 /* We like to have the sizes aligned. */
633 aouthdr_in->bsize = FA (aouthdr_in->bsize);
635 extra->NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
637 add_data_entry (abfd, extra, 0, ".edata", ib);
638 add_data_entry (abfd, extra, 2, ".rsrc", ib);
639 add_data_entry (abfd, extra, 3, ".pdata", ib);
641 /* In theory we do not need to call add_data_entry for .idata$2 or
642 .idata$5. It will be done in bfd_coff_final_link where all the
643 required information is available. If however, we are not going
644 to perform a final link, eg because we have been invoked by objcopy
645 or strip, then we need to make sure that these Data Directory
646 entries are initialised properly.
648 So - we copy the input values into the output values, and then, if
649 a final link is going to be performed, it can overwrite them. */
650 extra->DataDirectory[PE_IMPORT_TABLE] = idata2;
651 extra->DataDirectory[PE_IMPORT_ADDRESS_TABLE] = idata5;
652 extra->DataDirectory[PE_TLS_TABLE] = tls;
654 if (extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress == 0)
655 /* Until other .idata fixes are made (pending patch), the entry for
656 .idata is needed for backwards compatibility. FIXME. */
657 add_data_entry (abfd, extra, 1, ".idata", ib);
659 /* For some reason, the virtual size (which is what's set by
660 add_data_entry) for .reloc is not the same as the size recorded
661 in this slot by MSVC; it doesn't seem to cause problems (so far),
662 but since it's the best we've got, use it. It does do the right
664 if (pe->has_reloc_section)
665 add_data_entry (abfd, extra, 5, ".reloc", ib);
674 for (sec = abfd->sections; sec; sec = sec->next)
676 int rounded = FA (sec->size);
678 /* The first non-zero section filepos is the header size.
679 Sections without contents will have a filepos of 0. */
681 hsize = sec->filepos;
682 if (sec->flags & SEC_DATA)
684 if (sec->flags & SEC_CODE)
686 /* The image size is the total VIRTUAL size (which is what is
687 in the virt_size field). Files have been seen (from MSVC
688 5.0 link.exe) where the file size of the .data segment is
689 quite small compared to the virtual size. Without this
690 fix, strip munges the file.
692 FIXME: We need to handle holes between sections, which may
693 happpen when we covert from another format. We just use
694 the virtual address and virtual size of the last section
695 for the image size. */
696 if (coff_section_data (abfd, sec) != NULL
697 && pei_section_data (abfd, sec) != NULL)
698 isize = (sec->vma - extra->ImageBase
699 + SA (FA (pei_section_data (abfd, sec)->virt_size)));
702 aouthdr_in->dsize = dsize;
703 aouthdr_in->tsize = tsize;
704 extra->SizeOfHeaders = hsize;
705 extra->SizeOfImage = isize;
708 H_PUT_16 (abfd, aouthdr_in->magic, aouthdr_out->standard.magic);
710 /* e.g. 219510000 is linker version 2.19 */
711 #define LINKER_VERSION ((short) (BFD_VERSION / 1000000))
713 /* This piece of magic sets the "linker version" field to
715 H_PUT_16 (abfd, (LINKER_VERSION / 100 + (LINKER_VERSION % 100) * 256),
716 aouthdr_out->standard.vstamp);
718 PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, aouthdr_out->standard.tsize);
719 PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, aouthdr_out->standard.dsize);
720 PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, aouthdr_out->standard.bsize);
721 PUT_AOUTHDR_ENTRY (abfd, aouthdr_in->entry, aouthdr_out->standard.entry);
722 PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start,
723 aouthdr_out->standard.text_start);
725 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
726 /* PE32+ does not have data_start member! */
727 PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
728 aouthdr_out->standard.data_start);
731 PUT_OPTHDR_IMAGE_BASE (abfd, extra->ImageBase, aouthdr_out->ImageBase);
732 H_PUT_32 (abfd, extra->SectionAlignment, aouthdr_out->SectionAlignment);
733 H_PUT_32 (abfd, extra->FileAlignment, aouthdr_out->FileAlignment);
734 H_PUT_16 (abfd, extra->MajorOperatingSystemVersion,
735 aouthdr_out->MajorOperatingSystemVersion);
736 H_PUT_16 (abfd, extra->MinorOperatingSystemVersion,
737 aouthdr_out->MinorOperatingSystemVersion);
738 H_PUT_16 (abfd, extra->MajorImageVersion, aouthdr_out->MajorImageVersion);
739 H_PUT_16 (abfd, extra->MinorImageVersion, aouthdr_out->MinorImageVersion);
740 H_PUT_16 (abfd, extra->MajorSubsystemVersion,
741 aouthdr_out->MajorSubsystemVersion);
742 H_PUT_16 (abfd, extra->MinorSubsystemVersion,
743 aouthdr_out->MinorSubsystemVersion);
744 H_PUT_32 (abfd, extra->Reserved1, aouthdr_out->Reserved1);
745 H_PUT_32 (abfd, extra->SizeOfImage, aouthdr_out->SizeOfImage);
746 H_PUT_32 (abfd, extra->SizeOfHeaders, aouthdr_out->SizeOfHeaders);
747 H_PUT_32 (abfd, extra->CheckSum, aouthdr_out->CheckSum);
748 H_PUT_16 (abfd, extra->Subsystem, aouthdr_out->Subsystem);
749 H_PUT_16 (abfd, extra->DllCharacteristics, aouthdr_out->DllCharacteristics);
750 PUT_OPTHDR_SIZE_OF_STACK_RESERVE (abfd, extra->SizeOfStackReserve,
751 aouthdr_out->SizeOfStackReserve);
752 PUT_OPTHDR_SIZE_OF_STACK_COMMIT (abfd, extra->SizeOfStackCommit,
753 aouthdr_out->SizeOfStackCommit);
754 PUT_OPTHDR_SIZE_OF_HEAP_RESERVE (abfd, extra->SizeOfHeapReserve,
755 aouthdr_out->SizeOfHeapReserve);
756 PUT_OPTHDR_SIZE_OF_HEAP_COMMIT (abfd, extra->SizeOfHeapCommit,
757 aouthdr_out->SizeOfHeapCommit);
758 H_PUT_32 (abfd, extra->LoaderFlags, aouthdr_out->LoaderFlags);
759 H_PUT_32 (abfd, extra->NumberOfRvaAndSizes,
760 aouthdr_out->NumberOfRvaAndSizes);
764 for (idx = 0; idx < 16; idx++)
766 H_PUT_32 (abfd, extra->DataDirectory[idx].VirtualAddress,
767 aouthdr_out->DataDirectory[idx][0]);
768 H_PUT_32 (abfd, extra->DataDirectory[idx].Size,
769 aouthdr_out->DataDirectory[idx][1]);
777 _bfd_XXi_only_swap_filehdr_out (bfd * abfd, void * in, void * out)
780 struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
781 struct external_PEI_filehdr *filehdr_out = (struct external_PEI_filehdr *) out;
783 if (pe_data (abfd)->has_reloc_section
784 || pe_data (abfd)->dont_strip_reloc)
785 filehdr_in->f_flags &= ~F_RELFLG;
787 if (pe_data (abfd)->dll)
788 filehdr_in->f_flags |= F_DLL;
790 filehdr_in->pe.e_magic = DOSMAGIC;
791 filehdr_in->pe.e_cblp = 0x90;
792 filehdr_in->pe.e_cp = 0x3;
793 filehdr_in->pe.e_crlc = 0x0;
794 filehdr_in->pe.e_cparhdr = 0x4;
795 filehdr_in->pe.e_minalloc = 0x0;
796 filehdr_in->pe.e_maxalloc = 0xffff;
797 filehdr_in->pe.e_ss = 0x0;
798 filehdr_in->pe.e_sp = 0xb8;
799 filehdr_in->pe.e_csum = 0x0;
800 filehdr_in->pe.e_ip = 0x0;
801 filehdr_in->pe.e_cs = 0x0;
802 filehdr_in->pe.e_lfarlc = 0x40;
803 filehdr_in->pe.e_ovno = 0x0;
805 for (idx = 0; idx < 4; idx++)
806 filehdr_in->pe.e_res[idx] = 0x0;
808 filehdr_in->pe.e_oemid = 0x0;
809 filehdr_in->pe.e_oeminfo = 0x0;
811 for (idx = 0; idx < 10; idx++)
812 filehdr_in->pe.e_res2[idx] = 0x0;
814 filehdr_in->pe.e_lfanew = 0x80;
816 /* This next collection of data are mostly just characters. It
817 appears to be constant within the headers put on NT exes. */
818 filehdr_in->pe.dos_message[0] = 0x0eba1f0e;
819 filehdr_in->pe.dos_message[1] = 0xcd09b400;
820 filehdr_in->pe.dos_message[2] = 0x4c01b821;
821 filehdr_in->pe.dos_message[3] = 0x685421cd;
822 filehdr_in->pe.dos_message[4] = 0x70207369;
823 filehdr_in->pe.dos_message[5] = 0x72676f72;
824 filehdr_in->pe.dos_message[6] = 0x63206d61;
825 filehdr_in->pe.dos_message[7] = 0x6f6e6e61;
826 filehdr_in->pe.dos_message[8] = 0x65622074;
827 filehdr_in->pe.dos_message[9] = 0x6e757220;
828 filehdr_in->pe.dos_message[10] = 0x206e6920;
829 filehdr_in->pe.dos_message[11] = 0x20534f44;
830 filehdr_in->pe.dos_message[12] = 0x65646f6d;
831 filehdr_in->pe.dos_message[13] = 0x0a0d0d2e;
832 filehdr_in->pe.dos_message[14] = 0x24;
833 filehdr_in->pe.dos_message[15] = 0x0;
834 filehdr_in->pe.nt_signature = NT_SIGNATURE;
836 H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->f_magic);
837 H_PUT_16 (abfd, filehdr_in->f_nscns, filehdr_out->f_nscns);
839 /* Only use a real timestamp if the option was chosen. */
840 if ((pe_data (abfd)->insert_timestamp))
841 H_PUT_32 (abfd, time (0), filehdr_out->f_timdat);
843 PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr,
844 filehdr_out->f_symptr);
845 H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->f_nsyms);
846 H_PUT_16 (abfd, filehdr_in->f_opthdr, filehdr_out->f_opthdr);
847 H_PUT_16 (abfd, filehdr_in->f_flags, filehdr_out->f_flags);
849 /* Put in extra dos header stuff. This data remains essentially
850 constant, it just has to be tacked on to the beginning of all exes
852 H_PUT_16 (abfd, filehdr_in->pe.e_magic, filehdr_out->e_magic);
853 H_PUT_16 (abfd, filehdr_in->pe.e_cblp, filehdr_out->e_cblp);
854 H_PUT_16 (abfd, filehdr_in->pe.e_cp, filehdr_out->e_cp);
855 H_PUT_16 (abfd, filehdr_in->pe.e_crlc, filehdr_out->e_crlc);
856 H_PUT_16 (abfd, filehdr_in->pe.e_cparhdr, filehdr_out->e_cparhdr);
857 H_PUT_16 (abfd, filehdr_in->pe.e_minalloc, filehdr_out->e_minalloc);
858 H_PUT_16 (abfd, filehdr_in->pe.e_maxalloc, filehdr_out->e_maxalloc);
859 H_PUT_16 (abfd, filehdr_in->pe.e_ss, filehdr_out->e_ss);
860 H_PUT_16 (abfd, filehdr_in->pe.e_sp, filehdr_out->e_sp);
861 H_PUT_16 (abfd, filehdr_in->pe.e_csum, filehdr_out->e_csum);
862 H_PUT_16 (abfd, filehdr_in->pe.e_ip, filehdr_out->e_ip);
863 H_PUT_16 (abfd, filehdr_in->pe.e_cs, filehdr_out->e_cs);
864 H_PUT_16 (abfd, filehdr_in->pe.e_lfarlc, filehdr_out->e_lfarlc);
865 H_PUT_16 (abfd, filehdr_in->pe.e_ovno, filehdr_out->e_ovno);
867 for (idx = 0; idx < 4; idx++)
868 H_PUT_16 (abfd, filehdr_in->pe.e_res[idx], filehdr_out->e_res[idx]);
870 H_PUT_16 (abfd, filehdr_in->pe.e_oemid, filehdr_out->e_oemid);
871 H_PUT_16 (abfd, filehdr_in->pe.e_oeminfo, filehdr_out->e_oeminfo);
873 for (idx = 0; idx < 10; idx++)
874 H_PUT_16 (abfd, filehdr_in->pe.e_res2[idx], filehdr_out->e_res2[idx]);
876 H_PUT_32 (abfd, filehdr_in->pe.e_lfanew, filehdr_out->e_lfanew);
878 for (idx = 0; idx < 16; idx++)
879 H_PUT_32 (abfd, filehdr_in->pe.dos_message[idx],
880 filehdr_out->dos_message[idx]);
882 /* Also put in the NT signature. */
883 H_PUT_32 (abfd, filehdr_in->pe.nt_signature, filehdr_out->nt_signature);
889 _bfd_XX_only_swap_filehdr_out (bfd * abfd, void * in, void * out)
891 struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
892 FILHDR *filehdr_out = (FILHDR *) out;
894 H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->f_magic);
895 H_PUT_16 (abfd, filehdr_in->f_nscns, filehdr_out->f_nscns);
896 H_PUT_32 (abfd, filehdr_in->f_timdat, filehdr_out->f_timdat);
897 PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr, filehdr_out->f_symptr);
898 H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->f_nsyms);
899 H_PUT_16 (abfd, filehdr_in->f_opthdr, filehdr_out->f_opthdr);
900 H_PUT_16 (abfd, filehdr_in->f_flags, filehdr_out->f_flags);
906 _bfd_XXi_swap_scnhdr_out (bfd * abfd, void * in, void * out)
908 struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
909 SCNHDR *scnhdr_ext = (SCNHDR *) out;
910 unsigned int ret = SCNHSZ;
914 memcpy (scnhdr_ext->s_name, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
916 PUT_SCNHDR_VADDR (abfd,
917 ((scnhdr_int->s_vaddr
918 - pe_data (abfd)->pe_opthdr.ImageBase)
920 scnhdr_ext->s_vaddr);
922 /* NT wants the size data to be rounded up to the next
923 NT_FILE_ALIGNMENT, but zero if it has no content (as in .bss,
925 if ((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0)
927 if (bfd_pei_p (abfd))
929 ps = scnhdr_int->s_size;
935 ss = scnhdr_int->s_size;
940 if (bfd_pei_p (abfd))
941 ps = scnhdr_int->s_paddr;
945 ss = scnhdr_int->s_size;
948 PUT_SCNHDR_SIZE (abfd, ss,
951 /* s_paddr in PE is really the virtual size. */
952 PUT_SCNHDR_PADDR (abfd, ps, scnhdr_ext->s_paddr);
954 PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr,
955 scnhdr_ext->s_scnptr);
956 PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr,
957 scnhdr_ext->s_relptr);
958 PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr,
959 scnhdr_ext->s_lnnoptr);
962 /* Extra flags must be set when dealing with PE. All sections should also
963 have the IMAGE_SCN_MEM_READ (0x40000000) flag set. In addition, the
964 .text section must have IMAGE_SCN_MEM_EXECUTE (0x20000000) and the data
965 sections (.idata, .data, .bss, .CRT) must have IMAGE_SCN_MEM_WRITE set
966 (this is especially important when dealing with the .idata section since
967 the addresses for routines from .dlls must be overwritten). If .reloc
968 section data is ever generated, we must add IMAGE_SCN_MEM_DISCARDABLE
969 (0x02000000). Also, the resource data should also be read and
972 /* FIXME: Alignment is also encoded in this field, at least on PPC and
973 ARM-WINCE. Although - how do we get the original alignment field
978 const char * section_name;
979 unsigned long must_have;
981 pe_required_section_flags;
983 pe_required_section_flags known_sections [] =
985 { ".arch", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_ALIGN_8BYTES },
986 { ".bss", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
987 { ".data", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
988 { ".edata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
989 { ".idata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
990 { ".pdata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
991 { ".rdata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
992 { ".reloc", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE },
993 { ".rsrc", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
994 { ".text" , IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE },
995 { ".tls", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
996 { ".xdata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
1000 pe_required_section_flags * p;
1002 /* We have defaulted to adding the IMAGE_SCN_MEM_WRITE flag, but now
1003 we know exactly what this specific section wants so we remove it
1004 and then allow the must_have field to add it back in if necessary.
1005 However, we don't remove IMAGE_SCN_MEM_WRITE flag from .text if the
1006 default WP_TEXT file flag has been cleared. WP_TEXT may be cleared
1007 by ld --enable-auto-import (if auto-import is actually needed),
1008 by ld --omagic, or by obcopy --writable-text. */
1010 for (p = known_sections; p->section_name; p++)
1011 if (strcmp (scnhdr_int->s_name, p->section_name) == 0)
1013 if (strcmp (scnhdr_int->s_name, ".text")
1014 || (bfd_get_file_flags (abfd) & WP_TEXT))
1015 scnhdr_int->s_flags &= ~IMAGE_SCN_MEM_WRITE;
1016 scnhdr_int->s_flags |= p->must_have;
1020 H_PUT_32 (abfd, scnhdr_int->s_flags, scnhdr_ext->s_flags);
1023 if (coff_data (abfd)->link_info
1024 && ! coff_data (abfd)->link_info->relocatable
1025 && ! coff_data (abfd)->link_info->shared
1026 && strcmp (scnhdr_int->s_name, ".text") == 0)
1028 /* By inference from looking at MS output, the 32 bit field
1029 which is the combination of the number_of_relocs and
1030 number_of_linenos is used for the line number count in
1031 executables. A 16-bit field won't do for cc1. The MS
1032 document says that the number of relocs is zero for
1033 executables, but the 17-th bit has been observed to be there.
1034 Overflow is not an issue: a 4G-line program will overflow a
1035 bunch of other fields long before this! */
1036 H_PUT_16 (abfd, (scnhdr_int->s_nlnno & 0xffff), scnhdr_ext->s_nlnno);
1037 H_PUT_16 (abfd, (scnhdr_int->s_nlnno >> 16), scnhdr_ext->s_nreloc);
1041 if (scnhdr_int->s_nlnno <= 0xffff)
1042 H_PUT_16 (abfd, scnhdr_int->s_nlnno, scnhdr_ext->s_nlnno);
1045 (*_bfd_error_handler) (_("%s: line number overflow: 0x%lx > 0xffff"),
1046 bfd_get_filename (abfd),
1047 scnhdr_int->s_nlnno);
1048 bfd_set_error (bfd_error_file_truncated);
1049 H_PUT_16 (abfd, 0xffff, scnhdr_ext->s_nlnno);
1053 /* Although we could encode 0xffff relocs here, we do not, to be
1054 consistent with other parts of bfd. Also it lets us warn, as
1055 we should never see 0xffff here w/o having the overflow flag
1057 if (scnhdr_int->s_nreloc < 0xffff)
1058 H_PUT_16 (abfd, scnhdr_int->s_nreloc, scnhdr_ext->s_nreloc);
1061 /* PE can deal with large #s of relocs, but not here. */
1062 H_PUT_16 (abfd, 0xffff, scnhdr_ext->s_nreloc);
1063 scnhdr_int->s_flags |= IMAGE_SCN_LNK_NRELOC_OVFL;
1064 H_PUT_32 (abfd, scnhdr_int->s_flags, scnhdr_ext->s_flags);
1071 _bfd_XXi_swap_debugdir_in (bfd * abfd, void * ext1, void * in1)
1073 struct external_IMAGE_DEBUG_DIRECTORY *ext = (struct external_IMAGE_DEBUG_DIRECTORY *) ext1;
1074 struct internal_IMAGE_DEBUG_DIRECTORY *in = (struct internal_IMAGE_DEBUG_DIRECTORY *) in1;
1076 in->Characteristics = H_GET_32(abfd, ext->Characteristics);
1077 in->TimeDateStamp = H_GET_32(abfd, ext->TimeDateStamp);
1078 in->MajorVersion = H_GET_16(abfd, ext->MajorVersion);
1079 in->MinorVersion = H_GET_16(abfd, ext->MinorVersion);
1080 in->Type = H_GET_32(abfd, ext->Type);
1081 in->SizeOfData = H_GET_32(abfd, ext->SizeOfData);
1082 in->AddressOfRawData = H_GET_32(abfd, ext->AddressOfRawData);
1083 in->PointerToRawData = H_GET_32(abfd, ext->PointerToRawData);
1087 _bfd_XXi_swap_debugdir_out (bfd * abfd, void * inp, void * extp)
1089 struct external_IMAGE_DEBUG_DIRECTORY *ext = (struct external_IMAGE_DEBUG_DIRECTORY *) extp;
1090 struct internal_IMAGE_DEBUG_DIRECTORY *in = (struct internal_IMAGE_DEBUG_DIRECTORY *) inp;
1092 H_PUT_32(abfd, in->Characteristics, ext->Characteristics);
1093 H_PUT_32(abfd, in->TimeDateStamp, ext->TimeDateStamp);
1094 H_PUT_16(abfd, in->MajorVersion, ext->MajorVersion);
1095 H_PUT_16(abfd, in->MinorVersion, ext->MinorVersion);
1096 H_PUT_32(abfd, in->Type, ext->Type);
1097 H_PUT_32(abfd, in->SizeOfData, ext->SizeOfData);
1098 H_PUT_32(abfd, in->AddressOfRawData, ext->AddressOfRawData);
1099 H_PUT_32(abfd, in->PointerToRawData, ext->PointerToRawData);
1101 return sizeof (struct external_IMAGE_DEBUG_DIRECTORY);
1104 static CODEVIEW_INFO *
1105 _bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length, CODEVIEW_INFO *cvinfo)
1109 if (bfd_seek (abfd, where, SEEK_SET) != 0)
1112 if (bfd_bread (buffer, 256, abfd) < 4)
1115 /* ensure null termination of filename */
1118 cvinfo->CVSignature = H_GET_32(abfd, buffer);
1121 if ((cvinfo->CVSignature == CVINFO_PDB70_CVSIGNATURE)
1122 && (length > sizeof (CV_INFO_PDB70)))
1124 CV_INFO_PDB70 *cvinfo70 = (CV_INFO_PDB70 *)(buffer);
1126 cvinfo->Age = H_GET_32(abfd, cvinfo70->Age);
1127 memcpy (cvinfo->Signature, cvinfo70->Signature, CV_INFO_SIGNATURE_LENGTH);
1128 cvinfo->SignatureLength = CV_INFO_SIGNATURE_LENGTH;
1129 // cvinfo->PdbFileName = cvinfo70->PdbFileName;
1133 else if ((cvinfo->CVSignature == CVINFO_PDB20_CVSIGNATURE)
1134 && (length > sizeof (CV_INFO_PDB20)))
1136 CV_INFO_PDB20 *cvinfo20 = (CV_INFO_PDB20 *)(buffer);
1137 cvinfo->Age = H_GET_32(abfd, cvinfo20->Age);
1138 memcpy (cvinfo->Signature, cvinfo20->Signature, 4);
1139 cvinfo->SignatureLength = 4;
1140 // cvinfo->PdbFileName = cvinfo20->PdbFileName;
1149 _bfd_XXi_write_codeview_record (bfd * abfd, file_ptr where, CODEVIEW_INFO *cvinfo)
1151 unsigned int size = sizeof (CV_INFO_PDB70) + 1;
1152 CV_INFO_PDB70 *cvinfo70;
1155 if (bfd_seek (abfd, where, SEEK_SET) != 0)
1158 cvinfo70 = (CV_INFO_PDB70 *) buffer;
1159 H_PUT_32 (abfd, CVINFO_PDB70_CVSIGNATURE, cvinfo70->CvSignature);
1160 memcpy (&(cvinfo70->Signature), cvinfo->Signature, CV_INFO_SIGNATURE_LENGTH);
1161 H_PUT_32 (abfd, cvinfo->Age, cvinfo70->Age);
1162 cvinfo70->PdbFileName[0] = '\0';
1164 if (bfd_bwrite (buffer, size, abfd) != size)
1170 static char * dir_names[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] =
1172 N_("Export Directory [.edata (or where ever we found it)]"),
1173 N_("Import Directory [parts of .idata]"),
1174 N_("Resource Directory [.rsrc]"),
1175 N_("Exception Directory [.pdata]"),
1176 N_("Security Directory"),
1177 N_("Base Relocation Directory [.reloc]"),
1178 N_("Debug Directory"),
1179 N_("Description Directory"),
1180 N_("Special Directory"),
1181 N_("Thread Storage Directory [.tls]"),
1182 N_("Load Configuration Directory"),
1183 N_("Bound Import Directory"),
1184 N_("Import Address Table Directory"),
1185 N_("Delay Import Directory"),
1186 N_("CLR Runtime Header"),
1190 #ifdef POWERPC_LE_PE
1191 /* The code for the PPC really falls in the "architecture dependent"
1192 category. However, it's not clear that anyone will ever care, so
1193 we're ignoring the issue for now; if/when PPC matters, some of this
1194 may need to go into peicode.h, or arguments passed to enable the
1195 PPC- specific code. */
1199 pe_print_idata (bfd * abfd, void * vfile)
1201 FILE *file = (FILE *) vfile;
1206 #ifdef POWERPC_LE_PE
1207 asection *rel_section = bfd_get_section_by_name (abfd, ".reldata");
1210 bfd_size_type datasize = 0;
1211 bfd_size_type dataoff;
1215 pe_data_type *pe = pe_data (abfd);
1216 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1220 addr = extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress;
1222 if (addr == 0 && extra->DataDirectory[PE_IMPORT_TABLE].Size == 0)
1224 /* Maybe the extra header isn't there. Look for the section. */
1225 section = bfd_get_section_by_name (abfd, ".idata");
1226 if (section == NULL)
1229 addr = section->vma;
1230 datasize = section->size;
1236 addr += extra->ImageBase;
1237 for (section = abfd->sections; section != NULL; section = section->next)
1239 datasize = section->size;
1240 if (addr >= section->vma && addr < section->vma + datasize)
1244 if (section == NULL)
1247 _("\nThere is an import table, but the section containing it could not be found\n"));
1250 else if (!(section->flags & SEC_HAS_CONTENTS))
1253 _("\nThere is an import table in %s, but that section has no contents\n"),
1259 fprintf (file, _("\nThere is an import table in %s at 0x%lx\n"),
1260 section->name, (unsigned long) addr);
1262 dataoff = addr - section->vma;
1264 #ifdef POWERPC_LE_PE
1265 if (rel_section != 0 && rel_section->size != 0)
1267 /* The toc address can be found by taking the starting address,
1268 which on the PPC locates a function descriptor. The
1269 descriptor consists of the function code starting address
1270 followed by the address of the toc. The starting address we
1271 get from the bfd, and the descriptor is supposed to be in the
1272 .reldata section. */
1274 bfd_vma loadable_toc_address;
1275 bfd_vma toc_address;
1276 bfd_vma start_address;
1280 if (!bfd_malloc_and_get_section (abfd, rel_section, &data))
1287 offset = abfd->start_address - rel_section->vma;
1289 if (offset >= rel_section->size || offset + 8 > rel_section->size)
1296 start_address = bfd_get_32 (abfd, data + offset);
1297 loadable_toc_address = bfd_get_32 (abfd, data + offset + 4);
1298 toc_address = loadable_toc_address - 32768;
1301 _("\nFunction descriptor located at the start address: %04lx\n"),
1302 (unsigned long int) (abfd->start_address));
1304 _("\tcode-base %08lx toc (loadable/actual) %08lx/%08lx\n"),
1305 start_address, loadable_toc_address, toc_address);
1312 _("\nNo reldata section! Function descriptor not decoded.\n"));
1317 _("\nThe Import Tables (interpreted %s section contents)\n"),
1321 vma: Hint Time Forward DLL First\n\
1322 Table Stamp Chain Name Thunk\n"));
1324 /* Read the whole section. Some of the fields might be before dataoff. */
1325 if (!bfd_malloc_and_get_section (abfd, section, &data))
1332 adj = section->vma - extra->ImageBase;
1334 /* Print all image import descriptors. */
1335 for (i = dataoff; i + onaline <= datasize; i += onaline)
1339 bfd_vma forward_chain;
1341 bfd_vma first_thunk;
1346 /* Print (i + extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress). */
1347 fprintf (file, " %08lx\t", (unsigned long) (i + adj));
1348 hint_addr = bfd_get_32 (abfd, data + i);
1349 time_stamp = bfd_get_32 (abfd, data + i + 4);
1350 forward_chain = bfd_get_32 (abfd, data + i + 8);
1351 dll_name = bfd_get_32 (abfd, data + i + 12);
1352 first_thunk = bfd_get_32 (abfd, data + i + 16);
1354 fprintf (file, "%08lx %08lx %08lx %08lx %08lx\n",
1355 (unsigned long) hint_addr,
1356 (unsigned long) time_stamp,
1357 (unsigned long) forward_chain,
1358 (unsigned long) dll_name,
1359 (unsigned long) first_thunk);
1361 if (hint_addr == 0 && first_thunk == 0)
1364 if (dll_name - adj >= section->size)
1367 dll = (char *) data + dll_name - adj;
1368 fprintf (file, _("\n\tDLL Name: %s\n"), dll);
1373 asection *ft_section;
1375 bfd_size_type ft_datasize;
1379 fprintf (file, _("\tvma: Hint/Ord Member-Name Bound-To\n"));
1381 idx = hint_addr - adj;
1383 ft_addr = first_thunk + extra->ImageBase;
1384 ft_idx = first_thunk - adj;
1385 ft_data = data + ft_idx;
1386 ft_datasize = datasize - ft_idx;
1389 if (first_thunk != hint_addr)
1391 /* Find the section which contains the first thunk. */
1392 for (ft_section = abfd->sections;
1394 ft_section = ft_section->next)
1396 if (ft_addr >= ft_section->vma
1397 && ft_addr < ft_section->vma + ft_section->size)
1401 if (ft_section == NULL)
1404 _("\nThere is a first thunk, but the section containing it could not be found\n"));
1408 /* Now check to see if this section is the same as our current
1409 section. If it is not then we will have to load its data in. */
1410 if (ft_section != section)
1412 ft_idx = first_thunk - (ft_section->vma - extra->ImageBase);
1413 ft_datasize = ft_section->size - ft_idx;
1414 ft_data = (bfd_byte *) bfd_malloc (ft_datasize);
1415 if (ft_data == NULL)
1418 /* Read ft_datasize bytes starting at offset ft_idx. */
1419 if (!bfd_get_section_contents (abfd, ft_section, ft_data,
1420 (bfd_vma) ft_idx, ft_datasize))
1429 /* Print HintName vector entries. */
1430 #ifdef COFF_WITH_pex64
1431 for (j = 0; idx + j + 8 <= datasize; j += 8)
1433 unsigned long member = bfd_get_32 (abfd, data + idx + j);
1434 unsigned long member_high = bfd_get_32 (abfd, data + idx + j + 4);
1436 if (!member && !member_high)
1439 if (HighBitSet (member_high))
1440 fprintf (file, "\t%lx%08lx\t %4lx%08lx <none>",
1441 member_high, member,
1442 WithoutHighBit (member_high), member);
1448 ordinal = bfd_get_16 (abfd, data + member - adj);
1449 member_name = (char *) data + member - adj + 2;
1450 fprintf (file, "\t%04lx\t %4d %s",member, ordinal, member_name);
1453 /* If the time stamp is not zero, the import address
1454 table holds actual addresses. */
1457 && first_thunk != hint_addr
1458 && j + 4 <= ft_datasize)
1459 fprintf (file, "\t%04lx",
1460 (unsigned long) bfd_get_32 (abfd, ft_data + j));
1461 fprintf (file, "\n");
1464 for (j = 0; idx + j + 4 <= datasize; j += 4)
1466 unsigned long member = bfd_get_32 (abfd, data + idx + j);
1468 /* Print single IMAGE_IMPORT_BY_NAME vector. */
1472 if (HighBitSet (member))
1473 fprintf (file, "\t%04lx\t %4lu <none>",
1474 member, WithoutHighBit (member));
1480 ordinal = bfd_get_16 (abfd, data + member - adj);
1481 member_name = (char *) data + member - adj + 2;
1482 fprintf (file, "\t%04lx\t %4d %s",
1483 member, ordinal, member_name);
1486 /* If the time stamp is not zero, the import address
1487 table holds actual addresses. */
1490 && first_thunk != hint_addr
1491 && j + 4 <= ft_datasize)
1492 fprintf (file, "\t%04lx",
1493 (unsigned long) bfd_get_32 (abfd, ft_data + j));
1495 fprintf (file, "\n");
1502 fprintf (file, "\n");
1511 pe_print_edata (bfd * abfd, void * vfile)
1513 FILE *file = (FILE *) vfile;
1516 bfd_size_type datasize = 0;
1517 bfd_size_type dataoff;
1522 long export_flags; /* Reserved - should be zero. */
1526 bfd_vma name; /* RVA - relative to image base. */
1527 long base; /* Ordinal base. */
1528 unsigned long num_functions;/* Number in the export address table. */
1529 unsigned long num_names; /* Number in the name pointer table. */
1530 bfd_vma eat_addr; /* RVA to the export address table. */
1531 bfd_vma npt_addr; /* RVA to the Export Name Pointer Table. */
1532 bfd_vma ot_addr; /* RVA to the Ordinal Table. */
1535 pe_data_type *pe = pe_data (abfd);
1536 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1540 addr = extra->DataDirectory[PE_EXPORT_TABLE].VirtualAddress;
1542 if (addr == 0 && extra->DataDirectory[PE_EXPORT_TABLE].Size == 0)
1544 /* Maybe the extra header isn't there. Look for the section. */
1545 section = bfd_get_section_by_name (abfd, ".edata");
1546 if (section == NULL)
1549 addr = section->vma;
1551 datasize = section->size;
1557 addr += extra->ImageBase;
1559 for (section = abfd->sections; section != NULL; section = section->next)
1560 if (addr >= section->vma && addr < section->vma + section->size)
1563 if (section == NULL)
1566 _("\nThere is an export table, but the section containing it could not be found\n"));
1569 else if (!(section->flags & SEC_HAS_CONTENTS))
1572 _("\nThere is an export table in %s, but that section has no contents\n"),
1577 dataoff = addr - section->vma;
1578 datasize = extra->DataDirectory[PE_EXPORT_TABLE].Size;
1579 if (datasize > section->size - dataoff)
1582 _("\nThere is an export table in %s, but it does not fit into that section\n"),
1588 fprintf (file, _("\nThere is an export table in %s at 0x%lx\n"),
1589 section->name, (unsigned long) addr);
1591 data = (bfd_byte *) bfd_malloc (datasize);
1595 if (! bfd_get_section_contents (abfd, section, data,
1596 (file_ptr) dataoff, datasize))
1599 /* Go get Export Directory Table. */
1600 edt.export_flags = bfd_get_32 (abfd, data + 0);
1601 edt.time_stamp = bfd_get_32 (abfd, data + 4);
1602 edt.major_ver = bfd_get_16 (abfd, data + 8);
1603 edt.minor_ver = bfd_get_16 (abfd, data + 10);
1604 edt.name = bfd_get_32 (abfd, data + 12);
1605 edt.base = bfd_get_32 (abfd, data + 16);
1606 edt.num_functions = bfd_get_32 (abfd, data + 20);
1607 edt.num_names = bfd_get_32 (abfd, data + 24);
1608 edt.eat_addr = bfd_get_32 (abfd, data + 28);
1609 edt.npt_addr = bfd_get_32 (abfd, data + 32);
1610 edt.ot_addr = bfd_get_32 (abfd, data + 36);
1612 adj = section->vma - extra->ImageBase + dataoff;
1614 /* Dump the EDT first. */
1616 _("\nThe Export Tables (interpreted %s section contents)\n\n"),
1620 _("Export Flags \t\t\t%lx\n"), (unsigned long) edt.export_flags);
1623 _("Time/Date stamp \t\t%lx\n"), (unsigned long) edt.time_stamp);
1626 _("Major/Minor \t\t\t%d/%d\n"), edt.major_ver, edt.minor_ver);
1629 _("Name \t\t\t\t"));
1630 bfd_fprintf_vma (abfd, file, edt.name);
1632 if ((edt.name >= adj) && (edt.name < adj + datasize))
1633 fprintf (file, " %s\n", data + edt.name - adj);
1635 fprintf (file, "(outside .edata section)\n");
1638 _("Ordinal Base \t\t\t%ld\n"), edt.base);
1644 _("\tExport Address Table \t\t%08lx\n"),
1648 _("\t[Name Pointer/Ordinal] Table\t%08lx\n"), edt.num_names);
1651 _("Table Addresses\n"));
1654 _("\tExport Address Table \t\t"));
1655 bfd_fprintf_vma (abfd, file, edt.eat_addr);
1656 fprintf (file, "\n");
1659 _("\tName Pointer Table \t\t"));
1660 bfd_fprintf_vma (abfd, file, edt.npt_addr);
1661 fprintf (file, "\n");
1664 _("\tOrdinal Table \t\t\t"));
1665 bfd_fprintf_vma (abfd, file, edt.ot_addr);
1666 fprintf (file, "\n");
1668 /* The next table to find is the Export Address Table. It's basically
1669 a list of pointers that either locate a function in this dll, or
1670 forward the call to another dll. Something like:
1675 } export_address_table_entry; */
1678 _("\nExport Address Table -- Ordinal Base %ld\n"),
1681 for (i = 0; i < edt.num_functions; ++i)
1683 bfd_vma eat_member = bfd_get_32 (abfd,
1684 data + edt.eat_addr + (i * 4) - adj);
1685 if (eat_member == 0)
1688 if (eat_member - adj <= datasize)
1690 /* This rva is to a name (forwarding function) in our section. */
1691 /* Should locate a function descriptor. */
1693 "\t[%4ld] +base[%4ld] %04lx %s -- %s\n",
1695 (long) (i + edt.base),
1696 (unsigned long) eat_member,
1698 data + eat_member - adj);
1702 /* Should locate a function descriptor in the reldata section. */
1704 "\t[%4ld] +base[%4ld] %04lx %s\n",
1706 (long) (i + edt.base),
1707 (unsigned long) eat_member,
1712 /* The Export Name Pointer Table is paired with the Export Ordinal Table. */
1713 /* Dump them in parallel for clarity. */
1715 _("\n[Ordinal/Name Pointer] Table\n"));
1717 for (i = 0; i < edt.num_names; ++i)
1719 bfd_vma name_ptr = bfd_get_32 (abfd,
1724 char *name = (char *) data + name_ptr - adj;
1726 bfd_vma ord = bfd_get_16 (abfd,
1731 "\t[%4ld] %s\n", (long) ord, name);
1739 /* This really is architecture dependent. On IA-64, a .pdata entry
1740 consists of three dwords containing relative virtual addresses that
1741 specify the start and end address of the code range the entry
1742 covers and the address of the corresponding unwind info data.
1744 On ARM and SH-4, a compressed PDATA structure is used :
1745 _IMAGE_CE_RUNTIME_FUNCTION_ENTRY, whereas MIPS is documented to use
1746 _IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY.
1747 See http://msdn2.microsoft.com/en-us/library/ms253988(VS.80).aspx .
1749 This is the version for uncompressed data. */
1752 pe_print_pdata (bfd * abfd, void * vfile)
1754 #if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
1755 # define PDATA_ROW_SIZE (3 * 8)
1757 # define PDATA_ROW_SIZE (5 * 4)
1759 FILE *file = (FILE *) vfile;
1761 asection *section = bfd_get_section_by_name (abfd, ".pdata");
1762 bfd_size_type datasize = 0;
1764 bfd_size_type start, stop;
1765 int onaline = PDATA_ROW_SIZE;
1768 || coff_section_data (abfd, section) == NULL
1769 || pei_section_data (abfd, section) == NULL)
1772 stop = pei_section_data (abfd, section)->virt_size;
1773 if ((stop % onaline) != 0)
1775 _("Warning, .pdata section size (%ld) is not a multiple of %d\n"),
1776 (long) stop, onaline);
1779 _("\nThe Function Table (interpreted .pdata section contents)\n"));
1780 #if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
1782 _(" vma:\t\t\tBegin Address End Address Unwind Info\n"));
1785 vma:\t\tBegin End EH EH PrologEnd Exception\n\
1786 \t\tAddress Address Handler Data Address Mask\n"));
1789 datasize = section->size;
1793 if (! bfd_malloc_and_get_section (abfd, section, &data))
1802 for (i = start; i < stop; i += onaline)
1808 bfd_vma prolog_end_addr;
1809 #if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64)
1813 if (i + PDATA_ROW_SIZE > stop)
1816 begin_addr = GET_PDATA_ENTRY (abfd, data + i );
1817 end_addr = GET_PDATA_ENTRY (abfd, data + i + 4);
1818 eh_handler = GET_PDATA_ENTRY (abfd, data + i + 8);
1819 eh_data = GET_PDATA_ENTRY (abfd, data + i + 12);
1820 prolog_end_addr = GET_PDATA_ENTRY (abfd, data + i + 16);
1822 if (begin_addr == 0 && end_addr == 0 && eh_handler == 0
1823 && eh_data == 0 && prolog_end_addr == 0)
1824 /* We are probably into the padding of the section now. */
1827 #if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64)
1828 em_data = ((eh_handler & 0x1) << 2) | (prolog_end_addr & 0x3);
1830 eh_handler &= ~(bfd_vma) 0x3;
1831 prolog_end_addr &= ~(bfd_vma) 0x3;
1834 bfd_fprintf_vma (abfd, file, i + section->vma); fputc ('\t', file);
1835 bfd_fprintf_vma (abfd, file, begin_addr); fputc (' ', file);
1836 bfd_fprintf_vma (abfd, file, end_addr); fputc (' ', file);
1837 bfd_fprintf_vma (abfd, file, eh_handler);
1838 #if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64)
1840 bfd_fprintf_vma (abfd, file, eh_data); fputc (' ', file);
1841 bfd_fprintf_vma (abfd, file, prolog_end_addr);
1842 fprintf (file, " %x", em_data);
1845 #ifdef POWERPC_LE_PE
1846 if (eh_handler == 0 && eh_data != 0)
1848 /* Special bits here, although the meaning may be a little
1849 mysterious. The only one I know for sure is 0x03
1852 0x01 Register Save Millicode
1853 0x02 Register Restore Millicode
1854 0x03 Glue Code Sequence. */
1858 fprintf (file, _(" Register save millicode"));
1861 fprintf (file, _(" Register restore millicode"));
1864 fprintf (file, _(" Glue code sequence"));
1871 fprintf (file, "\n");
1877 #undef PDATA_ROW_SIZE
1880 typedef struct sym_cache
1887 slurp_symtab (bfd *abfd, sym_cache *psc)
1889 asymbol ** sy = NULL;
1892 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
1898 storage = bfd_get_symtab_upper_bound (abfd);
1902 sy = (asymbol **) bfd_malloc (storage);
1904 psc->symcount = bfd_canonicalize_symtab (abfd, sy);
1905 if (psc->symcount < 0)
1911 my_symbol_for_address (bfd *abfd, bfd_vma func, sym_cache *psc)
1916 psc->syms = slurp_symtab (abfd, psc);
1918 for (i = 0; i < psc->symcount; i++)
1920 if (psc->syms[i]->section->vma + psc->syms[i]->value == func)
1921 return psc->syms[i]->name;
1928 cleanup_syms (sym_cache *psc)
1935 /* This is the version for "compressed" pdata. */
1938 _bfd_XX_print_ce_compressed_pdata (bfd * abfd, void * vfile)
1940 # define PDATA_ROW_SIZE (2 * 4)
1941 FILE *file = (FILE *) vfile;
1942 bfd_byte *data = NULL;
1943 asection *section = bfd_get_section_by_name (abfd, ".pdata");
1944 bfd_size_type datasize = 0;
1946 bfd_size_type start, stop;
1947 int onaline = PDATA_ROW_SIZE;
1948 struct sym_cache cache = {0, 0} ;
1951 || coff_section_data (abfd, section) == NULL
1952 || pei_section_data (abfd, section) == NULL)
1955 stop = pei_section_data (abfd, section)->virt_size;
1956 if ((stop % onaline) != 0)
1958 _("Warning, .pdata section size (%ld) is not a multiple of %d\n"),
1959 (long) stop, onaline);
1962 _("\nThe Function Table (interpreted .pdata section contents)\n"));
1965 vma:\t\tBegin Prolog Function Flags Exception EH\n\
1966 \t\tAddress Length Length 32b exc Handler Data\n"));
1968 datasize = section->size;
1972 if (! bfd_malloc_and_get_section (abfd, section, &data))
1981 for (i = start; i < stop; i += onaline)
1985 bfd_vma prolog_length, function_length;
1986 int flag32bit, exception_flag;
1989 if (i + PDATA_ROW_SIZE > stop)
1992 begin_addr = GET_PDATA_ENTRY (abfd, data + i );
1993 other_data = GET_PDATA_ENTRY (abfd, data + i + 4);
1995 if (begin_addr == 0 && other_data == 0)
1996 /* We are probably into the padding of the section now. */
1999 prolog_length = (other_data & 0x000000FF);
2000 function_length = (other_data & 0x3FFFFF00) >> 8;
2001 flag32bit = (int)((other_data & 0x40000000) >> 30);
2002 exception_flag = (int)((other_data & 0x80000000) >> 31);
2005 bfd_fprintf_vma (abfd, file, i + section->vma); fputc ('\t', file);
2006 bfd_fprintf_vma (abfd, file, begin_addr); fputc (' ', file);
2007 bfd_fprintf_vma (abfd, file, prolog_length); fputc (' ', file);
2008 bfd_fprintf_vma (abfd, file, function_length); fputc (' ', file);
2009 fprintf (file, "%2d %2d ", flag32bit, exception_flag);
2011 /* Get the exception handler's address and the data passed from the
2012 .text section. This is really the data that belongs with the .pdata
2013 but got "compressed" out for the ARM and SH4 architectures. */
2014 tsection = bfd_get_section_by_name (abfd, ".text");
2015 if (tsection && coff_section_data (abfd, tsection)
2016 && pei_section_data (abfd, tsection))
2018 bfd_vma eh_off = (begin_addr - 8) - tsection->vma;
2021 tdata = (bfd_byte *) bfd_malloc (8);
2024 if (bfd_get_section_contents (abfd, tsection, tdata, eh_off, 8))
2026 bfd_vma eh, eh_data;
2028 eh = bfd_get_32 (abfd, tdata);
2029 eh_data = bfd_get_32 (abfd, tdata + 4);
2030 fprintf (file, "%08x ", (unsigned int) eh);
2031 fprintf (file, "%08x", (unsigned int) eh_data);
2034 const char *s = my_symbol_for_address (abfd, eh, &cache);
2037 fprintf (file, " (%s) ", s);
2044 fprintf (file, "\n");
2049 cleanup_syms (& cache);
2052 #undef PDATA_ROW_SIZE
2056 #define IMAGE_REL_BASED_HIGHADJ 4
2057 static const char * const tbl[] =
2071 "UNKNOWN", /* MUST be last. */
2075 pe_print_reloc (bfd * abfd, void * vfile)
2077 FILE *file = (FILE *) vfile;
2079 asection *section = bfd_get_section_by_name (abfd, ".reloc");
2081 bfd_size_type start, stop;
2083 if (section == NULL || section->size == 0 || !(section->flags & SEC_HAS_CONTENTS))
2087 _("\n\nPE File Base Relocations (interpreted .reloc section contents)\n"));
2089 if (! bfd_malloc_and_get_section (abfd, section, &data))
2098 stop = section->size;
2100 for (i = start; i < stop;)
2103 bfd_vma virtual_address;
2106 /* The .reloc section is a sequence of blocks, with a header consisting
2107 of two 32 bit quantities, followed by a number of 16 bit entries. */
2108 virtual_address = bfd_get_32 (abfd, data+i);
2109 size = bfd_get_32 (abfd, data+i+4);
2110 number = (size - 8) / 2;
2116 _("\nVirtual Address: %08lx Chunk size %ld (0x%lx) Number of fixups %ld\n"),
2117 (unsigned long) virtual_address, size, (unsigned long) size, number);
2119 for (j = 0; j < number; ++j)
2121 unsigned short e = bfd_get_16 (abfd, data + i + 8 + j * 2);
2122 unsigned int t = (e & 0xF000) >> 12;
2123 int off = e & 0x0FFF;
2125 if (t >= sizeof (tbl) / sizeof (tbl[0]))
2126 t = (sizeof (tbl) / sizeof (tbl[0])) - 1;
2129 _("\treloc %4d offset %4x [%4lx] %s"),
2130 j, off, (unsigned long) (off + virtual_address), tbl[t]);
2132 /* HIGHADJ takes an argument, - the next record *is* the
2133 low 16 bits of addend. */
2134 if (t == IMAGE_REL_BASED_HIGHADJ)
2136 fprintf (file, " (%4x)",
2138 bfd_get_16 (abfd, data + i + 8 + j * 2 + 2)));
2142 fprintf (file, "\n");
2153 /* A data structure describing the regions of a .rsrc section.
2154 Some fields are filled in as the section is parsed. */
2156 typedef struct rsrc_regions
2158 bfd_byte * section_start;
2159 bfd_byte * section_end;
2160 bfd_byte * strings_start;
2161 bfd_byte * resource_start;
2165 rsrc_print_resource_directory (FILE * , bfd *, unsigned int, bfd_byte *,
2166 rsrc_regions *, bfd_vma);
2169 rsrc_print_resource_entries (FILE * file,
2171 unsigned int indent,
2172 bfd_boolean is_name,
2174 rsrc_regions * regions,
2177 unsigned long entry, addr, size;
2179 if (data + 8 >= regions->section_end)
2180 return regions->section_end + 1;
2182 fprintf (file, _("%03x %*.s Entry: "), (int)(data - regions->section_start), indent, " ");
2184 entry = (long) bfd_get_32 (abfd, data);
2189 /* Note - the documentation says that this field is an RVA value
2190 but windres appears to produce a section relative offset with
2191 the top bit set. Support both styles for now. */
2192 if (HighBitSet (entry))
2193 name = regions->section_start + WithoutHighBit (entry);
2195 name = regions->section_start + entry - rva_bias;
2197 if (name + 2 < regions->section_end)
2201 if (regions->strings_start == NULL)
2202 regions->strings_start = name;
2204 len = bfd_get_16 (abfd, name);
2206 fprintf (file, _("name: [val: %08lx len %d]: "), entry, len);
2207 if (name + 2 + len * 2 < regions->section_end)
2209 /* This strange loop is to cope with multibyte characters. */
2213 fprintf (file, "%.1s", name);
2217 fprintf (file, _("<corrupt string length: %#x>"), len);
2220 fprintf (file, _("<corrupt string offset: %#lx>"), entry);
2223 fprintf (file, _("ID: %#08lx"), entry);
2225 entry = (long) bfd_get_32 (abfd, data + 4);
2226 fprintf (file, _(", Value: %#08lx\n"), entry);
2228 if (HighBitSet (entry))
2229 return rsrc_print_resource_directory (file, abfd, indent + 1,
2230 regions->section_start + WithoutHighBit (entry),
2233 if (regions->section_start + entry + 16 >= regions->section_end)
2234 return regions->section_end + 1;
2236 fprintf (file, _("%03x %*.s Leaf: Addr: %#08lx, Size: %#08lx, Codepage: %d\n"),
2239 addr = (long) bfd_get_32 (abfd, regions->section_start + entry),
2240 size = (long) bfd_get_32 (abfd, regions->section_start + entry + 4),
2241 (int) bfd_get_32 (abfd, regions->section_start + entry + 8));
2243 /* Check that the reserved entry is 0. */
2244 if (bfd_get_32 (abfd, regions->section_start + entry + 12) != 0
2245 /* And that the data address/size is valid too. */
2246 || (regions->section_start + (addr - rva_bias) + size > regions->section_end))
2247 return regions->section_end + 1;
2249 if (regions->resource_start == NULL)
2250 regions->resource_start = regions->section_start + (addr - rva_bias);
2252 return regions->section_start + (addr - rva_bias) + size;
2255 #define max(a,b) ((a) > (b) ? (a) : (b))
2256 #define min(a,b) ((a) < (b) ? (a) : (b))
2259 rsrc_print_resource_directory (FILE * file,
2261 unsigned int indent,
2263 rsrc_regions * regions,
2266 unsigned int num_names, num_ids;
2267 bfd_byte * highest_data = data;
2269 if (data + 16 >= regions->section_end)
2270 return regions->section_end + 1;
2272 fprintf (file, "%03x %*.s ", (int)(data - regions->section_start), indent, " ");
2275 case 0: fprintf (file, "Type"); break;
2276 case 2: fprintf (file, "Name"); break;
2277 case 4: fprintf (file, "Language"); break;
2278 default: fprintf (file, "<unknown>"); break;
2281 fprintf (file, _(" Table: Char: %d, Time: %08lx, Ver: %d/%d, Num Names: %d, IDs: %d\n"),
2282 (int) bfd_get_32 (abfd, data),
2283 (long) bfd_get_32 (abfd, data + 4),
2284 (int) bfd_get_16 (abfd, data + 8),
2285 (int) bfd_get_16 (abfd, data + 10),
2286 num_names = (int) bfd_get_16 (abfd, data + 12),
2287 num_ids = (int) bfd_get_16 (abfd, data + 14));
2290 while (num_names --)
2292 bfd_byte * entry_end;
2294 entry_end = rsrc_print_resource_entries (file, abfd, indent + 1, TRUE,
2295 data, regions, rva_bias);
2297 highest_data = max (highest_data, entry_end);
2298 if (entry_end >= regions->section_end)
2304 bfd_byte * entry_end;
2306 entry_end = rsrc_print_resource_entries (file, abfd, indent + 1, FALSE,
2307 data, regions, rva_bias);
2309 highest_data = max (highest_data, entry_end);
2310 if (entry_end >= regions->section_end)
2314 return max (highest_data, data);
2317 /* Display the contents of a .rsrc section. We do not try to
2318 reproduce the resources, windres does that. Instead we dump
2319 the tables in a human readable format. */
2322 rsrc_print_section (bfd * abfd, void * vfile)
2326 FILE * file = (FILE *) vfile;
2327 bfd_size_type datasize;
2330 rsrc_regions regions;
2332 pe = pe_data (abfd);
2336 section = bfd_get_section_by_name (abfd, ".rsrc");
2337 if (section == NULL)
2339 if (!(section->flags & SEC_HAS_CONTENTS))
2342 datasize = section->size;
2346 rva_bias = section->vma - pe->pe_opthdr.ImageBase;
2348 if (! bfd_malloc_and_get_section (abfd, section, & data))
2355 regions.section_start = data;
2356 regions.section_end = data + datasize;
2357 regions.strings_start = NULL;
2358 regions.resource_start = NULL;
2361 fprintf (file, "\nThe .rsrc Resource Directory section:\n");
2363 while (data < regions.section_end)
2365 bfd_byte * p = data;
2367 data = rsrc_print_resource_directory (file, abfd, 0, data, & regions, rva_bias);
2369 if (data == regions.section_end + 1)
2370 fprintf (file, _("Corrupt .rsrc section detected!\n"));
2373 /* Align data before continuing. */
2374 int align = (1 << section->alignment_power) - 1;
2376 data = (bfd_byte *) (((ptrdiff_t) (data + align)) & ~ align);
2377 rva_bias += data - p;
2379 /* For reasons that are unclear .rsrc sections are sometimes created
2380 aligned to a 1^3 boundary even when their alignment is set at
2381 1^2. Catch that case here before we issue a spurious warning
2383 if (data == (regions.section_end - 4))
2384 data = regions.section_end;
2385 else if (data < regions.section_end)
2386 fprintf (file, _("\nWARNING: Extra data in .rsrc section - it will be ignored by Windows:\n"));
2390 if (regions.strings_start != NULL)
2391 fprintf (file, " String table starts at %03x\n",
2392 (int) (regions.strings_start - regions.section_start));
2393 if (regions.resource_start != NULL)
2394 fprintf (file, " Resources start at %03xx\n",
2395 (int) (regions.resource_start - regions.section_start));
2397 free (regions.section_start);
2401 #define IMAGE_NUMBEROF_DEBUG_TYPES 12
2403 static char * debug_type_names[IMAGE_NUMBEROF_DEBUG_TYPES] =
2420 pe_print_debugdata (bfd * abfd, void * vfile)
2422 FILE *file = (FILE *) vfile;
2423 pe_data_type *pe = pe_data (abfd);
2424 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
2427 bfd_size_type dataoff;
2430 bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
2431 bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
2436 addr += extra->ImageBase;
2437 for (section = abfd->sections; section != NULL; section = section->next)
2439 if ((addr >= section->vma) && (addr < (section->vma + section->size)))
2443 if (section == NULL)
2446 _("\nThere is a debug directory, but the section containing it could not be found\n"));
2450 fprintf (file, _("\nThere is a debug directory in %s at 0x%lx\n\n"),
2451 section->name, (unsigned long) addr);
2453 dataoff = addr - section->vma;
2456 _("Type Size Rva Offset\n"));
2458 /* Read the whole section. */
2459 if (!bfd_malloc_and_get_section (abfd, section, &data))
2466 for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
2468 const char *type_name;
2469 struct external_IMAGE_DEBUG_DIRECTORY *ext
2470 = &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i];
2471 struct internal_IMAGE_DEBUG_DIRECTORY idd;
2473 _bfd_XXi_swap_debugdir_in (abfd, ext, &idd);
2475 if ((idd.Type) > IMAGE_NUMBEROF_DEBUG_TYPES)
2476 type_name = debug_type_names[0];
2478 type_name = debug_type_names[idd.Type];
2480 fprintf (file, " %2ld %14s %08lx %08lx %08lx\n",
2481 idd.Type, type_name, idd.SizeOfData,
2482 idd.AddressOfRawData, idd.PointerToRawData);
2484 if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW)
2486 char signature[CV_INFO_SIGNATURE_LENGTH * 2 + 1];
2487 char buffer[256 + 1];
2488 CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer;
2490 /* The debug entry doesn't have to have to be in a section,
2491 in which case AddressOfRawData is 0, so always use PointerToRawData. */
2492 if (!_bfd_XXi_slurp_codeview_record (abfd, (file_ptr) idd.PointerToRawData,
2493 idd.SizeOfData, cvinfo))
2496 for (i = 0; i < cvinfo->SignatureLength; i++)
2497 sprintf (&signature[i*2], "%02x", cvinfo->Signature[i] & 0xff);
2499 fprintf (file, "(format %c%c%c%c signature %s age %ld)\n",
2500 buffer[0], buffer[1], buffer[2], buffer[3],
2501 signature, cvinfo->Age);
2505 if (size % sizeof (struct external_IMAGE_DEBUG_DIRECTORY) != 0)
2507 _("The debug directory size is not a multiple of the debug directory entry size\n"));
2512 /* Print out the program headers. */
2515 _bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile)
2517 FILE *file = (FILE *) vfile;
2519 pe_data_type *pe = pe_data (abfd);
2520 struct internal_extra_pe_aouthdr *i = &pe->pe_opthdr;
2521 const char *subsystem_name = NULL;
2524 /* The MS dumpbin program reportedly ands with 0xff0f before
2525 printing the characteristics field. Not sure why. No reason to
2527 fprintf (file, _("\nCharacteristics 0x%x\n"), pe->real_flags);
2529 #define PF(x, y) if (pe->real_flags & x) { fprintf (file, "\t%s\n", y); }
2530 PF (IMAGE_FILE_RELOCS_STRIPPED, "relocations stripped");
2531 PF (IMAGE_FILE_EXECUTABLE_IMAGE, "executable");
2532 PF (IMAGE_FILE_LINE_NUMS_STRIPPED, "line numbers stripped");
2533 PF (IMAGE_FILE_LOCAL_SYMS_STRIPPED, "symbols stripped");
2534 PF (IMAGE_FILE_LARGE_ADDRESS_AWARE, "large address aware");
2535 PF (IMAGE_FILE_BYTES_REVERSED_LO, "little endian");
2536 PF (IMAGE_FILE_32BIT_MACHINE, "32 bit words");
2537 PF (IMAGE_FILE_DEBUG_STRIPPED, "debugging information removed");
2538 PF (IMAGE_FILE_SYSTEM, "system file");
2539 PF (IMAGE_FILE_DLL, "DLL");
2540 PF (IMAGE_FILE_BYTES_REVERSED_HI, "big endian");
2543 /* ctime implies '\n'. */
2545 time_t t = pe->coff.timestamp;
2546 fprintf (file, "\nTime/Date\t\t%s", ctime (&t));
2549 #ifndef IMAGE_NT_OPTIONAL_HDR_MAGIC
2550 # define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b
2552 #ifndef IMAGE_NT_OPTIONAL_HDR64_MAGIC
2553 # define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
2555 #ifndef IMAGE_NT_OPTIONAL_HDRROM_MAGIC
2556 # define IMAGE_NT_OPTIONAL_HDRROM_MAGIC 0x107
2561 case IMAGE_NT_OPTIONAL_HDR_MAGIC:
2564 case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
2567 case IMAGE_NT_OPTIONAL_HDRROM_MAGIC:
2574 fprintf (file, "Magic\t\t\t%04x", i->Magic);
2576 fprintf (file, "\t(%s)",name);
2577 fprintf (file, "\nMajorLinkerVersion\t%d\n", i->MajorLinkerVersion);
2578 fprintf (file, "MinorLinkerVersion\t%d\n", i->MinorLinkerVersion);
2579 fprintf (file, "SizeOfCode\t\t%08lx\n", (unsigned long) i->SizeOfCode);
2580 fprintf (file, "SizeOfInitializedData\t%08lx\n",
2581 (unsigned long) i->SizeOfInitializedData);
2582 fprintf (file, "SizeOfUninitializedData\t%08lx\n",
2583 (unsigned long) i->SizeOfUninitializedData);
2584 fprintf (file, "AddressOfEntryPoint\t");
2585 bfd_fprintf_vma (abfd, file, i->AddressOfEntryPoint);
2586 fprintf (file, "\nBaseOfCode\t\t");
2587 bfd_fprintf_vma (abfd, file, i->BaseOfCode);
2588 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
2589 /* PE32+ does not have BaseOfData member! */
2590 fprintf (file, "\nBaseOfData\t\t");
2591 bfd_fprintf_vma (abfd, file, i->BaseOfData);
2594 fprintf (file, "\nImageBase\t\t");
2595 bfd_fprintf_vma (abfd, file, i->ImageBase);
2596 fprintf (file, "\nSectionAlignment\t");
2597 bfd_fprintf_vma (abfd, file, i->SectionAlignment);
2598 fprintf (file, "\nFileAlignment\t\t");
2599 bfd_fprintf_vma (abfd, file, i->FileAlignment);
2600 fprintf (file, "\nMajorOSystemVersion\t%d\n", i->MajorOperatingSystemVersion);
2601 fprintf (file, "MinorOSystemVersion\t%d\n", i->MinorOperatingSystemVersion);
2602 fprintf (file, "MajorImageVersion\t%d\n", i->MajorImageVersion);
2603 fprintf (file, "MinorImageVersion\t%d\n", i->MinorImageVersion);
2604 fprintf (file, "MajorSubsystemVersion\t%d\n", i->MajorSubsystemVersion);
2605 fprintf (file, "MinorSubsystemVersion\t%d\n", i->MinorSubsystemVersion);
2606 fprintf (file, "Win32Version\t\t%08lx\n", (unsigned long) i->Reserved1);
2607 fprintf (file, "SizeOfImage\t\t%08lx\n", (unsigned long) i->SizeOfImage);
2608 fprintf (file, "SizeOfHeaders\t\t%08lx\n", (unsigned long) i->SizeOfHeaders);
2609 fprintf (file, "CheckSum\t\t%08lx\n", (unsigned long) i->CheckSum);
2611 switch (i->Subsystem)
2613 case IMAGE_SUBSYSTEM_UNKNOWN:
2614 subsystem_name = "unspecified";
2616 case IMAGE_SUBSYSTEM_NATIVE:
2617 subsystem_name = "NT native";
2619 case IMAGE_SUBSYSTEM_WINDOWS_GUI:
2620 subsystem_name = "Windows GUI";
2622 case IMAGE_SUBSYSTEM_WINDOWS_CUI:
2623 subsystem_name = "Windows CUI";
2625 case IMAGE_SUBSYSTEM_POSIX_CUI:
2626 subsystem_name = "POSIX CUI";
2628 case IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:
2629 subsystem_name = "Wince CUI";
2631 // These are from UEFI Platform Initialization Specification 1.1.
2632 case IMAGE_SUBSYSTEM_EFI_APPLICATION:
2633 subsystem_name = "EFI application";
2635 case IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:
2636 subsystem_name = "EFI boot service driver";
2638 case IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
2639 subsystem_name = "EFI runtime driver";
2641 case IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER:
2642 subsystem_name = "SAL runtime driver";
2644 // This is from revision 8.0 of the MS PE/COFF spec
2645 case IMAGE_SUBSYSTEM_XBOX:
2646 subsystem_name = "XBOX";
2648 // Added default case for clarity - subsystem_name is NULL anyway.
2650 subsystem_name = NULL;
2653 fprintf (file, "Subsystem\t\t%08x", i->Subsystem);
2655 fprintf (file, "\t(%s)", subsystem_name);
2656 fprintf (file, "\nDllCharacteristics\t%08x\n", i->DllCharacteristics);
2657 fprintf (file, "SizeOfStackReserve\t");
2658 bfd_fprintf_vma (abfd, file, i->SizeOfStackReserve);
2659 fprintf (file, "\nSizeOfStackCommit\t");
2660 bfd_fprintf_vma (abfd, file, i->SizeOfStackCommit);
2661 fprintf (file, "\nSizeOfHeapReserve\t");
2662 bfd_fprintf_vma (abfd, file, i->SizeOfHeapReserve);
2663 fprintf (file, "\nSizeOfHeapCommit\t");
2664 bfd_fprintf_vma (abfd, file, i->SizeOfHeapCommit);
2665 fprintf (file, "\nLoaderFlags\t\t%08lx\n", (unsigned long) i->LoaderFlags);
2666 fprintf (file, "NumberOfRvaAndSizes\t%08lx\n",
2667 (unsigned long) i->NumberOfRvaAndSizes);
2669 fprintf (file, "\nThe Data Directory\n");
2670 for (j = 0; j < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; j++)
2672 fprintf (file, "Entry %1x ", j);
2673 bfd_fprintf_vma (abfd, file, i->DataDirectory[j].VirtualAddress);
2674 fprintf (file, " %08lx ", (unsigned long) i->DataDirectory[j].Size);
2675 fprintf (file, "%s\n", dir_names[j]);
2678 pe_print_idata (abfd, vfile);
2679 pe_print_edata (abfd, vfile);
2680 if (bfd_coff_have_print_pdata (abfd))
2681 bfd_coff_print_pdata (abfd, vfile);
2683 pe_print_pdata (abfd, vfile);
2684 pe_print_reloc (abfd, vfile);
2685 pe_print_debugdata (abfd, file);
2687 rsrc_print_section (abfd, vfile);
2692 /* Copy any private info we understand from the input bfd
2693 to the output bfd. */
2696 _bfd_XX_bfd_copy_private_bfd_data_common (bfd * ibfd, bfd * obfd)
2698 pe_data_type *ipe, *ope;
2700 /* One day we may try to grok other private data. */
2701 if (ibfd->xvec->flavour != bfd_target_coff_flavour
2702 || obfd->xvec->flavour != bfd_target_coff_flavour)
2705 ipe = pe_data (ibfd);
2706 ope = pe_data (obfd);
2708 /* pe_opthdr is copied in copy_object. */
2709 ope->dll = ipe->dll;
2711 /* Don't copy input subsystem if output is different from input. */
2712 if (obfd->xvec != ibfd->xvec)
2713 ope->pe_opthdr.Subsystem = IMAGE_SUBSYSTEM_UNKNOWN;
2715 /* For strip: if we removed .reloc, we'll make a real mess of things
2716 if we don't remove this entry as well. */
2717 if (! pe_data (obfd)->has_reloc_section)
2719 pe_data (obfd)->pe_opthdr.DataDirectory[PE_BASE_RELOCATION_TABLE].VirtualAddress = 0;
2720 pe_data (obfd)->pe_opthdr.DataDirectory[PE_BASE_RELOCATION_TABLE].Size = 0;
2723 /* For PIE, if there is .reloc, we won't add IMAGE_FILE_RELOCS_STRIPPED.
2724 But there is no .reloc, we make sure that IMAGE_FILE_RELOCS_STRIPPED
2726 if (! pe_data (ibfd)->has_reloc_section
2727 && ! (pe_data (ibfd)->real_flags & IMAGE_FILE_RELOCS_STRIPPED))
2728 pe_data (obfd)->dont_strip_reloc = 1;
2733 /* Copy private section data. */
2736 _bfd_XX_bfd_copy_private_section_data (bfd *ibfd,
2741 if (bfd_get_flavour (ibfd) != bfd_target_coff_flavour
2742 || bfd_get_flavour (obfd) != bfd_target_coff_flavour)
2745 if (coff_section_data (ibfd, isec) != NULL
2746 && pei_section_data (ibfd, isec) != NULL)
2748 if (coff_section_data (obfd, osec) == NULL)
2750 bfd_size_type amt = sizeof (struct coff_section_tdata);
2751 osec->used_by_bfd = bfd_zalloc (obfd, amt);
2752 if (osec->used_by_bfd == NULL)
2756 if (pei_section_data (obfd, osec) == NULL)
2758 bfd_size_type amt = sizeof (struct pei_section_tdata);
2759 coff_section_data (obfd, osec)->tdata = bfd_zalloc (obfd, amt);
2760 if (coff_section_data (obfd, osec)->tdata == NULL)
2764 pei_section_data (obfd, osec)->virt_size =
2765 pei_section_data (ibfd, isec)->virt_size;
2766 pei_section_data (obfd, osec)->pe_flags =
2767 pei_section_data (ibfd, isec)->pe_flags;
2774 _bfd_XX_get_symbol_info (bfd * abfd, asymbol *symbol, symbol_info *ret)
2776 coff_get_symbol_info (abfd, symbol, ret);
2779 #if !defined(COFF_WITH_pep) && defined(COFF_WITH_pex64)
2781 sort_x64_pdata (const void *l, const void *r)
2783 const char *lp = (const char *) l;
2784 const char *rp = (const char *) r;
2786 vl = bfd_getl32 (lp); vr = bfd_getl32 (rp);
2788 return (vl < vr ? -1 : 1);
2789 /* We compare just begin address. */
2794 /* Functions to process a .rsrc section. */
2796 static unsigned int sizeof_leaves;
2797 static unsigned int sizeof_strings;
2798 static unsigned int sizeof_tables_and_entries;
2801 rsrc_count_directory (bfd *, bfd_byte *, bfd_byte *, bfd_byte *, bfd_vma);
2804 rsrc_count_entries (bfd * abfd,
2805 bfd_boolean is_name,
2806 bfd_byte * datastart,
2811 unsigned long entry, addr, size;
2813 if (data + 8 >= dataend)
2820 entry = (long) bfd_get_32 (abfd, data);
2822 if (HighBitSet (entry))
2823 name = datastart + WithoutHighBit (entry);
2825 name = datastart + entry - rva_bias;
2827 if (name + 2 >= dataend)
2830 unsigned int len = bfd_get_16 (abfd, name);
2831 if (len == 0 || len > 256)
2835 entry = (long) bfd_get_32 (abfd, data + 4);
2837 if (HighBitSet (entry))
2838 return rsrc_count_directory (abfd,
2840 datastart + WithoutHighBit (entry),
2843 if (datastart + entry + 16 >= dataend)
2846 addr = (long) bfd_get_32 (abfd, datastart + entry);
2847 size = (long) bfd_get_32 (abfd, datastart + entry + 4);
2849 return datastart + addr - rva_bias + size;
2853 rsrc_count_directory (bfd * abfd,
2854 bfd_byte * datastart,
2859 unsigned int num_entries, num_ids;
2860 bfd_byte * highest_data = data;
2862 if (data + 16 >= dataend)
2865 num_entries = (int) bfd_get_16 (abfd, data + 12);
2866 num_ids = (int) bfd_get_16 (abfd, data + 14);
2868 num_entries += num_ids;
2872 while (num_entries --)
2874 bfd_byte * entry_end;
2876 entry_end = rsrc_count_entries (abfd, num_entries >= num_ids,
2877 datastart, data, dataend, rva_bias);
2879 highest_data = max (highest_data, entry_end);
2880 if (entry_end >= dataend)
2884 return max (highest_data, data);
2887 typedef struct rsrc_dir_chain
2889 unsigned int num_entries;
2890 struct rsrc_entry * first_entry;
2891 struct rsrc_entry * last_entry;
2894 typedef struct rsrc_directory
2896 unsigned int characteristics;
2901 rsrc_dir_chain names;
2904 struct rsrc_entry * entry;
2907 typedef struct rsrc_string
2913 typedef struct rsrc_leaf
2916 unsigned int codepage;
2920 typedef struct rsrc_entry
2922 bfd_boolean is_name;
2926 struct rsrc_string name;
2932 struct rsrc_directory * directory;
2933 struct rsrc_leaf * leaf;
2936 struct rsrc_entry * next_entry;
2937 struct rsrc_directory * parent;
2941 rsrc_parse_directory (bfd *, rsrc_directory *, bfd_byte *,
2942 bfd_byte *, bfd_byte *, bfd_vma, rsrc_entry *);
2945 rsrc_parse_entry (bfd * abfd,
2946 bfd_boolean is_name,
2948 bfd_byte * datastart,
2952 rsrc_directory * parent)
2954 unsigned long val, addr, size;
2956 val = bfd_get_32 (abfd, data);
2958 entry->parent = parent;
2959 entry->is_name = is_name;
2963 /* FIXME: Add range checking ? */
2964 if (HighBitSet (val))
2966 val = WithoutHighBit (val);
2968 entry->name_id.name.len = bfd_get_16 (abfd, datastart + val);
2969 entry->name_id.name.string = datastart + val + 2;
2973 entry->name_id.name.len = bfd_get_16 (abfd, datastart + val
2975 entry->name_id.name.string = datastart + val - rva_bias + 2;
2979 entry->name_id.id = val;
2981 val = bfd_get_32 (abfd, data + 4);
2983 if (HighBitSet (val))
2985 entry->is_dir = TRUE;
2986 entry->value.directory = bfd_malloc (sizeof * entry->value.directory);
2987 if (entry->value.directory == NULL)
2990 return rsrc_parse_directory (abfd, entry->value.directory,
2992 datastart + WithoutHighBit (val),
2993 dataend, rva_bias, entry);
2996 entry->is_dir = FALSE;
2997 entry->value.leaf = bfd_malloc (sizeof * entry->value.leaf);
2998 if (entry->value.leaf == NULL)
3001 addr = bfd_get_32 (abfd, datastart + val);
3002 size = entry->value.leaf->size = bfd_get_32 (abfd, datastart + val + 4);
3003 entry->value.leaf->codepage = bfd_get_32 (abfd, datastart + val + 8);
3005 entry->value.leaf->data = bfd_malloc (size);
3006 if (entry->value.leaf->data == NULL)
3009 memcpy (entry->value.leaf->data, datastart + addr - rva_bias, size);
3010 return datastart + (addr - rva_bias) + size;
3014 rsrc_parse_entries (bfd * abfd,
3015 rsrc_dir_chain * chain,
3016 bfd_boolean is_name,
3017 bfd_byte * highest_data,
3018 bfd_byte * datastart,
3022 rsrc_directory * parent)
3027 if (chain->num_entries == 0)
3029 chain->first_entry = chain->last_entry = NULL;
3030 return highest_data;
3033 entry = bfd_malloc (sizeof * entry);
3037 chain->first_entry = entry;
3039 for (i = chain->num_entries; i--;)
3041 bfd_byte * entry_end;
3043 entry_end = rsrc_parse_entry (abfd, is_name, entry, datastart,
3044 data, dataend, rva_bias, parent);
3046 highest_data = max (entry_end, highest_data);
3047 if (entry_end > dataend)
3052 entry->next_entry = bfd_malloc (sizeof * entry);
3053 entry = entry->next_entry;
3058 entry->next_entry = NULL;
3061 chain->last_entry = entry;
3063 return highest_data;
3067 rsrc_parse_directory (bfd * abfd,
3068 rsrc_directory * table,
3069 bfd_byte * datastart,
3075 bfd_byte * highest_data = data;
3080 table->characteristics = bfd_get_32 (abfd, data);
3081 table->time = bfd_get_32 (abfd, data + 4);
3082 table->major = bfd_get_16 (abfd, data + 8);
3083 table->minor = bfd_get_16 (abfd, data + 10);
3084 table->names.num_entries = bfd_get_16 (abfd, data + 12);
3085 table->ids.num_entries = bfd_get_16 (abfd, data + 14);
3086 table->entry = entry;
3090 highest_data = rsrc_parse_entries (abfd, & table->names, TRUE, data,
3091 datastart, data, dataend, rva_bias, table);
3092 data += table->names.num_entries * 8;
3094 highest_data = rsrc_parse_entries (abfd, & table->ids, FALSE, highest_data,
3095 datastart, data, dataend, rva_bias, table);
3096 data += table->ids.num_entries * 8;
3098 return max (highest_data, data);
3101 typedef struct rsrc_write_data
3104 bfd_byte * datastart;
3105 bfd_byte * next_table;
3106 bfd_byte * next_leaf;
3107 bfd_byte * next_string;
3108 bfd_byte * next_data;
3113 rsrc_write_string (rsrc_write_data * data,
3114 rsrc_string * string)
3116 bfd_put_16 (data->abfd, string->len, data->next_string);
3117 memcpy (data->next_string + 2, string->string, string->len * 2);
3118 data->next_string += (string->len + 1) * 2;
3121 static inline unsigned int
3122 rsrc_compute_rva (rsrc_write_data * data,
3125 return (addr - data->datastart) + data->rva_bias;
3129 rsrc_write_leaf (rsrc_write_data * data,
3132 bfd_put_32 (data->abfd, rsrc_compute_rva (data, data->next_data),
3134 bfd_put_32 (data->abfd, leaf->size, data->next_leaf + 4);
3135 bfd_put_32 (data->abfd, leaf->codepage, data->next_leaf + 8);
3136 bfd_put_32 (data->abfd, 0 /*reserved*/, data->next_leaf + 12);
3137 data->next_leaf += 16;
3139 memcpy (data->next_data, leaf->data, leaf->size);
3140 /* An undocumented feature of Windows resources is that each unit
3141 of raw data is 8-byte aligned... */
3142 data->next_data += ((leaf->size + 7) & ~7);
3145 static void rsrc_write_directory (rsrc_write_data *, rsrc_directory *);
3148 rsrc_write_entry (rsrc_write_data * data,
3154 bfd_put_32 (data->abfd,
3155 SetHighBit (data->next_string - data->datastart),
3157 rsrc_write_string (data, & entry->name_id.name);
3160 bfd_put_32 (data->abfd, entry->name_id.id, where);
3164 bfd_put_32 (data->abfd,
3165 SetHighBit (data->next_table - data->datastart),
3167 rsrc_write_directory (data, entry->value.directory);
3171 bfd_put_32 (data->abfd, data->next_leaf - data->datastart, where + 4);
3172 rsrc_write_leaf (data, entry->value.leaf);
3177 rsrc_compute_region_sizes (rsrc_directory * dir)
3179 struct rsrc_entry * entry;
3184 sizeof_tables_and_entries += 16;
3186 for (entry = dir->names.first_entry; entry != NULL; entry = entry->next_entry)
3188 sizeof_tables_and_entries += 8;
3190 sizeof_strings += (entry->name_id.name.len + 1) * 2;
3193 rsrc_compute_region_sizes (entry->value.directory);
3195 sizeof_leaves += 16;
3198 for (entry = dir->ids.first_entry; entry != NULL; entry = entry->next_entry)
3200 sizeof_tables_and_entries += 8;
3203 rsrc_compute_region_sizes (entry->value.directory);
3205 sizeof_leaves += 16;
3210 rsrc_write_directory (rsrc_write_data * data,
3211 rsrc_directory * dir)
3215 bfd_byte * next_entry;
3218 bfd_put_32 (data->abfd, dir->characteristics, data->next_table);
3219 bfd_put_32 (data->abfd, 0 /*dir->time*/, data->next_table + 4);
3220 bfd_put_16 (data->abfd, dir->major, data->next_table + 8);
3221 bfd_put_16 (data->abfd, dir->minor, data->next_table + 10);
3222 bfd_put_16 (data->abfd, dir->names.num_entries, data->next_table + 12);
3223 bfd_put_16 (data->abfd, dir->ids.num_entries, data->next_table + 14);
3225 /* Compute where the entries and the next table will be placed. */
3226 next_entry = data->next_table + 16;
3227 data->next_table = next_entry + (dir->names.num_entries * 8)
3228 + (dir->ids.num_entries * 8);
3229 nt = data->next_table;
3231 /* Write the entries. */
3232 for (i = dir->names.num_entries, entry = dir->names.first_entry;
3233 i > 0 && entry != NULL;
3234 i--, entry = entry->next_entry)
3236 BFD_ASSERT (entry->is_name);
3237 rsrc_write_entry (data, next_entry, entry);
3240 BFD_ASSERT (i == 0);
3241 BFD_ASSERT (entry == NULL);
3243 for (i = dir->ids.num_entries, entry = dir->ids.first_entry;
3244 i > 0 && entry != NULL;
3245 i--, entry = entry->next_entry)
3247 BFD_ASSERT (! entry->is_name);
3248 rsrc_write_entry (data, next_entry, entry);
3251 BFD_ASSERT (i == 0);
3252 BFD_ASSERT (entry == NULL);
3253 BFD_ASSERT (nt == next_entry);
3256 #if defined HAVE_WCHAR_H && ! defined __CYGWIN__ && ! defined __MINGW32__
3257 /* Return the length (number of units) of the first character in S,
3258 putting its 'ucs4_t' representation in *PUC. */
3261 u16_mbtouc (wchar_t * puc, const unsigned short * s, unsigned int n)
3263 unsigned short c = * s;
3265 if (c < 0xd800 || c >= 0xe000)
3275 if (s[1] >= 0xdc00 && s[1] < 0xe000)
3277 *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
3283 /* Incomplete multibyte character. */
3289 /* Invalid multibyte character. */
3293 #endif /* HAVE_WCHAR_H and not Cygwin/Mingw */
3295 /* Perform a comparison of two entries. */
3297 rsrc_cmp (bfd_boolean is_name, rsrc_entry * a, rsrc_entry * b)
3306 return a->name_id.id - b->name_id.id;
3308 /* We have to perform a case insenstive, unicode string comparison... */
3309 astring = a->name_id.name.string;
3310 alen = a->name_id.name.len;
3311 bstring = b->name_id.name.string;
3312 blen = b->name_id.name.len;
3314 #if defined __CYGWIN__ || defined __MINGW32__
3315 /* Under Windows hosts (both Cygwin and Mingw types),
3316 unicode == UTF-16 == wchar_t. The case insensitive string comparison
3317 function however goes by different names in the two environments... */
3321 #define rscpcmp wcsncasecmp
3324 #define rscpcmp wcsnicmp
3327 res = rscpcmp ((const wchar_t *) astring, (const wchar_t *) bstring,
3330 #elif defined HAVE_WCHAR_H
3334 for (i = min (alen, blen); i--; astring += 2, bstring += 2)
3339 /* Convert UTF-16 unicode characters into wchar_t characters so
3340 that we can then perform a case insensitive comparison. */
3341 int Alen = u16_mbtouc (& awc, (const unsigned short *) astring, 2);
3342 int Blen = u16_mbtouc (& bwc, (const unsigned short *) bstring, 2);
3346 res = wcsncasecmp (& awc, & bwc, 1);
3352 /* Do the best we can - a case sensitive, untranslated comparison. */
3353 res = memcmp (astring, bstring, min (alen, blen) * 2);
3363 rsrc_print_name (char * buffer, rsrc_string string)
3366 bfd_byte * name = string.string;
3368 for (i = string.len; i--; name += 2)
3369 sprintf (buffer + strlen (buffer), "%.1s", name);
3373 rsrc_resource_name (rsrc_entry * entry, rsrc_directory * dir)
3375 static char buffer [256];
3376 bfd_boolean is_string = FALSE;
3380 if (dir != NULL && dir->entry != NULL && dir->entry->parent != NULL
3381 && dir->entry->parent->entry != NULL)
3383 strcpy (buffer, "type: ");
3384 if (dir->entry->parent->entry->is_name)
3385 rsrc_print_name (buffer + strlen (buffer),
3386 dir->entry->parent->entry->name_id.name);
3389 unsigned int id = dir->entry->parent->entry->name_id.id;
3391 sprintf (buffer + strlen (buffer), "%x", id);
3394 case 1: strcat (buffer, " (CURSOR)"); break;
3395 case 2: strcat (buffer, " (BITMAP)"); break;
3396 case 3: strcat (buffer, " (ICON)"); break;
3397 case 4: strcat (buffer, " (MENU)"); break;
3398 case 5: strcat (buffer, " (DIALOG)"); break;
3399 case 6: strcat (buffer, " (STRING)"); is_string = TRUE; break;
3400 case 7: strcat (buffer, " (FONTDIR)"); break;
3401 case 8: strcat (buffer, " (FONT)"); break;
3402 case 9: strcat (buffer, " (ACCELERATOR)"); break;
3403 case 10: strcat (buffer, " (RCDATA)"); break;
3404 case 11: strcat (buffer, " (MESSAGETABLE)"); break;
3405 case 12: strcat (buffer, " (GROUP_CURSOR)"); break;
3406 case 14: strcat (buffer, " (GROUP_ICON)"); break;
3407 case 16: strcat (buffer, " (VERSION)"); break;
3408 case 17: strcat (buffer, " (DLGINCLUDE)"); break;
3409 case 19: strcat (buffer, " (PLUGPLAY)"); break;
3410 case 20: strcat (buffer, " (VXD)"); break;
3411 case 21: strcat (buffer, " (ANICURSOR)"); break;
3412 case 22: strcat (buffer, " (ANIICON)"); break;
3413 case 23: strcat (buffer, " (HTML)"); break;
3414 case 24: strcat (buffer, " (MANIFEST)"); break;
3415 case 240: strcat (buffer, " (DLGINIT)"); break;
3416 case 241: strcat (buffer, " (TOOLBAR)"); break;
3421 if (dir != NULL && dir->entry != NULL)
3423 strcat (buffer, " name: ");
3424 if (dir->entry->is_name)
3425 rsrc_print_name (buffer + strlen (buffer), dir->entry->name_id.name);
3428 unsigned int id = dir->entry->name_id.id;
3430 sprintf (buffer + strlen (buffer), "%x", id);
3433 sprintf (buffer + strlen (buffer), " (resource id range: %d - %d)",
3434 (id - 1) << 4, (id << 4) - 1);
3440 strcat (buffer, " lang: ");
3443 rsrc_print_name (buffer + strlen (buffer), entry->name_id.name);
3445 sprintf (buffer + strlen (buffer), "%x", entry->name_id.id);
3451 /* *sigh* Windows resource strings are special. Only the top 28-bits of
3452 their ID is stored in the NAME entry. The bottom four bits are used as
3453 an index into unicode string table that makes up the data of the leaf.
3454 So identical type-name-lang string resources may not actually be
3457 This function is called when we have detected two string resources with
3458 match top-28-bit IDs. We have to scan the string tables inside the leaves
3459 and discover if there are any real collisions. If there are then we report
3460 them and return FALSE. Otherwise we copy any strings from B into A and
3461 then return TRUE. */
3464 rsrc_merge_string_entries (rsrc_entry * a ATTRIBUTE_UNUSED,
3465 rsrc_entry * b ATTRIBUTE_UNUSED)
3467 unsigned int copy_needed = 0;
3471 bfd_byte * new_data;
3474 /* Step one: Find out what we have to do. */
3475 BFD_ASSERT (! a->is_dir);
3476 astring = a->value.leaf->data;
3478 BFD_ASSERT (! b->is_dir);
3479 bstring = b->value.leaf->data;
3481 for (i = 0; i < 16; i++)
3483 unsigned int alen = astring[0] + (astring[1] << 8);
3484 unsigned int blen = bstring[0] + (bstring[1] << 8);
3488 copy_needed += blen * 2;
3492 else if (alen != blen)
3493 /* FIXME: Should we continue the loop in order to report other duplicates ? */
3495 /* alen == blen != 0. We might have two identical strings. If so we
3496 can ignore the second one. There is no need for wchar_t vs UTF-16
3497 theatrics here - we are only interested in (case sensitive) equality. */
3498 else if (memcmp (astring + 2, bstring + 2, alen * 2) != 0)
3501 astring += (alen + 1) * 2;
3502 bstring += (blen + 1) * 2;
3507 if (a->parent != NULL
3508 && a->parent->entry != NULL
3509 && a->parent->entry->is_name == FALSE)
3510 _bfd_error_handler (_(".rsrc merge failure: duplicate string resource: %d"),
3511 ((a->parent->entry->name_id.id - 1) << 4) + i);
3515 if (copy_needed == 0)
3518 /* If we reach here then A and B must both have non-colliding strings.
3519 (We never get string resources with fully empty string tables).
3520 We need to allocate an extra COPY_NEEDED bytes in A and then bring
3522 new_data = bfd_malloc (a->value.leaf->size + copy_needed);
3523 if (new_data == NULL)
3527 astring = a->value.leaf->data;
3528 bstring = b->value.leaf->data;
3530 for (i = 0; i < 16; i++)
3532 unsigned int alen = astring[0] + (astring[1] << 8);
3533 unsigned int blen = bstring[0] + (bstring[1] << 8);
3537 memcpy (nstring, astring, (alen + 1) * 2);
3538 nstring += (alen + 1) * 2;
3542 memcpy (nstring, bstring, (blen + 1) * 2);
3543 nstring += (blen + 1) * 2;
3551 astring += (alen + 1) * 2;
3552 bstring += (blen + 1) * 2;
3555 BFD_ASSERT (nstring - new_data == (signed) (a->value.leaf->size + copy_needed));
3557 free (a->value.leaf->data);
3558 a->value.leaf->data = new_data;
3559 a->value.leaf->size += copy_needed;
3564 static void rsrc_merge (rsrc_entry *, rsrc_entry *);
3566 /* Sort the entries in given part of the directory.
3567 We use an old fashioned bubble sort because we are dealing
3568 with lists and we want to handle matches specially. */
3571 rsrc_sort_entries (rsrc_dir_chain * chain,
3572 bfd_boolean is_name,
3573 rsrc_directory * dir)
3577 rsrc_entry ** points_to_entry;
3578 bfd_boolean swapped;
3580 if (chain->num_entries < 2)
3586 points_to_entry = & chain->first_entry;
3587 entry = * points_to_entry;
3588 next = entry->next_entry;
3592 signed int cmp = rsrc_cmp (is_name, entry, next);
3596 entry->next_entry = next->next_entry;
3597 next->next_entry = entry;
3598 * points_to_entry = next;
3599 points_to_entry = & next->next_entry;
3600 next = entry->next_entry;
3605 if (entry->is_dir && next->is_dir)
3607 /* When we encounter identical directory entries we have to
3608 merge them together. The exception to this rule is for
3609 resource manifests - there can only be one of these,
3610 even if they differ in language. Zero-language manifests
3611 are assumed to be default manifests (provided by the
3612 Cygwin/MinGW build system) and these can be silently dropped,
3613 unless that would reduce the number of manifests to zero.
3614 There should only ever be one non-zero lang manifest -
3615 if there are more it is an error. A non-zero lang
3616 manifest takes precedence over a default manifest. */
3617 if (entry->is_name == FALSE
3618 && entry->name_id.id == 1
3620 && dir->entry != NULL
3621 && dir->entry->is_name == FALSE
3622 && dir->entry->name_id.id == 0x18)
3624 if (next->value.directory->names.num_entries == 0
3625 && next->value.directory->ids.num_entries == 1
3626 && next->value.directory->ids.first_entry->is_name == FALSE
3627 && next->value.directory->ids.first_entry->name_id.id == 0)
3628 /* Fall through so that NEXT is dropped. */
3630 else if (entry->value.directory->names.num_entries == 0
3631 && entry->value.directory->ids.num_entries == 1
3632 && entry->value.directory->ids.first_entry->is_name == FALSE
3633 && entry->value.directory->ids.first_entry->name_id.id == 0)
3635 /* Swap ENTRY and NEXT. Then fall through so that the old ENTRY is dropped. */
3636 entry->next_entry = next->next_entry;
3637 next->next_entry = entry;
3638 * points_to_entry = next;
3639 points_to_entry = & next->next_entry;
3640 next = entry->next_entry;
3645 _bfd_error_handler (_(".rsrc merge failure: multiple non-default manifests"));
3646 bfd_set_error (bfd_error_file_truncated);
3650 /* Unhook NEXT from the chain. */
3651 /* FIXME: memory loss here. */
3652 entry->next_entry = next->next_entry;
3653 chain->num_entries --;
3654 if (chain->num_entries < 2)
3656 next = next->next_entry;
3659 rsrc_merge (entry, next);
3661 else if (entry->is_dir != next->is_dir)
3663 _bfd_error_handler (_(".rsrc merge failure: a directory matches a leaf"));
3664 bfd_set_error (bfd_error_file_truncated);
3669 /* Otherwise with identical leaves we issue an error
3670 message - because there should never be duplicates.
3671 The exception is Type 18/Name 1/Lang 0 which is the
3672 defaul manifest - this can just be dropped. */
3673 if (entry->is_name == FALSE
3674 && entry->name_id.id == 0
3676 && dir->entry != NULL
3677 && dir->entry->is_name == FALSE
3678 && dir->entry->name_id.id == 1
3679 && dir->entry->parent != NULL
3680 && dir->entry->parent->entry != NULL
3681 && dir->entry->parent->entry->is_name == FALSE
3682 && dir->entry->parent->entry->name_id.id == 0x18 /* RT_MANIFEST */)
3684 else if (dir != NULL
3685 && dir->entry != NULL
3686 && dir->entry->parent != NULL
3687 && dir->entry->parent->entry != NULL
3688 && dir->entry->parent->entry->is_name == FALSE
3689 && dir->entry->parent->entry->name_id.id == 0x6 /* RT_STRING */)
3691 /* Strings need special handling. */
3692 if (! rsrc_merge_string_entries (entry, next))
3694 /* _bfd_error_handler should have been called inside merge_strings. */
3695 bfd_set_error (bfd_error_file_truncated);
3702 || dir->entry == NULL
3703 || dir->entry->parent == NULL
3704 || dir->entry->parent->entry == NULL)
3705 _bfd_error_handler (_(".rsrc merge failure: duplicate leaf"));
3707 _bfd_error_handler (_(".rsrc merge failure: duplicate leaf: %s"),
3708 rsrc_resource_name (entry, dir));
3709 bfd_set_error (bfd_error_file_truncated);
3714 /* Unhook NEXT from the chain. */
3715 entry->next_entry = next->next_entry;
3716 chain->num_entries --;
3717 if (chain->num_entries < 2)
3719 next = next->next_entry;
3723 points_to_entry = & entry->next_entry;
3725 next = next->next_entry;
3730 chain->last_entry = entry;
3735 /* Attach B's chain onto A. */
3737 rsrc_attach_chain (rsrc_dir_chain * achain, rsrc_dir_chain * bchain)
3739 if (bchain->num_entries == 0)
3742 achain->num_entries += bchain->num_entries;
3744 if (achain->first_entry == NULL)
3746 achain->first_entry = bchain->first_entry;
3747 achain->last_entry = bchain->last_entry;
3751 achain->last_entry->next_entry = bchain->first_entry;
3752 achain->last_entry = bchain->last_entry;
3755 bchain->num_entries = 0;
3756 bchain->first_entry = bchain->last_entry = NULL;
3760 rsrc_merge (struct rsrc_entry * a, struct rsrc_entry * b)
3762 rsrc_directory * adir;
3763 rsrc_directory * bdir;
3765 BFD_ASSERT (a->is_dir);
3766 BFD_ASSERT (b->is_dir);
3768 adir = a->value.directory;
3769 bdir = b->value.directory;
3771 if (adir->characteristics != bdir->characteristics)
3773 _bfd_error_handler (_(".rsrc merge failure: dirs with differing characteristics\n"));
3774 bfd_set_error (bfd_error_file_truncated);
3778 if (adir->major != bdir->major || adir->minor != bdir->minor)
3780 _bfd_error_handler (_(".rsrc merge failure: differing directory versions\n"));
3781 bfd_set_error (bfd_error_file_truncated);
3785 /* Attach B's name chain to A. */
3786 rsrc_attach_chain (& adir->names, & bdir->names);
3788 /* Attach B's ID chain to A. */
3789 rsrc_attach_chain (& adir->ids, & bdir->ids);
3791 /* Now sort A's entries. */
3792 rsrc_sort_entries (& adir->names, TRUE, adir);
3793 rsrc_sort_entries (& adir->ids, FALSE, adir);
3796 /* Check the .rsrc section. If it contains multiple concatenated
3797 resources then we must merge them properly. Otherwise Windows
3798 will ignore all but the first set. */
3801 rsrc_process_section (bfd * abfd,
3802 struct coff_final_link_info * pfinfo)
3804 rsrc_directory new_table;
3810 bfd_byte * datastart;
3812 bfd_byte * new_data;
3813 unsigned int num_resource_sets;
3814 rsrc_directory * type_tables;
3815 rsrc_write_data write_data;
3818 unsigned int num_input_rsrc = 0;
3819 unsigned int max_num_input_rsrc = 4;
3820 ptrdiff_t * rsrc_sizes = NULL;
3822 new_table.names.num_entries = 0;
3823 new_table.ids.num_entries = 0;
3825 sec = bfd_get_section_by_name (abfd, ".rsrc");
3826 if (sec == NULL || (size = sec->rawsize) == 0)
3829 pe = pe_data (abfd);
3833 rva_bias = sec->vma - pe->pe_opthdr.ImageBase;
3835 data = bfd_malloc (size);
3840 if (! bfd_get_section_contents (abfd, sec, data, 0, size))
3843 /* Step zero: Scan the input bfds looking for .rsrc sections and record
3844 their lengths. Note - we rely upon the fact that the linker script
3845 does *not* sort the input .rsrc sections, so that the order in the
3846 linkinfo list matches the order in the output .rsrc section.
3848 We need to know the lengths because each input .rsrc section has padding
3849 at the end of a variable amount. (It does not appear to be based upon
3850 the section alignment or the file alignment). We need to skip any
3851 padding bytes when parsing the input .rsrc sections. */
3852 rsrc_sizes = bfd_malloc (max_num_input_rsrc * sizeof * rsrc_sizes);
3853 if (rsrc_sizes == NULL)
3856 for (input = pfinfo->info->input_bfds;
3858 input = input->link_next)
3860 asection * rsrc_sec = bfd_get_section_by_name (input, ".rsrc");
3862 if (rsrc_sec != NULL)
3864 if (num_input_rsrc == max_num_input_rsrc)
3866 max_num_input_rsrc += 10;
3867 rsrc_sizes = bfd_realloc (rsrc_sizes, max_num_input_rsrc
3868 * sizeof * rsrc_sizes);
3869 if (rsrc_sizes == NULL)
3873 BFD_ASSERT (rsrc_sec->size > 0);
3874 rsrc_sizes [num_input_rsrc ++] = rsrc_sec->size;
3878 if (num_input_rsrc < 2)
3881 /* Step one: Walk the section, computing the size of the tables,
3882 leaves and data and decide if we need to do anything. */
3883 dataend = data + size;
3884 num_resource_sets = 0;
3886 while (data < dataend)
3888 bfd_byte * p = data;
3890 data = rsrc_count_directory (abfd, data, data, dataend, rva_bias);
3894 /* Corrupted .rsrc section - cannot merge. */
3895 _bfd_error_handler (_("%s: .rsrc merge failure: corrupt .rsrc section"),
3896 bfd_get_filename (abfd));
3897 bfd_set_error (bfd_error_file_truncated);
3901 if ((data - p) > rsrc_sizes [num_resource_sets])
3903 _bfd_error_handler (_("%s: .rsrc merge failure: unexpected .rsrc size"),
3904 bfd_get_filename (abfd));
3905 bfd_set_error (bfd_error_file_truncated);
3908 /* FIXME: Should we add a check for "data - p" being much smaller
3909 than rsrc_sizes[num_resource_sets] ? */
3911 data = p + rsrc_sizes[num_resource_sets];
3912 rva_bias += data - p;
3913 ++ num_resource_sets;
3915 BFD_ASSERT (num_resource_sets == num_input_rsrc);
3917 /* Step two: Walk the data again, building trees of the resources. */
3919 rva_bias = sec->vma - pe->pe_opthdr.ImageBase;
3921 type_tables = bfd_malloc (num_resource_sets * sizeof * type_tables);
3922 if (type_tables == NULL)
3926 while (data < dataend)
3928 bfd_byte * p = data;
3930 (void) rsrc_parse_directory (abfd, type_tables + indx, data, data,
3931 dataend, rva_bias, NULL);
3932 data = p + rsrc_sizes[indx];
3933 rva_bias += data - p;
3936 BFD_ASSERT (indx == num_resource_sets);
3938 /* Step three: Merge the top level tables (there can be only one).
3940 We must ensure that the merged entries are in ascending order.
3942 We also thread the top level table entries from the old tree onto
3943 the new table, so that they can be pulled off later. */
3945 /* FIXME: Should we verify that all type tables are the same ? */
3946 new_table.characteristics = type_tables[0].characteristics;
3947 new_table.time = type_tables[0].time;
3948 new_table.major = type_tables[0].major;
3949 new_table.minor = type_tables[0].minor;
3951 /* Chain the NAME entries onto the table. */
3952 new_table.names.first_entry = NULL;
3953 new_table.names.last_entry = NULL;
3955 for (indx = 0; indx < num_resource_sets; indx++)
3956 rsrc_attach_chain (& new_table.names, & type_tables[indx].names);
3958 rsrc_sort_entries (& new_table.names, TRUE, & new_table);
3960 /* Chain the ID entries onto the table. */
3961 new_table.ids.first_entry = NULL;
3962 new_table.ids.last_entry = NULL;
3964 for (indx = 0; indx < num_resource_sets; indx++)
3965 rsrc_attach_chain (& new_table.ids, & type_tables[indx].ids);
3967 rsrc_sort_entries (& new_table.ids, FALSE, & new_table);
3969 /* Step four: Create new contents for the .rsrc section. */
3970 /* Step four point one: Compute the size of each region of the .rsrc section.
3971 We do this now, rather than earlier, as the merging above may have dropped
3973 sizeof_leaves = sizeof_strings = sizeof_tables_and_entries = 0;
3974 rsrc_compute_region_sizes (& new_table);
3975 /* We increment sizeof_strings to make sure that resource data
3976 starts on an 8-byte boundary. FIXME: Is this correct ? */
3977 sizeof_strings = (sizeof_strings + 7) & ~ 7;
3979 new_data = bfd_malloc (size);
3980 if (new_data == NULL)
3983 write_data.abfd = abfd;
3984 write_data.datastart = new_data;
3985 write_data.next_table = new_data;
3986 write_data.next_leaf = new_data + sizeof_tables_and_entries;
3987 write_data.next_string = write_data.next_leaf + sizeof_leaves;
3988 write_data.next_data = write_data.next_string + sizeof_strings;
3989 write_data.rva_bias = sec->vma - pe->pe_opthdr.ImageBase;
3991 rsrc_write_directory (& write_data, & new_table);
3993 /* Step five: Replace the old contents with the new.
3994 We recompute the size as we may have lost entries due to mergeing. */
3995 size = ((write_data.next_data - new_data) + 3) & ~ 3;
3996 bfd_set_section_contents (pfinfo->output_bfd, sec, new_data, 0, size);
3997 sec->size = sec->rawsize = size;
4000 /* Step six: Free all the memory that we have used. */
4001 /* FIXME: Free the resource tree, if we have one. */
4006 /* Handle the .idata section and other things that need symbol table
4010 _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
4012 struct coff_link_hash_entry *h1;
4013 struct bfd_link_info *info = pfinfo->info;
4014 bfd_boolean result = TRUE;
4016 /* There are a few fields that need to be filled in now while we
4017 have symbol table access.
4019 The .idata subsections aren't directly available as sections, but
4020 they are in the symbol table, so get them from there. */
4022 /* The import directory. This is the address of .idata$2, with size
4023 of .idata$2 + .idata$3. */
4024 h1 = coff_link_hash_lookup (coff_hash_table (info),
4025 ".idata$2", FALSE, FALSE, TRUE);
4028 /* PR ld/2729: We cannot rely upon all the output sections having been
4029 created properly, so check before referencing them. Issue a warning
4030 message for any sections tht could not be found. */
4031 if ((h1->root.type == bfd_link_hash_defined
4032 || h1->root.type == bfd_link_hash_defweak)
4033 && h1->root.u.def.section != NULL
4034 && h1->root.u.def.section->output_section != NULL)
4035 pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].VirtualAddress =
4036 (h1->root.u.def.value
4037 + h1->root.u.def.section->output_section->vma
4038 + h1->root.u.def.section->output_offset);
4042 (_("%B: unable to fill in DataDictionary[1] because .idata$2 is missing"),
4047 h1 = coff_link_hash_lookup (coff_hash_table (info),
4048 ".idata$4", FALSE, FALSE, TRUE);
4050 && (h1->root.type == bfd_link_hash_defined
4051 || h1->root.type == bfd_link_hash_defweak)
4052 && h1->root.u.def.section != NULL
4053 && h1->root.u.def.section->output_section != NULL)
4054 pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].Size =
4055 ((h1->root.u.def.value
4056 + h1->root.u.def.section->output_section->vma
4057 + h1->root.u.def.section->output_offset)
4058 - pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].VirtualAddress);
4062 (_("%B: unable to fill in DataDictionary[1] because .idata$4 is missing"),
4067 /* The import address table. This is the size/address of
4069 h1 = coff_link_hash_lookup (coff_hash_table (info),
4070 ".idata$5", FALSE, FALSE, TRUE);
4072 && (h1->root.type == bfd_link_hash_defined
4073 || h1->root.type == bfd_link_hash_defweak)
4074 && h1->root.u.def.section != NULL
4075 && h1->root.u.def.section->output_section != NULL)
4076 pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress =
4077 (h1->root.u.def.value
4078 + h1->root.u.def.section->output_section->vma
4079 + h1->root.u.def.section->output_offset);
4083 (_("%B: unable to fill in DataDictionary[12] because .idata$5 is missing"),
4088 h1 = coff_link_hash_lookup (coff_hash_table (info),
4089 ".idata$6", FALSE, FALSE, TRUE);
4091 && (h1->root.type == bfd_link_hash_defined
4092 || h1->root.type == bfd_link_hash_defweak)
4093 && h1->root.u.def.section != NULL
4094 && h1->root.u.def.section->output_section != NULL)
4095 pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size =
4096 ((h1->root.u.def.value
4097 + h1->root.u.def.section->output_section->vma
4098 + h1->root.u.def.section->output_offset)
4099 - pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress);
4103 (_("%B: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE (12)] because .idata$6 is missing"),
4110 h1 = coff_link_hash_lookup (coff_hash_table (info),
4111 "__IAT_start__", FALSE, FALSE, TRUE);
4113 && (h1->root.type == bfd_link_hash_defined
4114 || h1->root.type == bfd_link_hash_defweak)
4115 && h1->root.u.def.section != NULL
4116 && h1->root.u.def.section->output_section != NULL)
4121 (h1->root.u.def.value
4122 + h1->root.u.def.section->output_section->vma
4123 + h1->root.u.def.section->output_offset);
4125 h1 = coff_link_hash_lookup (coff_hash_table (info),
4126 "__IAT_end__", FALSE, FALSE, TRUE);
4128 && (h1->root.type == bfd_link_hash_defined
4129 || h1->root.type == bfd_link_hash_defweak)
4130 && h1->root.u.def.section != NULL
4131 && h1->root.u.def.section->output_section != NULL)
4133 pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size =
4134 ((h1->root.u.def.value
4135 + h1->root.u.def.section->output_section->vma
4136 + h1->root.u.def.section->output_offset)
4138 if (pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size != 0)
4139 pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress =
4140 iat_va - pe_data (abfd)->pe_opthdr.ImageBase;
4145 (_("%B: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE(12)]"
4146 " because .idata$6 is missing"), abfd);
4152 h1 = coff_link_hash_lookup (coff_hash_table (info),
4153 (bfd_get_symbol_leading_char (abfd) != 0
4154 ? "__tls_used" : "_tls_used"),
4155 FALSE, FALSE, TRUE);
4158 if ((h1->root.type == bfd_link_hash_defined
4159 || h1->root.type == bfd_link_hash_defweak)
4160 && h1->root.u.def.section != NULL
4161 && h1->root.u.def.section->output_section != NULL)
4162 pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].VirtualAddress =
4163 (h1->root.u.def.value
4164 + h1->root.u.def.section->output_section->vma
4165 + h1->root.u.def.section->output_offset
4166 - pe_data (abfd)->pe_opthdr.ImageBase);
4170 (_("%B: unable to fill in DataDictionary[9] because __tls_used is missing"),
4174 /* According to PECOFF sepcifications by Microsoft version 8.2
4175 the TLS data directory consists of 4 pointers, followed
4176 by two 4-byte integer. This implies that the total size
4177 is different for 32-bit and 64-bit executables. */
4178 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64)
4179 pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].Size = 0x18;
4181 pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].Size = 0x28;
4185 /* If there is a .pdata section and we have linked pdata finally, we
4186 need to sort the entries ascending. */
4187 #if !defined(COFF_WITH_pep) && defined(COFF_WITH_pex64)
4189 asection *sec = bfd_get_section_by_name (abfd, ".pdata");
4193 bfd_size_type x = sec->rawsize;
4194 bfd_byte *tmp_data = NULL;
4197 tmp_data = bfd_malloc (x);
4199 if (tmp_data != NULL)
4201 if (bfd_get_section_contents (abfd, sec, tmp_data, 0, x))
4205 12, sort_x64_pdata);
4206 bfd_set_section_contents (pfinfo->output_bfd, sec,
4215 rsrc_process_section (abfd, pfinfo);
4217 /* If we couldn't find idata$2, we either have an excessively
4218 trivial program or are in DEEP trouble; we have to assume trivial