1 /* Support for the generic parts of PE/PEI; the common executable parts.
2 Copyright (C) 1995-2022 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 PE/PEI format is also used by .NET. ECMA-335 describes this:
40 "Standard ECMA-335 Common Language Infrastructure (CLI)", 6th Edition, June 2012.
42 This is also available at
43 https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf.
45 The *sole* difference between the pe format and the pei format is that the
46 latter has an MSDOS 2.0 .exe header on the front that prints the message
47 "This app must be run under Windows." (or some such).
48 (FIXME: Whether that statement is *really* true or not is unknown.
49 Are there more subtle differences between pe and pei formats?
50 For now assume there aren't. If you find one, then for God sakes
53 The Microsoft docs use the word "image" instead of "executable" because
54 the former can also refer to a DLL (shared library). Confusion can arise
55 because the `i' in `pei' also refers to "image". The `pe' format can
56 also create images (i.e. executables), it's just that to run on a win32
57 system you need to use the pei format.
59 FIXME: Please add more docs here so the next poor fool that has to hack
60 on this code has a chance of getting something accomplished without
61 wasting too much time. */
63 /* This expands into COFF_WITH_pe, COFF_WITH_pep, COFF_WITH_pex64 or
64 COFF_WITH_peAArch64 depending on whether we're compiling for straight
71 #include "coff/internal.h"
73 #include "libiberty.h"
77 /* NOTE: it's strange to be including an architecture specific header
78 in what's supposed to be general (to PE/PEI) code. However, that's
79 where the definitions are, and they don't vary per architecture
80 within PE/PEI, so we get them from there. FIXME: The lack of
81 variance is an assumption which may prove to be incorrect if new
82 PE/PEI targets are created. */
83 #if defined COFF_WITH_pex64
84 # include "coff/x86_64.h"
85 #elif defined COFF_WITH_pep
86 # include "coff/ia64.h"
87 #elif defined COFF_WITH_peAArch64
88 # include "coff/aarch64.h"
90 # include "coff/i386.h"
96 #include "safe-ctype.h"
98 #if defined COFF_WITH_pep || defined COFF_WITH_pex64 || defined COFF_WITH_peAArch64
100 # define AOUTSZ PEPAOUTSZ
101 # define PEAOUTHDR PEPAOUTHDR
104 #define HighBitSet(val) ((val) & 0x80000000)
105 #define SetHighBit(val) ((val) | 0x80000000)
106 #define WithoutHighBit(val) ((val) & 0x7fffffff)
109 _bfd_XXi_swap_sym_in (bfd
* abfd
, void * ext1
, void * in1
)
111 SYMENT
*ext
= (SYMENT
*) ext1
;
112 struct internal_syment
*in
= (struct internal_syment
*) in1
;
114 if (ext
->e
.e_name
[0] == 0)
116 in
->_n
._n_n
._n_zeroes
= 0;
117 in
->_n
._n_n
._n_offset
= H_GET_32 (abfd
, ext
->e
.e
.e_offset
);
120 memcpy (in
->_n
._n_name
, ext
->e
.e_name
, SYMNMLEN
);
122 in
->n_value
= H_GET_32 (abfd
, ext
->e_value
);
123 in
->n_scnum
= (short) H_GET_16 (abfd
, ext
->e_scnum
);
125 if (sizeof (ext
->e_type
) == 2)
126 in
->n_type
= H_GET_16 (abfd
, ext
->e_type
);
128 in
->n_type
= H_GET_32 (abfd
, ext
->e_type
);
130 in
->n_sclass
= H_GET_8 (abfd
, ext
->e_sclass
);
131 in
->n_numaux
= H_GET_8 (abfd
, ext
->e_numaux
);
133 #ifndef STRICT_PE_FORMAT
134 /* This is for Gnu-created DLLs. */
136 /* The section symbols for the .idata$ sections have class 0x68
137 (C_SECTION), which MS documentation indicates is a section
138 symbol. Unfortunately, the value field in the symbol is simply a
139 copy of the .idata section's flags rather than something useful.
140 When these symbols are encountered, change the value to 0 so that
141 they will be handled somewhat correctly in the bfd code. */
142 if (in
->n_sclass
== C_SECTION
)
144 char namebuf
[SYMNMLEN
+ 1];
145 const char *name
= NULL
;
149 /* Create synthetic empty sections as needed. DJ */
150 if (in
->n_scnum
== 0)
154 name
= _bfd_coff_internal_syment_name (abfd
, in
, namebuf
);
157 _bfd_error_handler (_("%pB: unable to find name for empty section"),
159 bfd_set_error (bfd_error_invalid_target
);
163 sec
= bfd_get_section_by_name (abfd
, name
);
165 in
->n_scnum
= sec
->target_index
;
168 if (in
->n_scnum
== 0)
170 int unused_section_number
= 0;
176 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
177 if (unused_section_number
<= sec
->target_index
)
178 unused_section_number
= sec
->target_index
+ 1;
180 name_len
= strlen (name
) + 1;
181 sec_name
= bfd_alloc (abfd
, name_len
);
182 if (sec_name
== NULL
)
184 _bfd_error_handler (_("%pB: out of memory creating name "
185 "for empty section"), abfd
);
188 memcpy (sec_name
, name
, name_len
);
190 flags
= SEC_HAS_CONTENTS
| SEC_ALLOC
| SEC_DATA
| SEC_LOAD
;
191 sec
= bfd_make_section_anyway_with_flags (abfd
, sec_name
, flags
);
194 _bfd_error_handler (_("%pB: unable to create fake empty section"),
203 sec
->rel_filepos
= 0;
204 sec
->reloc_count
= 0;
205 sec
->line_filepos
= 0;
206 sec
->lineno_count
= 0;
207 sec
->userdata
= NULL
;
209 sec
->alignment_power
= 2;
211 sec
->target_index
= unused_section_number
;
213 in
->n_scnum
= unused_section_number
;
215 in
->n_sclass
= C_STAT
;
221 abs_finder (bfd
* abfd ATTRIBUTE_UNUSED
, asection
* sec
, void * data
)
223 bfd_vma abs_val
= * (bfd_vma
*) data
;
225 return (sec
->vma
<= abs_val
) && ((sec
->vma
+ (1ULL << 32)) > abs_val
);
229 _bfd_XXi_swap_sym_out (bfd
* abfd
, void * inp
, void * extp
)
231 struct internal_syment
*in
= (struct internal_syment
*) inp
;
232 SYMENT
*ext
= (SYMENT
*) extp
;
234 if (in
->_n
._n_name
[0] == 0)
236 H_PUT_32 (abfd
, 0, ext
->e
.e
.e_zeroes
);
237 H_PUT_32 (abfd
, in
->_n
._n_n
._n_offset
, ext
->e
.e
.e_offset
);
240 memcpy (ext
->e
.e_name
, in
->_n
._n_name
, SYMNMLEN
);
242 /* The PE32 and PE32+ formats only use 4 bytes to hold the value of a
243 symbol. This is a problem on 64-bit targets where we can generate
244 absolute symbols with values >= 1^32. We try to work around this
245 problem by finding a section whose base address is sufficient to
246 reduce the absolute value to < 1^32, and then transforming the
247 symbol into a section relative symbol. This of course is a hack. */
248 if (sizeof (in
->n_value
) > 4
249 /* The strange computation of the shift amount is here in order to
250 avoid a compile time warning about the comparison always being
251 false. It does not matter if this test fails to work as expected
252 as the worst that can happen is that some absolute symbols are
253 needlessly converted into section relative symbols. */
254 && in
->n_value
> ((1ULL << (sizeof (in
->n_value
) > 4 ? 32 : 31)) - 1)
255 && in
->n_scnum
== N_ABS
)
259 sec
= bfd_sections_find_if (abfd
, abs_finder
, & in
->n_value
);
262 in
->n_value
-= sec
->vma
;
263 in
->n_scnum
= sec
->target_index
;
265 /* else: FIXME: The value is outside the range of any section. This
266 happens for __image_base__ and __ImageBase and maybe some other
267 symbols as well. We should find a way to handle these values. */
270 H_PUT_32 (abfd
, in
->n_value
, ext
->e_value
);
271 H_PUT_16 (abfd
, in
->n_scnum
, ext
->e_scnum
);
273 if (sizeof (ext
->e_type
) == 2)
274 H_PUT_16 (abfd
, in
->n_type
, ext
->e_type
);
276 H_PUT_32 (abfd
, in
->n_type
, ext
->e_type
);
278 H_PUT_8 (abfd
, in
->n_sclass
, ext
->e_sclass
);
279 H_PUT_8 (abfd
, in
->n_numaux
, ext
->e_numaux
);
285 _bfd_XXi_swap_aux_in (bfd
* abfd
,
289 int indx ATTRIBUTE_UNUSED
,
290 int numaux ATTRIBUTE_UNUSED
,
293 AUXENT
*ext
= (AUXENT
*) ext1
;
294 union internal_auxent
*in
= (union internal_auxent
*) in1
;
296 /* PR 17521: Make sure that all fields in the aux structure
298 memset (in
, 0, sizeof * in
);
302 if (ext
->x_file
.x_fname
[0] == 0)
304 in
->x_file
.x_n
.x_n
.x_zeroes
= 0;
305 in
->x_file
.x_n
.x_n
.x_offset
= H_GET_32 (abfd
, ext
->x_file
.x_n
.x_offset
);
308 memcpy (in
->x_file
.x_n
.x_fname
, ext
->x_file
.x_fname
, FILNMLEN
);
316 in
->x_scn
.x_scnlen
= GET_SCN_SCNLEN (abfd
, ext
);
317 in
->x_scn
.x_nreloc
= GET_SCN_NRELOC (abfd
, ext
);
318 in
->x_scn
.x_nlinno
= GET_SCN_NLINNO (abfd
, ext
);
319 in
->x_scn
.x_checksum
= H_GET_32 (abfd
, ext
->x_scn
.x_checksum
);
320 in
->x_scn
.x_associated
= H_GET_16 (abfd
, ext
->x_scn
.x_associated
);
321 in
->x_scn
.x_comdat
= H_GET_8 (abfd
, ext
->x_scn
.x_comdat
);
327 in
->x_sym
.x_tagndx
.l
= H_GET_32 (abfd
, ext
->x_sym
.x_tagndx
);
328 in
->x_sym
.x_tvndx
= H_GET_16 (abfd
, ext
->x_sym
.x_tvndx
);
330 if (in_class
== C_BLOCK
|| in_class
== C_FCN
|| ISFCN (type
)
333 in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
= GET_FCN_LNNOPTR (abfd
, ext
);
334 in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
= GET_FCN_ENDNDX (abfd
, ext
);
338 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0] =
339 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
340 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1] =
341 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
342 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2] =
343 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
344 in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3] =
345 H_GET_16 (abfd
, ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
350 in
->x_sym
.x_misc
.x_fsize
= H_GET_32 (abfd
, ext
->x_sym
.x_misc
.x_fsize
);
354 in
->x_sym
.x_misc
.x_lnsz
.x_lnno
= GET_LNSZ_LNNO (abfd
, ext
);
355 in
->x_sym
.x_misc
.x_lnsz
.x_size
= GET_LNSZ_SIZE (abfd
, ext
);
360 _bfd_XXi_swap_aux_out (bfd
* abfd
,
364 int indx ATTRIBUTE_UNUSED
,
365 int numaux ATTRIBUTE_UNUSED
,
368 union internal_auxent
*in
= (union internal_auxent
*) inp
;
369 AUXENT
*ext
= (AUXENT
*) extp
;
371 memset (ext
, 0, AUXESZ
);
376 if (in
->x_file
.x_n
.x_fname
[0] == 0)
378 H_PUT_32 (abfd
, 0, ext
->x_file
.x_n
.x_zeroes
);
379 H_PUT_32 (abfd
, in
->x_file
.x_n
.x_n
.x_offset
, ext
->x_file
.x_n
.x_offset
);
382 memcpy (ext
->x_file
.x_fname
, in
->x_file
.x_n
.x_fname
, sizeof (ext
->x_file
.x_fname
));
391 PUT_SCN_SCNLEN (abfd
, in
->x_scn
.x_scnlen
, ext
);
392 PUT_SCN_NRELOC (abfd
, in
->x_scn
.x_nreloc
, ext
);
393 PUT_SCN_NLINNO (abfd
, in
->x_scn
.x_nlinno
, ext
);
394 H_PUT_32 (abfd
, in
->x_scn
.x_checksum
, ext
->x_scn
.x_checksum
);
395 H_PUT_16 (abfd
, in
->x_scn
.x_associated
, ext
->x_scn
.x_associated
);
396 H_PUT_8 (abfd
, in
->x_scn
.x_comdat
, ext
->x_scn
.x_comdat
);
402 H_PUT_32 (abfd
, in
->x_sym
.x_tagndx
.l
, ext
->x_sym
.x_tagndx
);
403 H_PUT_16 (abfd
, in
->x_sym
.x_tvndx
, ext
->x_sym
.x_tvndx
);
405 if (in_class
== C_BLOCK
|| in_class
== C_FCN
|| ISFCN (type
)
408 PUT_FCN_LNNOPTR (abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_lnnoptr
, ext
);
409 PUT_FCN_ENDNDX (abfd
, in
->x_sym
.x_fcnary
.x_fcn
.x_endndx
.l
, ext
);
413 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0],
414 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[0]);
415 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1],
416 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[1]);
417 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2],
418 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[2]);
419 H_PUT_16 (abfd
, in
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3],
420 ext
->x_sym
.x_fcnary
.x_ary
.x_dimen
[3]);
424 H_PUT_32 (abfd
, in
->x_sym
.x_misc
.x_fsize
, ext
->x_sym
.x_misc
.x_fsize
);
427 PUT_LNSZ_LNNO (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_lnno
, ext
);
428 PUT_LNSZ_SIZE (abfd
, in
->x_sym
.x_misc
.x_lnsz
.x_size
, ext
);
435 _bfd_XXi_swap_lineno_in (bfd
* abfd
, void * ext1
, void * in1
)
437 LINENO
*ext
= (LINENO
*) ext1
;
438 struct internal_lineno
*in
= (struct internal_lineno
*) in1
;
440 in
->l_addr
.l_symndx
= H_GET_32 (abfd
, ext
->l_addr
.l_symndx
);
441 in
->l_lnno
= GET_LINENO_LNNO (abfd
, ext
);
445 _bfd_XXi_swap_lineno_out (bfd
* abfd
, void * inp
, void * outp
)
447 struct internal_lineno
*in
= (struct internal_lineno
*) inp
;
448 struct external_lineno
*ext
= (struct external_lineno
*) outp
;
449 H_PUT_32 (abfd
, in
->l_addr
.l_symndx
, ext
->l_addr
.l_symndx
);
451 PUT_LINENO_LNNO (abfd
, in
->l_lnno
, ext
);
456 _bfd_XXi_swap_aouthdr_in (bfd
* abfd
,
460 PEAOUTHDR
* src
= (PEAOUTHDR
*) aouthdr_ext1
;
461 AOUTHDR
* aouthdr_ext
= (AOUTHDR
*) aouthdr_ext1
;
462 struct internal_aouthdr
*aouthdr_int
463 = (struct internal_aouthdr
*) aouthdr_int1
;
464 struct internal_extra_pe_aouthdr
*a
= &aouthdr_int
->pe
;
466 aouthdr_int
->magic
= H_GET_16 (abfd
, aouthdr_ext
->magic
);
467 aouthdr_int
->vstamp
= H_GET_16 (abfd
, aouthdr_ext
->vstamp
);
468 aouthdr_int
->tsize
= GET_AOUTHDR_TSIZE (abfd
, aouthdr_ext
->tsize
);
469 aouthdr_int
->dsize
= GET_AOUTHDR_DSIZE (abfd
, aouthdr_ext
->dsize
);
470 aouthdr_int
->bsize
= GET_AOUTHDR_BSIZE (abfd
, aouthdr_ext
->bsize
);
471 aouthdr_int
->entry
= GET_AOUTHDR_ENTRY (abfd
, aouthdr_ext
->entry
);
472 aouthdr_int
->text_start
=
473 GET_AOUTHDR_TEXT_START (abfd
, aouthdr_ext
->text_start
);
475 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64)
476 /* PE32+ does not have data_start member! */
477 aouthdr_int
->data_start
=
478 GET_AOUTHDR_DATA_START (abfd
, aouthdr_ext
->data_start
);
479 a
->BaseOfData
= aouthdr_int
->data_start
;
482 a
->Magic
= aouthdr_int
->magic
;
483 a
->MajorLinkerVersion
= H_GET_8 (abfd
, aouthdr_ext
->vstamp
);
484 a
->MinorLinkerVersion
= H_GET_8 (abfd
, aouthdr_ext
->vstamp
+ 1);
485 a
->SizeOfCode
= aouthdr_int
->tsize
;
486 a
->SizeOfInitializedData
= aouthdr_int
->dsize
;
487 a
->SizeOfUninitializedData
= aouthdr_int
->bsize
;
488 a
->AddressOfEntryPoint
= aouthdr_int
->entry
;
489 a
->BaseOfCode
= aouthdr_int
->text_start
;
490 a
->ImageBase
= GET_OPTHDR_IMAGE_BASE (abfd
, src
->ImageBase
);
491 a
->SectionAlignment
= H_GET_32 (abfd
, src
->SectionAlignment
);
492 a
->FileAlignment
= H_GET_32 (abfd
, src
->FileAlignment
);
493 a
->MajorOperatingSystemVersion
=
494 H_GET_16 (abfd
, src
->MajorOperatingSystemVersion
);
495 a
->MinorOperatingSystemVersion
=
496 H_GET_16 (abfd
, src
->MinorOperatingSystemVersion
);
497 a
->MajorImageVersion
= H_GET_16 (abfd
, src
->MajorImageVersion
);
498 a
->MinorImageVersion
= H_GET_16 (abfd
, src
->MinorImageVersion
);
499 a
->MajorSubsystemVersion
= H_GET_16 (abfd
, src
->MajorSubsystemVersion
);
500 a
->MinorSubsystemVersion
= H_GET_16 (abfd
, src
->MinorSubsystemVersion
);
501 a
->Reserved1
= H_GET_32 (abfd
, src
->Reserved1
);
502 a
->SizeOfImage
= H_GET_32 (abfd
, src
->SizeOfImage
);
503 a
->SizeOfHeaders
= H_GET_32 (abfd
, src
->SizeOfHeaders
);
504 a
->CheckSum
= H_GET_32 (abfd
, src
->CheckSum
);
505 a
->Subsystem
= H_GET_16 (abfd
, src
->Subsystem
);
506 a
->DllCharacteristics
= H_GET_16 (abfd
, src
->DllCharacteristics
);
507 a
->SizeOfStackReserve
=
508 GET_OPTHDR_SIZE_OF_STACK_RESERVE (abfd
, src
->SizeOfStackReserve
);
509 a
->SizeOfStackCommit
=
510 GET_OPTHDR_SIZE_OF_STACK_COMMIT (abfd
, src
->SizeOfStackCommit
);
511 a
->SizeOfHeapReserve
=
512 GET_OPTHDR_SIZE_OF_HEAP_RESERVE (abfd
, src
->SizeOfHeapReserve
);
513 a
->SizeOfHeapCommit
=
514 GET_OPTHDR_SIZE_OF_HEAP_COMMIT (abfd
, src
->SizeOfHeapCommit
);
515 a
->LoaderFlags
= H_GET_32 (abfd
, src
->LoaderFlags
);
516 a
->NumberOfRvaAndSizes
= H_GET_32 (abfd
, src
->NumberOfRvaAndSizes
);
521 /* PR 17512: Corrupt PE binaries can cause seg-faults. */
522 if (a
->NumberOfRvaAndSizes
> IMAGE_NUMBEROF_DIRECTORY_ENTRIES
)
524 /* xgettext:c-format */
526 (_("%pB: aout header specifies an invalid number of"
527 " data-directory entries: %u"), abfd
, a
->NumberOfRvaAndSizes
);
528 bfd_set_error (bfd_error_bad_value
);
530 /* Paranoia: If the number is corrupt, then assume that the
531 actual entries themselves might be corrupt as well. */
532 a
->NumberOfRvaAndSizes
= 0;
535 for (idx
= 0; idx
< a
->NumberOfRvaAndSizes
; idx
++)
537 /* If data directory is empty, rva also should be 0. */
539 H_GET_32 (abfd
, src
->DataDirectory
[idx
][1]);
541 a
->DataDirectory
[idx
].Size
= size
;
544 a
->DataDirectory
[idx
].VirtualAddress
=
545 H_GET_32 (abfd
, src
->DataDirectory
[idx
][0]);
547 a
->DataDirectory
[idx
].VirtualAddress
= 0;
550 while (idx
< IMAGE_NUMBEROF_DIRECTORY_ENTRIES
)
552 a
->DataDirectory
[idx
].Size
= 0;
553 a
->DataDirectory
[idx
].VirtualAddress
= 0;
558 if (aouthdr_int
->entry
)
560 aouthdr_int
->entry
+= a
->ImageBase
;
561 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64)
562 aouthdr_int
->entry
&= 0xffffffff;
566 if (aouthdr_int
->tsize
)
568 aouthdr_int
->text_start
+= a
->ImageBase
;
569 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64)
570 aouthdr_int
->text_start
&= 0xffffffff;
574 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64)
575 /* PE32+ does not have data_start member! */
576 if (aouthdr_int
->dsize
)
578 aouthdr_int
->data_start
+= a
->ImageBase
;
579 aouthdr_int
->data_start
&= 0xffffffff;
584 /* A support function for below. */
587 add_data_entry (bfd
* abfd
,
588 struct internal_extra_pe_aouthdr
*aout
,
593 asection
*sec
= bfd_get_section_by_name (abfd
, name
);
595 /* Add import directory information if it exists. */
597 && (coff_section_data (abfd
, sec
) != NULL
)
598 && (pei_section_data (abfd
, sec
) != NULL
))
600 /* If data directory is empty, rva also should be 0. */
601 int size
= pei_section_data (abfd
, sec
)->virt_size
;
602 aout
->DataDirectory
[idx
].Size
= size
;
606 aout
->DataDirectory
[idx
].VirtualAddress
=
607 (sec
->vma
- base
) & 0xffffffff;
608 sec
->flags
|= SEC_DATA
;
614 _bfd_XXi_swap_aouthdr_out (bfd
* abfd
, void * in
, void * out
)
616 struct internal_aouthdr
*aouthdr_in
= (struct internal_aouthdr
*) in
;
617 pe_data_type
*pe
= pe_data (abfd
);
618 struct internal_extra_pe_aouthdr
*extra
= &pe
->pe_opthdr
;
619 PEAOUTHDR
*aouthdr_out
= (PEAOUTHDR
*) out
;
621 IMAGE_DATA_DIRECTORY idata2
, idata5
, tls
;
623 sa
= extra
->SectionAlignment
;
624 fa
= extra
->FileAlignment
;
625 ib
= extra
->ImageBase
;
627 idata2
= pe
->pe_opthdr
.DataDirectory
[PE_IMPORT_TABLE
];
628 idata5
= pe
->pe_opthdr
.DataDirectory
[PE_IMPORT_ADDRESS_TABLE
];
629 tls
= pe
->pe_opthdr
.DataDirectory
[PE_TLS_TABLE
];
631 if (aouthdr_in
->tsize
)
633 aouthdr_in
->text_start
-= ib
;
634 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64)
635 aouthdr_in
->text_start
&= 0xffffffff;
639 if (aouthdr_in
->dsize
)
641 aouthdr_in
->data_start
-= ib
;
642 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64)
643 aouthdr_in
->data_start
&= 0xffffffff;
647 if (aouthdr_in
->entry
)
649 aouthdr_in
->entry
-= ib
;
650 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64)
651 aouthdr_in
->entry
&= 0xffffffff;
655 #define FA(x) (((x) + fa -1 ) & (- fa))
656 #define SA(x) (((x) + sa -1 ) & (- sa))
658 /* We like to have the sizes aligned. */
659 aouthdr_in
->bsize
= FA (aouthdr_in
->bsize
);
661 extra
->NumberOfRvaAndSizes
= IMAGE_NUMBEROF_DIRECTORY_ENTRIES
;
663 add_data_entry (abfd
, extra
, PE_EXPORT_TABLE
, ".edata", ib
);
664 add_data_entry (abfd
, extra
, PE_RESOURCE_TABLE
, ".rsrc", ib
);
665 add_data_entry (abfd
, extra
, PE_EXCEPTION_TABLE
, ".pdata", ib
);
667 /* In theory we do not need to call add_data_entry for .idata$2 or
668 .idata$5. It will be done in bfd_coff_final_link where all the
669 required information is available. If however, we are not going
670 to perform a final link, eg because we have been invoked by objcopy
671 or strip, then we need to make sure that these Data Directory
672 entries are initialised properly.
674 So - we copy the input values into the output values, and then, if
675 a final link is going to be performed, it can overwrite them. */
676 extra
->DataDirectory
[PE_IMPORT_TABLE
] = idata2
;
677 extra
->DataDirectory
[PE_IMPORT_ADDRESS_TABLE
] = idata5
;
678 extra
->DataDirectory
[PE_TLS_TABLE
] = tls
;
680 if (extra
->DataDirectory
[PE_IMPORT_TABLE
].VirtualAddress
== 0)
681 /* Until other .idata fixes are made (pending patch), the entry for
682 .idata is needed for backwards compatibility. FIXME. */
683 add_data_entry (abfd
, extra
, PE_IMPORT_TABLE
, ".idata", ib
);
685 /* For some reason, the virtual size (which is what's set by
686 add_data_entry) for .reloc is not the same as the size recorded
687 in this slot by MSVC; it doesn't seem to cause problems (so far),
688 but since it's the best we've got, use it. It does do the right
690 if (pe
->has_reloc_section
)
691 add_data_entry (abfd
, extra
, PE_BASE_RELOCATION_TABLE
, ".reloc", ib
);
700 for (sec
= abfd
->sections
; sec
; sec
= sec
->next
)
702 int rounded
= FA (sec
->size
);
707 /* The first non-zero section filepos is the header size.
708 Sections without contents will have a filepos of 0. */
710 hsize
= sec
->filepos
;
711 if (sec
->flags
& SEC_DATA
)
713 if (sec
->flags
& SEC_CODE
)
715 /* The image size is the total VIRTUAL size (which is what is
716 in the virt_size field). Files have been seen (from MSVC
717 5.0 link.exe) where the file size of the .data segment is
718 quite small compared to the virtual size. Without this
719 fix, strip munges the file.
721 FIXME: We need to handle holes between sections, which may
722 happpen when we covert from another format. We just use
723 the virtual address and virtual size of the last section
724 for the image size. */
725 if (coff_section_data (abfd
, sec
) != NULL
726 && pei_section_data (abfd
, sec
) != NULL
)
727 isize
= (sec
->vma
- extra
->ImageBase
728 + SA (FA (pei_section_data (abfd
, sec
)->virt_size
)));
731 aouthdr_in
->dsize
= dsize
;
732 aouthdr_in
->tsize
= tsize
;
733 extra
->SizeOfHeaders
= hsize
;
734 extra
->SizeOfImage
= isize
;
737 H_PUT_16 (abfd
, aouthdr_in
->magic
, aouthdr_out
->standard
.magic
);
739 if (extra
->MajorLinkerVersion
|| extra
->MinorLinkerVersion
)
741 H_PUT_8 (abfd
, extra
->MajorLinkerVersion
,
742 aouthdr_out
->standard
.vstamp
);
743 H_PUT_8 (abfd
, extra
->MinorLinkerVersion
,
744 aouthdr_out
->standard
.vstamp
+ 1);
748 /* e.g. 219510000 is linker version 2.19 */
749 #define LINKER_VERSION ((short) (BFD_VERSION / 1000000))
751 /* This piece of magic sets the "linker version" field to
753 H_PUT_16 (abfd
, (LINKER_VERSION
/ 100 + (LINKER_VERSION
% 100) * 256),
754 aouthdr_out
->standard
.vstamp
);
757 PUT_AOUTHDR_TSIZE (abfd
, aouthdr_in
->tsize
, aouthdr_out
->standard
.tsize
);
758 PUT_AOUTHDR_DSIZE (abfd
, aouthdr_in
->dsize
, aouthdr_out
->standard
.dsize
);
759 PUT_AOUTHDR_BSIZE (abfd
, aouthdr_in
->bsize
, aouthdr_out
->standard
.bsize
);
760 PUT_AOUTHDR_ENTRY (abfd
, aouthdr_in
->entry
, aouthdr_out
->standard
.entry
);
761 PUT_AOUTHDR_TEXT_START (abfd
, aouthdr_in
->text_start
,
762 aouthdr_out
->standard
.text_start
);
764 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64)
765 /* PE32+ does not have data_start member! */
766 PUT_AOUTHDR_DATA_START (abfd
, aouthdr_in
->data_start
,
767 aouthdr_out
->standard
.data_start
);
770 PUT_OPTHDR_IMAGE_BASE (abfd
, extra
->ImageBase
, aouthdr_out
->ImageBase
);
771 H_PUT_32 (abfd
, extra
->SectionAlignment
, aouthdr_out
->SectionAlignment
);
772 H_PUT_32 (abfd
, extra
->FileAlignment
, aouthdr_out
->FileAlignment
);
773 H_PUT_16 (abfd
, extra
->MajorOperatingSystemVersion
,
774 aouthdr_out
->MajorOperatingSystemVersion
);
775 H_PUT_16 (abfd
, extra
->MinorOperatingSystemVersion
,
776 aouthdr_out
->MinorOperatingSystemVersion
);
777 H_PUT_16 (abfd
, extra
->MajorImageVersion
, aouthdr_out
->MajorImageVersion
);
778 H_PUT_16 (abfd
, extra
->MinorImageVersion
, aouthdr_out
->MinorImageVersion
);
779 H_PUT_16 (abfd
, extra
->MajorSubsystemVersion
,
780 aouthdr_out
->MajorSubsystemVersion
);
781 H_PUT_16 (abfd
, extra
->MinorSubsystemVersion
,
782 aouthdr_out
->MinorSubsystemVersion
);
783 H_PUT_32 (abfd
, extra
->Reserved1
, aouthdr_out
->Reserved1
);
784 H_PUT_32 (abfd
, extra
->SizeOfImage
, aouthdr_out
->SizeOfImage
);
785 H_PUT_32 (abfd
, extra
->SizeOfHeaders
, aouthdr_out
->SizeOfHeaders
);
786 H_PUT_32 (abfd
, extra
->CheckSum
, aouthdr_out
->CheckSum
);
787 H_PUT_16 (abfd
, extra
->Subsystem
, aouthdr_out
->Subsystem
);
788 H_PUT_16 (abfd
, extra
->DllCharacteristics
, aouthdr_out
->DllCharacteristics
);
789 PUT_OPTHDR_SIZE_OF_STACK_RESERVE (abfd
, extra
->SizeOfStackReserve
,
790 aouthdr_out
->SizeOfStackReserve
);
791 PUT_OPTHDR_SIZE_OF_STACK_COMMIT (abfd
, extra
->SizeOfStackCommit
,
792 aouthdr_out
->SizeOfStackCommit
);
793 PUT_OPTHDR_SIZE_OF_HEAP_RESERVE (abfd
, extra
->SizeOfHeapReserve
,
794 aouthdr_out
->SizeOfHeapReserve
);
795 PUT_OPTHDR_SIZE_OF_HEAP_COMMIT (abfd
, extra
->SizeOfHeapCommit
,
796 aouthdr_out
->SizeOfHeapCommit
);
797 H_PUT_32 (abfd
, extra
->LoaderFlags
, aouthdr_out
->LoaderFlags
);
798 H_PUT_32 (abfd
, extra
->NumberOfRvaAndSizes
,
799 aouthdr_out
->NumberOfRvaAndSizes
);
803 for (idx
= 0; idx
< IMAGE_NUMBEROF_DIRECTORY_ENTRIES
; idx
++)
805 H_PUT_32 (abfd
, extra
->DataDirectory
[idx
].VirtualAddress
,
806 aouthdr_out
->DataDirectory
[idx
][0]);
807 H_PUT_32 (abfd
, extra
->DataDirectory
[idx
].Size
,
808 aouthdr_out
->DataDirectory
[idx
][1]);
816 _bfd_XXi_only_swap_filehdr_out (bfd
* abfd
, void * in
, void * out
)
819 struct internal_filehdr
*filehdr_in
= (struct internal_filehdr
*) in
;
820 struct external_PEI_filehdr
*filehdr_out
= (struct external_PEI_filehdr
*) out
;
822 if (pe_data (abfd
)->has_reloc_section
823 || pe_data (abfd
)->dont_strip_reloc
)
824 filehdr_in
->f_flags
&= ~F_RELFLG
;
826 if (pe_data (abfd
)->dll
)
827 filehdr_in
->f_flags
|= F_DLL
;
829 filehdr_in
->pe
.e_magic
= IMAGE_DOS_SIGNATURE
;
830 filehdr_in
->pe
.e_cblp
= 0x90;
831 filehdr_in
->pe
.e_cp
= 0x3;
832 filehdr_in
->pe
.e_crlc
= 0x0;
833 filehdr_in
->pe
.e_cparhdr
= 0x4;
834 filehdr_in
->pe
.e_minalloc
= 0x0;
835 filehdr_in
->pe
.e_maxalloc
= 0xffff;
836 filehdr_in
->pe
.e_ss
= 0x0;
837 filehdr_in
->pe
.e_sp
= 0xb8;
838 filehdr_in
->pe
.e_csum
= 0x0;
839 filehdr_in
->pe
.e_ip
= 0x0;
840 filehdr_in
->pe
.e_cs
= 0x0;
841 filehdr_in
->pe
.e_lfarlc
= 0x40;
842 filehdr_in
->pe
.e_ovno
= 0x0;
844 for (idx
= 0; idx
< 4; idx
++)
845 filehdr_in
->pe
.e_res
[idx
] = 0x0;
847 filehdr_in
->pe
.e_oemid
= 0x0;
848 filehdr_in
->pe
.e_oeminfo
= 0x0;
850 for (idx
= 0; idx
< 10; idx
++)
851 filehdr_in
->pe
.e_res2
[idx
] = 0x0;
853 filehdr_in
->pe
.e_lfanew
= 0x80;
855 /* This next collection of data are mostly just characters. It
856 appears to be constant within the headers put on NT exes. */
857 memcpy (filehdr_in
->pe
.dos_message
, pe_data (abfd
)->dos_message
,
858 sizeof (filehdr_in
->pe
.dos_message
));
860 filehdr_in
->pe
.nt_signature
= IMAGE_NT_SIGNATURE
;
862 H_PUT_16 (abfd
, filehdr_in
->f_magic
, filehdr_out
->f_magic
);
863 H_PUT_16 (abfd
, filehdr_in
->f_nscns
, filehdr_out
->f_nscns
);
865 /* Use a real timestamp by default, unless the no-insert-timestamp
866 option was chosen. */
867 if ((pe_data (abfd
)->timestamp
) == -1)
868 H_PUT_32 (abfd
, time (0), filehdr_out
->f_timdat
);
870 H_PUT_32 (abfd
, pe_data (abfd
)->timestamp
, filehdr_out
->f_timdat
);
872 PUT_FILEHDR_SYMPTR (abfd
, filehdr_in
->f_symptr
,
873 filehdr_out
->f_symptr
);
874 H_PUT_32 (abfd
, filehdr_in
->f_nsyms
, filehdr_out
->f_nsyms
);
875 H_PUT_16 (abfd
, filehdr_in
->f_opthdr
, filehdr_out
->f_opthdr
);
876 H_PUT_16 (abfd
, filehdr_in
->f_flags
, filehdr_out
->f_flags
);
878 /* Put in extra dos header stuff. This data remains essentially
879 constant, it just has to be tacked on to the beginning of all exes
881 H_PUT_16 (abfd
, filehdr_in
->pe
.e_magic
, filehdr_out
->e_magic
);
882 H_PUT_16 (abfd
, filehdr_in
->pe
.e_cblp
, filehdr_out
->e_cblp
);
883 H_PUT_16 (abfd
, filehdr_in
->pe
.e_cp
, filehdr_out
->e_cp
);
884 H_PUT_16 (abfd
, filehdr_in
->pe
.e_crlc
, filehdr_out
->e_crlc
);
885 H_PUT_16 (abfd
, filehdr_in
->pe
.e_cparhdr
, filehdr_out
->e_cparhdr
);
886 H_PUT_16 (abfd
, filehdr_in
->pe
.e_minalloc
, filehdr_out
->e_minalloc
);
887 H_PUT_16 (abfd
, filehdr_in
->pe
.e_maxalloc
, filehdr_out
->e_maxalloc
);
888 H_PUT_16 (abfd
, filehdr_in
->pe
.e_ss
, filehdr_out
->e_ss
);
889 H_PUT_16 (abfd
, filehdr_in
->pe
.e_sp
, filehdr_out
->e_sp
);
890 H_PUT_16 (abfd
, filehdr_in
->pe
.e_csum
, filehdr_out
->e_csum
);
891 H_PUT_16 (abfd
, filehdr_in
->pe
.e_ip
, filehdr_out
->e_ip
);
892 H_PUT_16 (abfd
, filehdr_in
->pe
.e_cs
, filehdr_out
->e_cs
);
893 H_PUT_16 (abfd
, filehdr_in
->pe
.e_lfarlc
, filehdr_out
->e_lfarlc
);
894 H_PUT_16 (abfd
, filehdr_in
->pe
.e_ovno
, filehdr_out
->e_ovno
);
896 for (idx
= 0; idx
< 4; idx
++)
897 H_PUT_16 (abfd
, filehdr_in
->pe
.e_res
[idx
], filehdr_out
->e_res
[idx
]);
899 H_PUT_16 (abfd
, filehdr_in
->pe
.e_oemid
, filehdr_out
->e_oemid
);
900 H_PUT_16 (abfd
, filehdr_in
->pe
.e_oeminfo
, filehdr_out
->e_oeminfo
);
902 for (idx
= 0; idx
< 10; idx
++)
903 H_PUT_16 (abfd
, filehdr_in
->pe
.e_res2
[idx
], filehdr_out
->e_res2
[idx
]);
905 H_PUT_32 (abfd
, filehdr_in
->pe
.e_lfanew
, filehdr_out
->e_lfanew
);
907 for (idx
= 0; idx
< 16; idx
++)
908 H_PUT_32 (abfd
, filehdr_in
->pe
.dos_message
[idx
],
909 filehdr_out
->dos_message
[idx
]);
911 /* Also put in the NT signature. */
912 H_PUT_32 (abfd
, filehdr_in
->pe
.nt_signature
, filehdr_out
->nt_signature
);
918 _bfd_XX_only_swap_filehdr_out (bfd
* abfd
, void * in
, void * out
)
920 struct internal_filehdr
*filehdr_in
= (struct internal_filehdr
*) in
;
921 FILHDR
*filehdr_out
= (FILHDR
*) out
;
923 H_PUT_16 (abfd
, filehdr_in
->f_magic
, filehdr_out
->f_magic
);
924 H_PUT_16 (abfd
, filehdr_in
->f_nscns
, filehdr_out
->f_nscns
);
925 H_PUT_32 (abfd
, filehdr_in
->f_timdat
, filehdr_out
->f_timdat
);
926 PUT_FILEHDR_SYMPTR (abfd
, filehdr_in
->f_symptr
, filehdr_out
->f_symptr
);
927 H_PUT_32 (abfd
, filehdr_in
->f_nsyms
, filehdr_out
->f_nsyms
);
928 H_PUT_16 (abfd
, filehdr_in
->f_opthdr
, filehdr_out
->f_opthdr
);
929 H_PUT_16 (abfd
, filehdr_in
->f_flags
, filehdr_out
->f_flags
);
935 _bfd_XXi_swap_scnhdr_out (bfd
* abfd
, void * in
, void * out
)
937 struct internal_scnhdr
*scnhdr_int
= (struct internal_scnhdr
*) in
;
938 SCNHDR
*scnhdr_ext
= (SCNHDR
*) out
;
939 unsigned int ret
= SCNHSZ
;
943 memcpy (scnhdr_ext
->s_name
, scnhdr_int
->s_name
, sizeof (scnhdr_int
->s_name
));
945 ss
= scnhdr_int
->s_vaddr
- pe_data (abfd
)->pe_opthdr
.ImageBase
;
946 if (scnhdr_int
->s_vaddr
< pe_data (abfd
)->pe_opthdr
.ImageBase
)
947 _bfd_error_handler (_("%pB:%.8s: section below image base"),
948 abfd
, scnhdr_int
->s_name
);
949 else if(ss
!= (ss
& 0xffffffff))
950 _bfd_error_handler (_("%pB:%.8s: RVA truncated"), abfd
, scnhdr_int
->s_name
);
951 PUT_SCNHDR_VADDR (abfd
, ss
& 0xffffffff, scnhdr_ext
->s_vaddr
);
953 /* NT wants the size data to be rounded up to the next
954 NT_FILE_ALIGNMENT, but zero if it has no content (as in .bss,
956 if ((scnhdr_int
->s_flags
& IMAGE_SCN_CNT_UNINITIALIZED_DATA
) != 0)
958 if (bfd_pei_p (abfd
))
960 ps
= scnhdr_int
->s_size
;
966 ss
= scnhdr_int
->s_size
;
971 if (bfd_pei_p (abfd
))
972 ps
= scnhdr_int
->s_paddr
;
976 ss
= scnhdr_int
->s_size
;
979 PUT_SCNHDR_SIZE (abfd
, ss
,
982 /* s_paddr in PE is really the virtual size. */
983 PUT_SCNHDR_PADDR (abfd
, ps
, scnhdr_ext
->s_paddr
);
985 PUT_SCNHDR_SCNPTR (abfd
, scnhdr_int
->s_scnptr
,
986 scnhdr_ext
->s_scnptr
);
987 PUT_SCNHDR_RELPTR (abfd
, scnhdr_int
->s_relptr
,
988 scnhdr_ext
->s_relptr
);
989 PUT_SCNHDR_LNNOPTR (abfd
, scnhdr_int
->s_lnnoptr
,
990 scnhdr_ext
->s_lnnoptr
);
993 /* Extra flags must be set when dealing with PE. All sections should also
994 have the IMAGE_SCN_MEM_READ (0x40000000) flag set. In addition, the
995 .text section must have IMAGE_SCN_MEM_EXECUTE (0x20000000) and the data
996 sections (.idata, .data, .bss, .CRT) must have IMAGE_SCN_MEM_WRITE set
997 (this is especially important when dealing with the .idata section since
998 the addresses for routines from .dlls must be overwritten). If .reloc
999 section data is ever generated, we must add IMAGE_SCN_MEM_DISCARDABLE
1000 (0x02000000). Also, the resource data should also be read and
1003 /* FIXME: Alignment is also encoded in this field, at least on
1004 ARM-WINCE. Although - how do we get the original alignment field
1009 char section_name
[SCNNMLEN
];
1010 unsigned long must_have
;
1012 pe_required_section_flags
;
1014 pe_required_section_flags known_sections
[] =
1016 { ".arch", IMAGE_SCN_MEM_READ
| IMAGE_SCN_CNT_INITIALIZED_DATA
| IMAGE_SCN_MEM_DISCARDABLE
| IMAGE_SCN_ALIGN_8BYTES
},
1017 { ".bss", IMAGE_SCN_MEM_READ
| IMAGE_SCN_CNT_UNINITIALIZED_DATA
| IMAGE_SCN_MEM_WRITE
},
1018 { ".data", IMAGE_SCN_MEM_READ
| IMAGE_SCN_CNT_INITIALIZED_DATA
| IMAGE_SCN_MEM_WRITE
},
1019 { ".edata", IMAGE_SCN_MEM_READ
| IMAGE_SCN_CNT_INITIALIZED_DATA
},
1020 { ".idata", IMAGE_SCN_MEM_READ
| IMAGE_SCN_CNT_INITIALIZED_DATA
| IMAGE_SCN_MEM_WRITE
},
1021 { ".pdata", IMAGE_SCN_MEM_READ
| IMAGE_SCN_CNT_INITIALIZED_DATA
},
1022 { ".rdata", IMAGE_SCN_MEM_READ
| IMAGE_SCN_CNT_INITIALIZED_DATA
},
1023 { ".reloc", IMAGE_SCN_MEM_READ
| IMAGE_SCN_CNT_INITIALIZED_DATA
| IMAGE_SCN_MEM_DISCARDABLE
},
1024 { ".rsrc", IMAGE_SCN_MEM_READ
| IMAGE_SCN_CNT_INITIALIZED_DATA
| IMAGE_SCN_MEM_WRITE
},
1025 { ".text" , IMAGE_SCN_MEM_READ
| IMAGE_SCN_CNT_CODE
| IMAGE_SCN_MEM_EXECUTE
},
1026 { ".tls", IMAGE_SCN_MEM_READ
| IMAGE_SCN_CNT_INITIALIZED_DATA
| IMAGE_SCN_MEM_WRITE
},
1027 { ".xdata", IMAGE_SCN_MEM_READ
| IMAGE_SCN_CNT_INITIALIZED_DATA
},
1030 pe_required_section_flags
* p
;
1032 /* We have defaulted to adding the IMAGE_SCN_MEM_WRITE flag, but now
1033 we know exactly what this specific section wants so we remove it
1034 and then allow the must_have field to add it back in if necessary.
1035 However, we don't remove IMAGE_SCN_MEM_WRITE flag from .text if the
1036 default WP_TEXT file flag has been cleared. WP_TEXT may be cleared
1037 by ld --enable-auto-import (if auto-import is actually needed),
1038 by ld --omagic, or by obcopy --writable-text. */
1040 for (p
= known_sections
;
1041 p
< known_sections
+ ARRAY_SIZE (known_sections
);
1043 if (memcmp (scnhdr_int
->s_name
, p
->section_name
, SCNNMLEN
) == 0)
1045 if (memcmp (scnhdr_int
->s_name
, ".text", sizeof ".text")
1046 || (bfd_get_file_flags (abfd
) & WP_TEXT
))
1047 scnhdr_int
->s_flags
&= ~IMAGE_SCN_MEM_WRITE
;
1048 scnhdr_int
->s_flags
|= p
->must_have
;
1052 H_PUT_32 (abfd
, scnhdr_int
->s_flags
, scnhdr_ext
->s_flags
);
1055 if (coff_data (abfd
)->link_info
1056 && ! bfd_link_relocatable (coff_data (abfd
)->link_info
)
1057 && ! bfd_link_pic (coff_data (abfd
)->link_info
)
1058 && memcmp (scnhdr_int
->s_name
, ".text", sizeof ".text") == 0)
1060 /* By inference from looking at MS output, the 32 bit field
1061 which is the combination of the number_of_relocs and
1062 number_of_linenos is used for the line number count in
1063 executables. A 16-bit field won't do for cc1. The MS
1064 document says that the number of relocs is zero for
1065 executables, but the 17-th bit has been observed to be there.
1066 Overflow is not an issue: a 4G-line program will overflow a
1067 bunch of other fields long before this! */
1068 H_PUT_16 (abfd
, (scnhdr_int
->s_nlnno
& 0xffff), scnhdr_ext
->s_nlnno
);
1069 H_PUT_16 (abfd
, (scnhdr_int
->s_nlnno
>> 16), scnhdr_ext
->s_nreloc
);
1073 if (scnhdr_int
->s_nlnno
<= 0xffff)
1074 H_PUT_16 (abfd
, scnhdr_int
->s_nlnno
, scnhdr_ext
->s_nlnno
);
1077 /* xgettext:c-format */
1078 _bfd_error_handler (_("%pB: line number overflow: 0x%lx > 0xffff"),
1079 abfd
, scnhdr_int
->s_nlnno
);
1080 bfd_set_error (bfd_error_file_truncated
);
1081 H_PUT_16 (abfd
, 0xffff, scnhdr_ext
->s_nlnno
);
1085 /* Although we could encode 0xffff relocs here, we do not, to be
1086 consistent with other parts of bfd. Also it lets us warn, as
1087 we should never see 0xffff here w/o having the overflow flag
1089 if (scnhdr_int
->s_nreloc
< 0xffff)
1090 H_PUT_16 (abfd
, scnhdr_int
->s_nreloc
, scnhdr_ext
->s_nreloc
);
1093 /* PE can deal with large #s of relocs, but not here. */
1094 H_PUT_16 (abfd
, 0xffff, scnhdr_ext
->s_nreloc
);
1095 scnhdr_int
->s_flags
|= IMAGE_SCN_LNK_NRELOC_OVFL
;
1096 H_PUT_32 (abfd
, scnhdr_int
->s_flags
, scnhdr_ext
->s_flags
);
1103 _bfd_XXi_swap_debugdir_in (bfd
* abfd
, void * ext1
, void * in1
)
1105 struct external_IMAGE_DEBUG_DIRECTORY
*ext
= (struct external_IMAGE_DEBUG_DIRECTORY
*) ext1
;
1106 struct internal_IMAGE_DEBUG_DIRECTORY
*in
= (struct internal_IMAGE_DEBUG_DIRECTORY
*) in1
;
1108 in
->Characteristics
= H_GET_32(abfd
, ext
->Characteristics
);
1109 in
->TimeDateStamp
= H_GET_32(abfd
, ext
->TimeDateStamp
);
1110 in
->MajorVersion
= H_GET_16(abfd
, ext
->MajorVersion
);
1111 in
->MinorVersion
= H_GET_16(abfd
, ext
->MinorVersion
);
1112 in
->Type
= H_GET_32(abfd
, ext
->Type
);
1113 in
->SizeOfData
= H_GET_32(abfd
, ext
->SizeOfData
);
1114 in
->AddressOfRawData
= H_GET_32(abfd
, ext
->AddressOfRawData
);
1115 in
->PointerToRawData
= H_GET_32(abfd
, ext
->PointerToRawData
);
1119 _bfd_XXi_swap_debugdir_out (bfd
* abfd
, void * inp
, void * extp
)
1121 struct external_IMAGE_DEBUG_DIRECTORY
*ext
= (struct external_IMAGE_DEBUG_DIRECTORY
*) extp
;
1122 struct internal_IMAGE_DEBUG_DIRECTORY
*in
= (struct internal_IMAGE_DEBUG_DIRECTORY
*) inp
;
1124 H_PUT_32(abfd
, in
->Characteristics
, ext
->Characteristics
);
1125 H_PUT_32(abfd
, in
->TimeDateStamp
, ext
->TimeDateStamp
);
1126 H_PUT_16(abfd
, in
->MajorVersion
, ext
->MajorVersion
);
1127 H_PUT_16(abfd
, in
->MinorVersion
, ext
->MinorVersion
);
1128 H_PUT_32(abfd
, in
->Type
, ext
->Type
);
1129 H_PUT_32(abfd
, in
->SizeOfData
, ext
->SizeOfData
);
1130 H_PUT_32(abfd
, in
->AddressOfRawData
, ext
->AddressOfRawData
);
1131 H_PUT_32(abfd
, in
->PointerToRawData
, ext
->PointerToRawData
);
1133 return sizeof (struct external_IMAGE_DEBUG_DIRECTORY
);
1137 _bfd_XXi_slurp_codeview_record (bfd
* abfd
, file_ptr where
, unsigned long length
, CODEVIEW_INFO
*cvinfo
)
1140 bfd_size_type nread
;
1142 if (bfd_seek (abfd
, where
, SEEK_SET
) != 0)
1145 if (length
<= sizeof (CV_INFO_PDB70
) && length
<= sizeof (CV_INFO_PDB20
))
1149 nread
= bfd_bread (buffer
, length
, abfd
);
1150 if (length
!= nread
)
1153 /* Ensure null termination of filename. */
1154 memset (buffer
+ nread
, 0, sizeof (buffer
) - nread
);
1156 cvinfo
->CVSignature
= H_GET_32 (abfd
, buffer
);
1159 if ((cvinfo
->CVSignature
== CVINFO_PDB70_CVSIGNATURE
)
1160 && (length
> sizeof (CV_INFO_PDB70
)))
1162 CV_INFO_PDB70
*cvinfo70
= (CV_INFO_PDB70
*)(buffer
);
1164 cvinfo
->Age
= H_GET_32(abfd
, cvinfo70
->Age
);
1166 /* A GUID consists of 4,2,2 byte values in little-endian order, followed
1167 by 8 single bytes. Byte swap them so we can conveniently treat the GUID
1168 as 16 bytes in big-endian order. */
1169 bfd_putb32 (bfd_getl32 (cvinfo70
->Signature
), cvinfo
->Signature
);
1170 bfd_putb16 (bfd_getl16 (&(cvinfo70
->Signature
[4])), &(cvinfo
->Signature
[4]));
1171 bfd_putb16 (bfd_getl16 (&(cvinfo70
->Signature
[6])), &(cvinfo
->Signature
[6]));
1172 memcpy (&(cvinfo
->Signature
[8]), &(cvinfo70
->Signature
[8]), 8);
1174 cvinfo
->SignatureLength
= CV_INFO_SIGNATURE_LENGTH
;
1175 /* cvinfo->PdbFileName = cvinfo70->PdbFileName; */
1179 else if ((cvinfo
->CVSignature
== CVINFO_PDB20_CVSIGNATURE
)
1180 && (length
> sizeof (CV_INFO_PDB20
)))
1182 CV_INFO_PDB20
*cvinfo20
= (CV_INFO_PDB20
*)(buffer
);
1183 cvinfo
->Age
= H_GET_32(abfd
, cvinfo20
->Age
);
1184 memcpy (cvinfo
->Signature
, cvinfo20
->Signature
, 4);
1185 cvinfo
->SignatureLength
= 4;
1186 /* cvinfo->PdbFileName = cvinfo20->PdbFileName; */
1195 _bfd_XXi_write_codeview_record (bfd
* abfd
, file_ptr where
, CODEVIEW_INFO
*cvinfo
)
1197 const bfd_size_type size
= sizeof (CV_INFO_PDB70
) + 1;
1198 bfd_size_type written
;
1199 CV_INFO_PDB70
*cvinfo70
;
1202 if (bfd_seek (abfd
, where
, SEEK_SET
) != 0)
1205 buffer
= bfd_malloc (size
);
1209 cvinfo70
= (CV_INFO_PDB70
*) buffer
;
1210 H_PUT_32 (abfd
, CVINFO_PDB70_CVSIGNATURE
, cvinfo70
->CvSignature
);
1212 /* Byte swap the GUID from 16 bytes in big-endian order to 4,2,2 byte values
1213 in little-endian order, followed by 8 single bytes. */
1214 bfd_putl32 (bfd_getb32 (cvinfo
->Signature
), cvinfo70
->Signature
);
1215 bfd_putl16 (bfd_getb16 (&(cvinfo
->Signature
[4])), &(cvinfo70
->Signature
[4]));
1216 bfd_putl16 (bfd_getb16 (&(cvinfo
->Signature
[6])), &(cvinfo70
->Signature
[6]));
1217 memcpy (&(cvinfo70
->Signature
[8]), &(cvinfo
->Signature
[8]), 8);
1219 H_PUT_32 (abfd
, cvinfo
->Age
, cvinfo70
->Age
);
1220 cvinfo70
->PdbFileName
[0] = '\0';
1222 written
= bfd_bwrite (buffer
, size
, abfd
);
1226 return written
== size
? size
: 0;
1229 static char * dir_names
[IMAGE_NUMBEROF_DIRECTORY_ENTRIES
] =
1231 N_("Export Directory [.edata (or where ever we found it)]"),
1232 N_("Import Directory [parts of .idata]"),
1233 N_("Resource Directory [.rsrc]"),
1234 N_("Exception Directory [.pdata]"),
1235 N_("Security Directory"),
1236 N_("Base Relocation Directory [.reloc]"),
1237 N_("Debug Directory"),
1238 N_("Description Directory"),
1239 N_("Special Directory"),
1240 N_("Thread Storage Directory [.tls]"),
1241 N_("Load Configuration Directory"),
1242 N_("Bound Import Directory"),
1243 N_("Import Address Table Directory"),
1244 N_("Delay Import Directory"),
1245 N_("CLR Runtime Header"),
1250 pe_print_idata (bfd
* abfd
, void * vfile
)
1252 FILE *file
= (FILE *) vfile
;
1256 bfd_size_type datasize
= 0;
1257 bfd_size_type dataoff
;
1261 pe_data_type
*pe
= pe_data (abfd
);
1262 struct internal_extra_pe_aouthdr
*extra
= &pe
->pe_opthdr
;
1266 addr
= extra
->DataDirectory
[PE_IMPORT_TABLE
].VirtualAddress
;
1268 if (addr
== 0 && extra
->DataDirectory
[PE_IMPORT_TABLE
].Size
== 0)
1270 /* Maybe the extra header isn't there. Look for the section. */
1271 section
= bfd_get_section_by_name (abfd
, ".idata");
1272 if (section
== NULL
)
1275 addr
= section
->vma
;
1276 datasize
= section
->size
;
1282 addr
+= extra
->ImageBase
;
1283 for (section
= abfd
->sections
; section
!= NULL
; section
= section
->next
)
1285 datasize
= section
->size
;
1286 if (addr
>= section
->vma
&& addr
< section
->vma
+ datasize
)
1290 if (section
== NULL
)
1293 _("\nThere is an import table, but the section containing it could not be found\n"));
1296 else if (!(section
->flags
& SEC_HAS_CONTENTS
))
1299 _("\nThere is an import table in %s, but that section has no contents\n"),
1305 /* xgettext:c-format */
1306 fprintf (file
, _("\nThere is an import table in %s at 0x%lx\n"),
1307 section
->name
, (unsigned long) addr
);
1309 dataoff
= addr
- section
->vma
;
1312 _("\nThe Import Tables (interpreted %s section contents)\n"),
1316 vma: Hint Time Forward DLL First\n\
1317 Table Stamp Chain Name Thunk\n"));
1319 /* Read the whole section. Some of the fields might be before dataoff. */
1320 if (!bfd_malloc_and_get_section (abfd
, section
, &data
))
1326 adj
= section
->vma
- extra
->ImageBase
;
1328 /* Print all image import descriptors. */
1329 for (i
= dataoff
; i
+ onaline
<= datasize
; i
+= onaline
)
1333 bfd_vma forward_chain
;
1335 bfd_vma first_thunk
;
1340 /* Print (i + extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress). */
1341 fprintf (file
, " %08lx\t", (unsigned long) (i
+ adj
));
1342 hint_addr
= bfd_get_32 (abfd
, data
+ i
);
1343 time_stamp
= bfd_get_32 (abfd
, data
+ i
+ 4);
1344 forward_chain
= bfd_get_32 (abfd
, data
+ i
+ 8);
1345 dll_name
= bfd_get_32 (abfd
, data
+ i
+ 12);
1346 first_thunk
= bfd_get_32 (abfd
, data
+ i
+ 16);
1348 fprintf (file
, "%08lx %08lx %08lx %08lx %08lx\n",
1349 (unsigned long) hint_addr
,
1350 (unsigned long) time_stamp
,
1351 (unsigned long) forward_chain
,
1352 (unsigned long) dll_name
,
1353 (unsigned long) first_thunk
);
1355 if (hint_addr
== 0 && first_thunk
== 0)
1358 if (dll_name
- adj
>= section
->size
)
1361 dll
= (char *) data
+ dll_name
- adj
;
1362 /* PR 17512 file: 078-12277-0.004. */
1363 bfd_size_type maxlen
= (char *)(data
+ datasize
) - dll
- 1;
1364 fprintf (file
, _("\n\tDLL Name: %.*s\n"), (int) maxlen
, dll
);
1366 /* PR 21546: When the Hint Address is zero,
1367 we try the First Thunk instead. */
1369 hint_addr
= first_thunk
;
1371 if (hint_addr
!= 0 && hint_addr
- adj
< datasize
)
1374 asection
*ft_section
;
1376 bfd_size_type ft_datasize
;
1380 fprintf (file
, _("\tvma: Hint/Ord Member-Name Bound-To\n"));
1382 idx
= hint_addr
- adj
;
1384 ft_addr
= first_thunk
+ extra
->ImageBase
;
1385 ft_idx
= first_thunk
- adj
;
1386 ft_data
= data
+ ft_idx
;
1387 ft_datasize
= datasize
- ft_idx
;
1390 if (first_thunk
!= hint_addr
)
1392 /* Find the section which contains the first thunk. */
1393 for (ft_section
= abfd
->sections
;
1395 ft_section
= ft_section
->next
)
1397 if (ft_addr
>= ft_section
->vma
1398 && ft_addr
< ft_section
->vma
+ ft_section
->size
)
1402 if (ft_section
== NULL
)
1405 _("\nThere is a first thunk, but the section containing it could not be found\n"));
1409 /* Now check to see if this section is the same as our current
1410 section. If it is not then we will have to load its data in. */
1411 if (ft_section
!= section
)
1413 ft_idx
= first_thunk
- (ft_section
->vma
- extra
->ImageBase
);
1414 ft_datasize
= ft_section
->size
- ft_idx
;
1415 ft_data
= (bfd_byte
*) bfd_malloc (ft_datasize
);
1416 if (ft_data
== NULL
)
1419 /* Read ft_datasize bytes starting at offset ft_idx. */
1420 if (!bfd_get_section_contents (abfd
, ft_section
, ft_data
,
1421 (bfd_vma
) ft_idx
, ft_datasize
))
1430 /* Print HintName vector entries. */
1431 #ifdef COFF_WITH_pex64
1432 for (j
= 0; idx
+ j
+ 8 <= datasize
; j
+= 8)
1435 unsigned long member
= bfd_get_32 (abfd
, data
+ idx
+ j
);
1436 unsigned long member_high
= bfd_get_32 (abfd
, data
+ idx
+ j
+ 4);
1438 if (!member
&& !member_high
)
1443 if (HighBitSet (member_high
))
1444 fprintf (file
, "\t%lx%08lx\t %4lx%08lx <none>",
1445 member_high
, member
,
1446 WithoutHighBit (member_high
), member
);
1447 /* PR binutils/17512: Handle corrupt PE data. */
1448 else if (amt
>= datasize
|| amt
+ 2 >= datasize
)
1449 fprintf (file
, _("\t<corrupt: 0x%04lx>"), member
);
1455 ordinal
= bfd_get_16 (abfd
, data
+ amt
);
1456 member_name
= (char *) data
+ amt
+ 2;
1457 fprintf (file
, "\t%04lx\t %4d %.*s",member
, ordinal
,
1458 (int) (datasize
- (amt
+ 2)), member_name
);
1461 /* If the time stamp is not zero, the import address
1462 table holds actual addresses. */
1465 && first_thunk
!= hint_addr
1466 && j
+ 4 <= ft_datasize
)
1467 fprintf (file
, "\t%04lx",
1468 (unsigned long) bfd_get_32 (abfd
, ft_data
+ j
));
1469 fprintf (file
, "\n");
1472 for (j
= 0; idx
+ j
+ 4 <= datasize
; j
+= 4)
1475 unsigned long member
= bfd_get_32 (abfd
, data
+ idx
+ j
);
1477 /* Print single IMAGE_IMPORT_BY_NAME vector. */
1483 if (HighBitSet (member
))
1484 fprintf (file
, "\t%04lx\t %4lu <none>",
1485 member
, WithoutHighBit (member
));
1486 /* PR binutils/17512: Handle corrupt PE data. */
1487 else if (amt
>= datasize
|| amt
+ 2 >= datasize
)
1488 fprintf (file
, _("\t<corrupt: 0x%04lx>"), member
);
1494 ordinal
= bfd_get_16 (abfd
, data
+ amt
);
1495 member_name
= (char *) data
+ amt
+ 2;
1496 fprintf (file
, "\t%04lx\t %4d %.*s",
1498 (int) (datasize
- (amt
+ 2)), member_name
);
1501 /* If the time stamp is not zero, the import address
1502 table holds actual addresses. */
1505 && first_thunk
!= hint_addr
1506 && j
+ 4 <= ft_datasize
)
1507 fprintf (file
, "\t%04lx",
1508 (unsigned long) bfd_get_32 (abfd
, ft_data
+ j
));
1510 fprintf (file
, "\n");
1517 fprintf (file
, "\n");
1526 pe_print_edata (bfd
* abfd
, void * vfile
)
1528 FILE *file
= (FILE *) vfile
;
1531 bfd_size_type datasize
= 0;
1532 bfd_size_type dataoff
;
1537 long export_flags
; /* Reserved - should be zero. */
1541 bfd_vma name
; /* RVA - relative to image base. */
1542 long base
; /* Ordinal base. */
1543 unsigned long num_functions
;/* Number in the export address table. */
1544 unsigned long num_names
; /* Number in the name pointer table. */
1545 bfd_vma eat_addr
; /* RVA to the export address table. */
1546 bfd_vma npt_addr
; /* RVA to the Export Name Pointer Table. */
1547 bfd_vma ot_addr
; /* RVA to the Ordinal Table. */
1550 pe_data_type
*pe
= pe_data (abfd
);
1551 struct internal_extra_pe_aouthdr
*extra
= &pe
->pe_opthdr
;
1555 addr
= extra
->DataDirectory
[PE_EXPORT_TABLE
].VirtualAddress
;
1557 if (addr
== 0 && extra
->DataDirectory
[PE_EXPORT_TABLE
].Size
== 0)
1559 /* Maybe the extra header isn't there. Look for the section. */
1560 section
= bfd_get_section_by_name (abfd
, ".edata");
1561 if (section
== NULL
)
1564 addr
= section
->vma
;
1566 datasize
= section
->size
;
1572 addr
+= extra
->ImageBase
;
1574 for (section
= abfd
->sections
; section
!= NULL
; section
= section
->next
)
1575 if (addr
>= section
->vma
&& addr
< section
->vma
+ section
->size
)
1578 if (section
== NULL
)
1581 _("\nThere is an export table, but the section containing it could not be found\n"));
1584 else if (!(section
->flags
& SEC_HAS_CONTENTS
))
1587 _("\nThere is an export table in %s, but that section has no contents\n"),
1592 dataoff
= addr
- section
->vma
;
1593 datasize
= extra
->DataDirectory
[PE_EXPORT_TABLE
].Size
;
1594 if (dataoff
> section
->size
1595 || datasize
> section
->size
- dataoff
)
1598 _("\nThere is an export table in %s, but it does not fit into that section\n"),
1604 /* PR 17512: Handle corrupt PE binaries. */
1608 /* xgettext:c-format */
1609 _("\nThere is an export table in %s, but it is too small (%d)\n"),
1610 section
->name
, (int) datasize
);
1614 /* xgettext:c-format */
1615 fprintf (file
, _("\nThere is an export table in %s at 0x%lx\n"),
1616 section
->name
, (unsigned long) addr
);
1618 data
= (bfd_byte
*) bfd_malloc (datasize
);
1622 if (! bfd_get_section_contents (abfd
, section
, data
,
1623 (file_ptr
) dataoff
, datasize
))
1626 /* Go get Export Directory Table. */
1627 edt
.export_flags
= bfd_get_32 (abfd
, data
+ 0);
1628 edt
.time_stamp
= bfd_get_32 (abfd
, data
+ 4);
1629 edt
.major_ver
= bfd_get_16 (abfd
, data
+ 8);
1630 edt
.minor_ver
= bfd_get_16 (abfd
, data
+ 10);
1631 edt
.name
= bfd_get_32 (abfd
, data
+ 12);
1632 edt
.base
= bfd_get_32 (abfd
, data
+ 16);
1633 edt
.num_functions
= bfd_get_32 (abfd
, data
+ 20);
1634 edt
.num_names
= bfd_get_32 (abfd
, data
+ 24);
1635 edt
.eat_addr
= bfd_get_32 (abfd
, data
+ 28);
1636 edt
.npt_addr
= bfd_get_32 (abfd
, data
+ 32);
1637 edt
.ot_addr
= bfd_get_32 (abfd
, data
+ 36);
1639 adj
= section
->vma
- extra
->ImageBase
+ dataoff
;
1641 /* Dump the EDT first. */
1643 _("\nThe Export Tables (interpreted %s section contents)\n\n"),
1647 _("Export Flags \t\t\t%lx\n"), (unsigned long) edt
.export_flags
);
1650 _("Time/Date stamp \t\t%lx\n"), (unsigned long) edt
.time_stamp
);
1653 /* xgettext:c-format */
1654 _("Major/Minor \t\t\t%d/%d\n"), edt
.major_ver
, edt
.minor_ver
);
1657 _("Name \t\t\t\t"));
1658 bfd_fprintf_vma (abfd
, file
, edt
.name
);
1660 if ((edt
.name
>= adj
) && (edt
.name
< adj
+ datasize
))
1661 fprintf (file
, " %.*s\n",
1662 (int) (datasize
- (edt
.name
- adj
)),
1663 data
+ edt
.name
- adj
);
1665 fprintf (file
, "(outside .edata section)\n");
1668 _("Ordinal Base \t\t\t%ld\n"), edt
.base
);
1674 _("\tExport Address Table \t\t%08lx\n"),
1678 _("\t[Name Pointer/Ordinal] Table\t%08lx\n"), edt
.num_names
);
1681 _("Table Addresses\n"));
1684 _("\tExport Address Table \t\t"));
1685 bfd_fprintf_vma (abfd
, file
, edt
.eat_addr
);
1686 fprintf (file
, "\n");
1689 _("\tName Pointer Table \t\t"));
1690 bfd_fprintf_vma (abfd
, file
, edt
.npt_addr
);
1691 fprintf (file
, "\n");
1694 _("\tOrdinal Table \t\t\t"));
1695 bfd_fprintf_vma (abfd
, file
, edt
.ot_addr
);
1696 fprintf (file
, "\n");
1698 /* The next table to find is the Export Address Table. It's basically
1699 a list of pointers that either locate a function in this dll, or
1700 forward the call to another dll. Something like:
1705 } export_address_table_entry; */
1708 _("\nExport Address Table -- Ordinal Base %ld\n"),
1711 /* PR 17512: Handle corrupt PE binaries. */
1712 /* PR 17512 file: 140-165018-0.004. */
1713 if (edt
.eat_addr
- adj
>= datasize
1714 /* PR 17512: file: 092b1829 */
1715 || (edt
.num_functions
+ 1) * 4 < edt
.num_functions
1716 || edt
.eat_addr
- adj
+ (edt
.num_functions
+ 1) * 4 > datasize
)
1717 fprintf (file
, _("\tInvalid Export Address Table rva (0x%lx) or entry count (0x%lx)\n"),
1718 (long) edt
.eat_addr
,
1719 (long) edt
.num_functions
);
1720 else for (i
= 0; i
< edt
.num_functions
; ++i
)
1722 bfd_vma eat_member
= bfd_get_32 (abfd
,
1723 data
+ edt
.eat_addr
+ (i
* 4) - adj
);
1724 if (eat_member
== 0)
1727 if (eat_member
- adj
<= datasize
)
1729 /* This rva is to a name (forwarding function) in our section. */
1730 /* Should locate a function descriptor. */
1732 "\t[%4ld] +base[%4ld] %04lx %s -- %.*s\n",
1734 (long) (i
+ edt
.base
),
1735 (unsigned long) eat_member
,
1737 (int)(datasize
- (eat_member
- adj
)),
1738 data
+ eat_member
- adj
);
1742 /* Should locate a function descriptor in the reldata section. */
1744 "\t[%4ld] +base[%4ld] %04lx %s\n",
1746 (long) (i
+ edt
.base
),
1747 (unsigned long) eat_member
,
1752 /* The Export Name Pointer Table is paired with the Export Ordinal Table. */
1753 /* Dump them in parallel for clarity. */
1755 _("\n[Ordinal/Name Pointer] Table\n"));
1757 /* PR 17512: Handle corrupt PE binaries. */
1758 if (edt
.npt_addr
+ (edt
.num_names
* 4) - adj
>= datasize
1759 /* PR 17512: file: bb68816e. */
1760 || edt
.num_names
* 4 < edt
.num_names
1761 || (data
+ edt
.npt_addr
- adj
) < data
)
1762 /* xgettext:c-format */
1763 fprintf (file
, _("\tInvalid Name Pointer Table rva (0x%lx) or entry count (0x%lx)\n"),
1764 (long) edt
.npt_addr
,
1765 (long) edt
.num_names
);
1766 /* PR 17512: file: 140-147171-0.004. */
1767 else if (edt
.ot_addr
+ (edt
.num_names
* 2) - adj
>= datasize
1768 || data
+ edt
.ot_addr
- adj
< data
)
1769 /* xgettext:c-format */
1770 fprintf (file
, _("\tInvalid Ordinal Table rva (0x%lx) or entry count (0x%lx)\n"),
1772 (long) edt
.num_names
);
1773 else for (i
= 0; i
< edt
.num_names
; ++i
)
1778 ord
= bfd_get_16 (abfd
, data
+ edt
.ot_addr
+ (i
* 2) - adj
);
1779 name_ptr
= bfd_get_32 (abfd
, data
+ edt
.npt_addr
+ (i
* 4) - adj
);
1781 if ((name_ptr
- adj
) >= datasize
)
1783 /* xgettext:c-format */
1784 fprintf (file
, _("\t[%4ld] <corrupt offset: %lx>\n"),
1785 (long) ord
, (long) name_ptr
);
1789 char * name
= (char *) data
+ name_ptr
- adj
;
1791 fprintf (file
, "\t[%4ld] %.*s\n", (long) ord
,
1792 (int)((char *)(data
+ datasize
) - name
), name
);
1801 /* This really is architecture dependent. On IA-64, a .pdata entry
1802 consists of three dwords containing relative virtual addresses that
1803 specify the start and end address of the code range the entry
1804 covers and the address of the corresponding unwind info data.
1806 On ARM and SH-4, a compressed PDATA structure is used :
1807 _IMAGE_CE_RUNTIME_FUNCTION_ENTRY, whereas MIPS is documented to use
1808 _IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY.
1809 See http://msdn2.microsoft.com/en-us/library/ms253988(VS.80).aspx .
1811 This is the version for uncompressed data. */
1814 pe_print_pdata (bfd
* abfd
, void * vfile
)
1816 #if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64)
1817 # define PDATA_ROW_SIZE (3 * 8)
1819 # define PDATA_ROW_SIZE (5 * 4)
1821 FILE *file
= (FILE *) vfile
;
1823 asection
*section
= bfd_get_section_by_name (abfd
, ".pdata");
1824 bfd_size_type datasize
= 0;
1826 bfd_size_type start
, stop
;
1827 int onaline
= PDATA_ROW_SIZE
;
1830 || coff_section_data (abfd
, section
) == NULL
1831 || pei_section_data (abfd
, section
) == NULL
)
1834 stop
= pei_section_data (abfd
, section
)->virt_size
;
1835 if ((stop
% onaline
) != 0)
1837 /* xgettext:c-format */
1838 _("warning, .pdata section size (%ld) is not a multiple of %d\n"),
1839 (long) stop
, onaline
);
1842 _("\nThe Function Table (interpreted .pdata section contents)\n"));
1843 #if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64)
1845 _(" vma:\t\t\tBegin Address End Address Unwind Info\n"));
1848 vma:\t\tBegin End EH EH PrologEnd Exception\n\
1849 \t\tAddress Address Handler Data Address Mask\n"));
1852 datasize
= section
->size
;
1856 /* PR 17512: file: 002-193900-0.004. */
1857 if (datasize
< stop
)
1859 /* xgettext:c-format */
1860 fprintf (file
, _("Virtual size of .pdata section (%ld) larger than real size (%ld)\n"),
1861 (long) stop
, (long) datasize
);
1865 if (! bfd_malloc_and_get_section (abfd
, section
, &data
))
1873 for (i
= start
; i
< stop
; i
+= onaline
)
1879 bfd_vma prolog_end_addr
;
1880 #if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64)
1884 if (i
+ PDATA_ROW_SIZE
> stop
)
1887 begin_addr
= GET_PDATA_ENTRY (abfd
, data
+ i
);
1888 end_addr
= GET_PDATA_ENTRY (abfd
, data
+ i
+ 4);
1889 eh_handler
= GET_PDATA_ENTRY (abfd
, data
+ i
+ 8);
1890 eh_data
= GET_PDATA_ENTRY (abfd
, data
+ i
+ 12);
1891 prolog_end_addr
= GET_PDATA_ENTRY (abfd
, data
+ i
+ 16);
1893 if (begin_addr
== 0 && end_addr
== 0 && eh_handler
== 0
1894 && eh_data
== 0 && prolog_end_addr
== 0)
1895 /* We are probably into the padding of the section now. */
1898 #if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64)
1899 em_data
= ((eh_handler
& 0x1) << 2) | (prolog_end_addr
& 0x3);
1901 eh_handler
&= ~(bfd_vma
) 0x3;
1902 prolog_end_addr
&= ~(bfd_vma
) 0x3;
1905 bfd_fprintf_vma (abfd
, file
, i
+ section
->vma
); fputc ('\t', file
);
1906 bfd_fprintf_vma (abfd
, file
, begin_addr
); fputc (' ', file
);
1907 bfd_fprintf_vma (abfd
, file
, end_addr
); fputc (' ', file
);
1908 bfd_fprintf_vma (abfd
, file
, eh_handler
);
1909 #if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64)
1911 bfd_fprintf_vma (abfd
, file
, eh_data
); fputc (' ', file
);
1912 bfd_fprintf_vma (abfd
, file
, prolog_end_addr
);
1913 fprintf (file
, " %x", em_data
);
1915 fprintf (file
, "\n");
1921 #undef PDATA_ROW_SIZE
1924 typedef struct sym_cache
1931 slurp_symtab (bfd
*abfd
, sym_cache
*psc
)
1933 asymbol
** sy
= NULL
;
1936 if (!(bfd_get_file_flags (abfd
) & HAS_SYMS
))
1942 storage
= bfd_get_symtab_upper_bound (abfd
);
1947 sy
= (asymbol
**) bfd_malloc (storage
);
1952 psc
->symcount
= bfd_canonicalize_symtab (abfd
, sy
);
1953 if (psc
->symcount
< 0)
1959 my_symbol_for_address (bfd
*abfd
, bfd_vma func
, sym_cache
*psc
)
1964 psc
->syms
= slurp_symtab (abfd
, psc
);
1966 for (i
= 0; i
< psc
->symcount
; i
++)
1968 if (psc
->syms
[i
]->section
->vma
+ psc
->syms
[i
]->value
== func
)
1969 return psc
->syms
[i
]->name
;
1976 cleanup_syms (sym_cache
*psc
)
1983 /* This is the version for "compressed" pdata. */
1986 _bfd_XX_print_ce_compressed_pdata (bfd
* abfd
, void * vfile
)
1988 # define PDATA_ROW_SIZE (2 * 4)
1989 FILE *file
= (FILE *) vfile
;
1990 bfd_byte
*data
= NULL
;
1991 asection
*section
= bfd_get_section_by_name (abfd
, ".pdata");
1992 bfd_size_type datasize
= 0;
1994 bfd_size_type start
, stop
;
1995 int onaline
= PDATA_ROW_SIZE
;
1996 struct sym_cache cache
= {0, 0} ;
1999 || coff_section_data (abfd
, section
) == NULL
2000 || pei_section_data (abfd
, section
) == NULL
)
2003 stop
= pei_section_data (abfd
, section
)->virt_size
;
2004 if ((stop
% onaline
) != 0)
2006 /* xgettext:c-format */
2007 _("warning, .pdata section size (%ld) is not a multiple of %d\n"),
2008 (long) stop
, onaline
);
2011 _("\nThe Function Table (interpreted .pdata section contents)\n"));
2014 vma:\t\tBegin Prolog Function Flags Exception EH\n\
2015 \t\tAddress Length Length 32b exc Handler Data\n"));
2017 datasize
= section
->size
;
2021 if (! bfd_malloc_and_get_section (abfd
, section
, &data
))
2029 for (i
= start
; i
< stop
; i
+= onaline
)
2033 bfd_vma prolog_length
, function_length
;
2034 int flag32bit
, exception_flag
;
2037 if (i
+ PDATA_ROW_SIZE
> stop
)
2040 begin_addr
= GET_PDATA_ENTRY (abfd
, data
+ i
);
2041 other_data
= GET_PDATA_ENTRY (abfd
, data
+ i
+ 4);
2043 if (begin_addr
== 0 && other_data
== 0)
2044 /* We are probably into the padding of the section now. */
2047 prolog_length
= (other_data
& 0x000000FF);
2048 function_length
= (other_data
& 0x3FFFFF00) >> 8;
2049 flag32bit
= (int)((other_data
& 0x40000000) >> 30);
2050 exception_flag
= (int)((other_data
& 0x80000000) >> 31);
2053 bfd_fprintf_vma (abfd
, file
, i
+ section
->vma
); fputc ('\t', file
);
2054 bfd_fprintf_vma (abfd
, file
, begin_addr
); fputc (' ', file
);
2055 bfd_fprintf_vma (abfd
, file
, prolog_length
); fputc (' ', file
);
2056 bfd_fprintf_vma (abfd
, file
, function_length
); fputc (' ', file
);
2057 fprintf (file
, "%2d %2d ", flag32bit
, exception_flag
);
2059 /* Get the exception handler's address and the data passed from the
2060 .text section. This is really the data that belongs with the .pdata
2061 but got "compressed" out for the ARM and SH4 architectures. */
2062 tsection
= bfd_get_section_by_name (abfd
, ".text");
2063 if (tsection
&& coff_section_data (abfd
, tsection
)
2064 && pei_section_data (abfd
, tsection
))
2066 bfd_vma eh_off
= (begin_addr
- 8) - tsection
->vma
;
2069 tdata
= (bfd_byte
*) bfd_malloc (8);
2072 if (bfd_get_section_contents (abfd
, tsection
, tdata
, eh_off
, 8))
2074 bfd_vma eh
, eh_data
;
2076 eh
= bfd_get_32 (abfd
, tdata
);
2077 eh_data
= bfd_get_32 (abfd
, tdata
+ 4);
2078 fprintf (file
, "%08x ", (unsigned int) eh
);
2079 fprintf (file
, "%08x", (unsigned int) eh_data
);
2082 const char *s
= my_symbol_for_address (abfd
, eh
, &cache
);
2085 fprintf (file
, " (%s) ", s
);
2092 fprintf (file
, "\n");
2097 cleanup_syms (& cache
);
2100 #undef PDATA_ROW_SIZE
2104 #define IMAGE_REL_BASED_HIGHADJ 4
2105 static const char * const tbl
[] =
2119 "UNKNOWN", /* MUST be last. */
2123 pe_print_reloc (bfd
* abfd
, void * vfile
)
2125 FILE *file
= (FILE *) vfile
;
2127 asection
*section
= bfd_get_section_by_name (abfd
, ".reloc");
2130 if (section
== NULL
|| section
->size
== 0 || !(section
->flags
& SEC_HAS_CONTENTS
))
2134 _("\n\nPE File Base Relocations (interpreted .reloc section contents)\n"));
2136 if (! bfd_malloc_and_get_section (abfd
, section
, &data
))
2143 end
= data
+ section
->size
;
2144 while (p
+ 8 <= end
)
2147 bfd_vma virtual_address
;
2148 unsigned long number
, size
;
2149 bfd_byte
*chunk_end
;
2151 /* The .reloc section is a sequence of blocks, with a header consisting
2152 of two 32 bit quantities, followed by a number of 16 bit entries. */
2153 virtual_address
= bfd_get_32 (abfd
, p
);
2154 size
= bfd_get_32 (abfd
, p
+ 4);
2156 number
= (size
- 8) / 2;
2162 /* xgettext:c-format */
2163 _("\nVirtual Address: %08lx Chunk size %ld (0x%lx) Number of fixups %ld\n"),
2164 (unsigned long) virtual_address
, size
, size
, number
);
2166 chunk_end
= p
- 8 + size
;
2167 if (chunk_end
> end
)
2170 while (p
+ 2 <= chunk_end
)
2172 unsigned short e
= bfd_get_16 (abfd
, p
);
2173 unsigned int t
= (e
& 0xF000) >> 12;
2174 int off
= e
& 0x0FFF;
2176 if (t
>= sizeof (tbl
) / sizeof (tbl
[0]))
2177 t
= (sizeof (tbl
) / sizeof (tbl
[0])) - 1;
2180 /* xgettext:c-format */
2181 _("\treloc %4d offset %4x [%4lx] %s"),
2182 j
, off
, (unsigned long) (off
+ virtual_address
), tbl
[t
]);
2187 /* HIGHADJ takes an argument, - the next record *is* the
2188 low 16 bits of addend. */
2189 if (t
== IMAGE_REL_BASED_HIGHADJ
&& p
+ 2 <= chunk_end
)
2191 fprintf (file
, " (%4x)", (unsigned int) bfd_get_16 (abfd
, p
));
2196 fprintf (file
, "\n");
2205 /* A data structure describing the regions of a .rsrc section.
2206 Some fields are filled in as the section is parsed. */
2208 typedef struct rsrc_regions
2210 bfd_byte
* section_start
;
2211 bfd_byte
* section_end
;
2212 bfd_byte
* strings_start
;
2213 bfd_byte
* resource_start
;
2217 rsrc_print_resource_directory (FILE * , bfd
*, unsigned int, bfd_byte
*,
2218 rsrc_regions
*, bfd_vma
);
2220 /* Print the resource entry at DATA, with the text indented by INDENT.
2221 Recusively calls rsrc_print_resource_directory to print the contents
2222 of directory entries.
2223 Returns the address of the end of the data associated with the entry
2224 or section_end + 1 upon failure. */
2227 rsrc_print_resource_entries (FILE *file
,
2229 unsigned int indent
,
2232 rsrc_regions
*regions
,
2235 unsigned long entry
, addr
, size
;
2238 if (data
+ 8 >= regions
->section_end
)
2239 return regions
->section_end
+ 1;
2241 /* xgettext:c-format */
2242 fprintf (file
, _("%03x %*.s Entry: "), (int)(data
- regions
->section_start
), indent
, " ");
2244 entry
= (unsigned long) bfd_get_32 (abfd
, data
);
2249 /* Note - the documentation says that this field is an RVA value
2250 but windres appears to produce a section relative offset with
2251 the top bit set. Support both styles for now. */
2252 if (HighBitSet (entry
))
2253 name
= regions
->section_start
+ WithoutHighBit (entry
);
2255 name
= regions
->section_start
+ entry
- rva_bias
;
2257 if (name
+ 2 < regions
->section_end
&& name
> regions
->section_start
)
2261 if (regions
->strings_start
== NULL
)
2262 regions
->strings_start
= name
;
2264 len
= bfd_get_16 (abfd
, name
);
2266 fprintf (file
, _("name: [val: %08lx len %d]: "), entry
, len
);
2268 if (name
+ 2 + len
* 2 < regions
->section_end
)
2270 /* This strange loop is to cope with multibyte characters. */
2277 /* Avoid printing control characters. */
2278 if (c
> 0 && c
< 32)
2279 fprintf (file
, "^%c", c
+ 64);
2281 fprintf (file
, "%.1s", name
);
2286 fprintf (file
, _("<corrupt string length: %#x>\n"), len
);
2287 /* PR binutils/17512: Do not try to continue decoding a
2288 corrupted resource section. It is likely to end up with
2289 reams of extraneous output. FIXME: We could probably
2290 continue if we disable the printing of strings... */
2291 return regions
->section_end
+ 1;
2296 fprintf (file
, _("<corrupt string offset: %#lx>\n"), entry
);
2297 return regions
->section_end
+ 1;
2301 fprintf (file
, _("ID: %#08lx"), entry
);
2303 entry
= (long) bfd_get_32 (abfd
, data
+ 4);
2304 fprintf (file
, _(", Value: %#08lx\n"), entry
);
2306 if (HighBitSet (entry
))
2308 data
= regions
->section_start
+ WithoutHighBit (entry
);
2309 if (data
<= regions
->section_start
|| data
> regions
->section_end
)
2310 return regions
->section_end
+ 1;
2312 /* FIXME: PR binutils/17512: A corrupt file could contain a loop
2313 in the resource table. We need some way to detect this. */
2314 return rsrc_print_resource_directory (file
, abfd
, indent
+ 1, data
,
2318 leaf
= regions
->section_start
+ entry
;
2320 if (leaf
+ 16 >= regions
->section_end
2321 /* PR 17512: file: 055dff7e. */
2322 || leaf
< regions
->section_start
)
2323 return regions
->section_end
+ 1;
2325 /* xgettext:c-format */
2326 fprintf (file
, _("%03x %*.s Leaf: Addr: %#08lx, Size: %#08lx, Codepage: %d\n"),
2327 (int) (entry
), indent
, " ",
2328 addr
= (long) bfd_get_32 (abfd
, leaf
),
2329 size
= (long) bfd_get_32 (abfd
, leaf
+ 4),
2330 (int) bfd_get_32 (abfd
, leaf
+ 8));
2332 /* Check that the reserved entry is 0. */
2333 if (bfd_get_32 (abfd
, leaf
+ 12) != 0
2334 /* And that the data address/size is valid too. */
2335 || (regions
->section_start
+ (addr
- rva_bias
) + size
> regions
->section_end
))
2336 return regions
->section_end
+ 1;
2338 if (regions
->resource_start
== NULL
)
2339 regions
->resource_start
= regions
->section_start
+ (addr
- rva_bias
);
2341 return regions
->section_start
+ (addr
- rva_bias
) + size
;
2344 #define max(a,b) ((a) > (b) ? (a) : (b))
2345 #define min(a,b) ((a) < (b) ? (a) : (b))
2348 rsrc_print_resource_directory (FILE * file
,
2350 unsigned int indent
,
2352 rsrc_regions
* regions
,
2355 unsigned int num_names
, num_ids
;
2356 bfd_byte
* highest_data
= data
;
2358 if (data
+ 16 >= regions
->section_end
)
2359 return regions
->section_end
+ 1;
2361 fprintf (file
, "%03x %*.s ", (int)(data
- regions
->section_start
), indent
, " ");
2364 case 0: fprintf (file
, "Type"); break;
2365 case 2: fprintf (file
, "Name"); break;
2366 case 4: fprintf (file
, "Language"); break;
2368 fprintf (file
, _("<unknown directory type: %d>\n"), indent
);
2369 /* FIXME: For now we end the printing here. If in the
2370 future more directory types are added to the RSRC spec
2371 then we will need to change this. */
2372 return regions
->section_end
+ 1;
2375 /* xgettext:c-format */
2376 fprintf (file
, _(" Table: Char: %d, Time: %08lx, Ver: %d/%d, Num Names: %d, IDs: %d\n"),
2377 (int) bfd_get_32 (abfd
, data
),
2378 (long) bfd_get_32 (abfd
, data
+ 4),
2379 (int) bfd_get_16 (abfd
, data
+ 8),
2380 (int) bfd_get_16 (abfd
, data
+ 10),
2381 num_names
= (int) bfd_get_16 (abfd
, data
+ 12),
2382 num_ids
= (int) bfd_get_16 (abfd
, data
+ 14));
2385 while (num_names
--)
2387 bfd_byte
* entry_end
;
2389 entry_end
= rsrc_print_resource_entries (file
, abfd
, indent
+ 1, true,
2390 data
, regions
, rva_bias
);
2392 highest_data
= max (highest_data
, entry_end
);
2393 if (entry_end
>= regions
->section_end
)
2399 bfd_byte
* entry_end
;
2401 entry_end
= rsrc_print_resource_entries (file
, abfd
, indent
+ 1, false,
2402 data
, regions
, rva_bias
);
2404 highest_data
= max (highest_data
, entry_end
);
2405 if (entry_end
>= regions
->section_end
)
2409 return max (highest_data
, data
);
2412 /* Display the contents of a .rsrc section. We do not try to
2413 reproduce the resources, windres does that. Instead we dump
2414 the tables in a human readable format. */
2417 rsrc_print_section (bfd
* abfd
, void * vfile
)
2421 FILE * file
= (FILE *) vfile
;
2422 bfd_size_type datasize
;
2425 rsrc_regions regions
;
2427 pe
= pe_data (abfd
);
2431 section
= bfd_get_section_by_name (abfd
, ".rsrc");
2432 if (section
== NULL
)
2434 if (!(section
->flags
& SEC_HAS_CONTENTS
))
2437 datasize
= section
->size
;
2441 rva_bias
= section
->vma
- pe
->pe_opthdr
.ImageBase
;
2443 if (! bfd_malloc_and_get_section (abfd
, section
, & data
))
2449 regions
.section_start
= data
;
2450 regions
.section_end
= data
+ datasize
;
2451 regions
.strings_start
= NULL
;
2452 regions
.resource_start
= NULL
;
2455 fprintf (file
, "\nThe .rsrc Resource Directory section:\n");
2457 while (data
< regions
.section_end
)
2459 bfd_byte
* p
= data
;
2461 data
= rsrc_print_resource_directory (file
, abfd
, 0, data
, & regions
, rva_bias
);
2463 if (data
== regions
.section_end
+ 1)
2464 fprintf (file
, _("Corrupt .rsrc section detected!\n"));
2467 /* Align data before continuing. */
2468 int align
= (1 << section
->alignment_power
) - 1;
2470 data
= (bfd_byte
*) (((ptrdiff_t) (data
+ align
)) & ~ align
);
2471 rva_bias
+= data
- p
;
2473 /* For reasons that are unclear .rsrc sections are sometimes created
2474 aligned to a 1^3 boundary even when their alignment is set at
2475 1^2. Catch that case here before we issue a spurious warning
2477 if (data
== (regions
.section_end
- 4))
2478 data
= regions
.section_end
;
2479 else if (data
< regions
.section_end
)
2481 /* If the extra data is all zeros then do not complain.
2482 This is just padding so that the section meets the
2483 page size requirements. */
2484 while (++ data
< regions
.section_end
)
2487 if (data
< regions
.section_end
)
2488 fprintf (file
, _("\nWARNING: Extra data in .rsrc section - it will be ignored by Windows:\n"));
2493 if (regions
.strings_start
!= NULL
)
2494 fprintf (file
, _(" String table starts at offset: %#03x\n"),
2495 (int) (regions
.strings_start
- regions
.section_start
));
2496 if (regions
.resource_start
!= NULL
)
2497 fprintf (file
, _(" Resources start at offset: %#03x\n"),
2498 (int) (regions
.resource_start
- regions
.section_start
));
2500 free (regions
.section_start
);
2504 #define IMAGE_NUMBEROF_DEBUG_TYPES 17
2506 static char * debug_type_names
[IMAGE_NUMBEROF_DEBUG_TYPES
] =
2528 pe_print_debugdata (bfd
* abfd
, void * vfile
)
2530 FILE *file
= (FILE *) vfile
;
2531 pe_data_type
*pe
= pe_data (abfd
);
2532 struct internal_extra_pe_aouthdr
*extra
= &pe
->pe_opthdr
;
2535 bfd_size_type dataoff
;
2538 bfd_vma addr
= extra
->DataDirectory
[PE_DEBUG_DATA
].VirtualAddress
;
2539 bfd_size_type size
= extra
->DataDirectory
[PE_DEBUG_DATA
].Size
;
2544 addr
+= extra
->ImageBase
;
2545 for (section
= abfd
->sections
; section
!= NULL
; section
= section
->next
)
2547 if ((addr
>= section
->vma
) && (addr
< (section
->vma
+ section
->size
)))
2551 if (section
== NULL
)
2554 _("\nThere is a debug directory, but the section containing it could not be found\n"));
2557 else if (!(section
->flags
& SEC_HAS_CONTENTS
))
2560 _("\nThere is a debug directory in %s, but that section has no contents\n"),
2564 else if (section
->size
< size
)
2567 _("\nError: section %s contains the debug data starting address but it is too small\n"),
2572 fprintf (file
, _("\nThere is a debug directory in %s at 0x%lx\n\n"),
2573 section
->name
, (unsigned long) addr
);
2575 dataoff
= addr
- section
->vma
;
2577 if (size
> (section
->size
- dataoff
))
2579 fprintf (file
, _("The debug data size field in the data directory is too big for the section"));
2584 _("Type Size Rva Offset\n"));
2586 /* Read the whole section. */
2587 if (!bfd_malloc_and_get_section (abfd
, section
, &data
))
2593 for (i
= 0; i
< size
/ sizeof (struct external_IMAGE_DEBUG_DIRECTORY
); i
++)
2595 const char *type_name
;
2596 struct external_IMAGE_DEBUG_DIRECTORY
*ext
2597 = &((struct external_IMAGE_DEBUG_DIRECTORY
*)(data
+ dataoff
))[i
];
2598 struct internal_IMAGE_DEBUG_DIRECTORY idd
;
2600 _bfd_XXi_swap_debugdir_in (abfd
, ext
, &idd
);
2602 if ((idd
.Type
) >= IMAGE_NUMBEROF_DEBUG_TYPES
)
2603 type_name
= debug_type_names
[0];
2605 type_name
= debug_type_names
[idd
.Type
];
2607 fprintf (file
, " %2ld %14s %08lx %08lx %08lx\n",
2608 idd
.Type
, type_name
, idd
.SizeOfData
,
2609 idd
.AddressOfRawData
, idd
.PointerToRawData
);
2611 if (idd
.Type
== PE_IMAGE_DEBUG_TYPE_CODEVIEW
)
2613 char signature
[CV_INFO_SIGNATURE_LENGTH
* 2 + 1];
2614 /* PR 17512: file: 065-29434-0.001:0.1
2615 We need to use a 32-bit aligned buffer
2616 to safely read in a codeview record. */
2617 char buffer
[256 + 1] ATTRIBUTE_ALIGNED_ALIGNOF (CODEVIEW_INFO
);
2619 CODEVIEW_INFO
*cvinfo
= (CODEVIEW_INFO
*) buffer
;
2621 /* The debug entry doesn't have to have to be in a section,
2622 in which case AddressOfRawData is 0, so always use PointerToRawData. */
2623 if (!_bfd_XXi_slurp_codeview_record (abfd
, (file_ptr
) idd
.PointerToRawData
,
2624 idd
.SizeOfData
, cvinfo
))
2627 for (j
= 0; j
< cvinfo
->SignatureLength
; j
++)
2628 sprintf (&signature
[j
*2], "%02x", cvinfo
->Signature
[j
] & 0xff);
2630 /* xgettext:c-format */
2631 fprintf (file
, _("(format %c%c%c%c signature %s age %ld)\n"),
2632 buffer
[0], buffer
[1], buffer
[2], buffer
[3],
2633 signature
, cvinfo
->Age
);
2639 if (size
% sizeof (struct external_IMAGE_DEBUG_DIRECTORY
) != 0)
2641 _("The debug directory size is not a multiple of the debug directory entry size\n"));
2647 pe_is_repro (bfd
* abfd
)
2649 pe_data_type
*pe
= pe_data (abfd
);
2650 struct internal_extra_pe_aouthdr
*extra
= &pe
->pe_opthdr
;
2653 bfd_size_type dataoff
;
2657 bfd_vma addr
= extra
->DataDirectory
[PE_DEBUG_DATA
].VirtualAddress
;
2658 bfd_size_type size
= extra
->DataDirectory
[PE_DEBUG_DATA
].Size
;
2663 addr
+= extra
->ImageBase
;
2664 for (section
= abfd
->sections
; section
!= NULL
; section
= section
->next
)
2666 if ((addr
>= section
->vma
) && (addr
< (section
->vma
+ section
->size
)))
2670 if ((section
== NULL
)
2671 || (!(section
->flags
& SEC_HAS_CONTENTS
))
2672 || (section
->size
< size
))
2677 dataoff
= addr
- section
->vma
;
2679 if (size
> (section
->size
- dataoff
))
2684 if (!bfd_malloc_and_get_section (abfd
, section
, &data
))
2690 for (i
= 0; i
< size
/ sizeof (struct external_IMAGE_DEBUG_DIRECTORY
); i
++)
2692 struct external_IMAGE_DEBUG_DIRECTORY
*ext
2693 = &((struct external_IMAGE_DEBUG_DIRECTORY
*)(data
+ dataoff
))[i
];
2694 struct internal_IMAGE_DEBUG_DIRECTORY idd
;
2696 _bfd_XXi_swap_debugdir_in (abfd
, ext
, &idd
);
2698 if (idd
.Type
== PE_IMAGE_DEBUG_TYPE_REPRO
)
2710 /* Print out the program headers. */
2713 _bfd_XX_print_private_bfd_data_common (bfd
* abfd
, void * vfile
)
2715 FILE *file
= (FILE *) vfile
;
2717 pe_data_type
*pe
= pe_data (abfd
);
2718 struct internal_extra_pe_aouthdr
*i
= &pe
->pe_opthdr
;
2719 const char *subsystem_name
= NULL
;
2722 /* The MS dumpbin program reportedly ands with 0xff0f before
2723 printing the characteristics field. Not sure why. No reason to
2725 fprintf (file
, _("\nCharacteristics 0x%x\n"), pe
->real_flags
);
2727 #define PF(x, y) if (pe->real_flags & x) { fprintf (file, "\t%s\n", y); }
2728 PF (IMAGE_FILE_RELOCS_STRIPPED
, "relocations stripped");
2729 PF (IMAGE_FILE_EXECUTABLE_IMAGE
, "executable");
2730 PF (IMAGE_FILE_LINE_NUMS_STRIPPED
, "line numbers stripped");
2731 PF (IMAGE_FILE_LOCAL_SYMS_STRIPPED
, "symbols stripped");
2732 PF (IMAGE_FILE_LARGE_ADDRESS_AWARE
, "large address aware");
2733 PF (IMAGE_FILE_BYTES_REVERSED_LO
, "little endian");
2734 PF (IMAGE_FILE_32BIT_MACHINE
, "32 bit words");
2735 PF (IMAGE_FILE_DEBUG_STRIPPED
, "debugging information removed");
2736 PF (IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP
, "copy to swap file if on removable media");
2737 PF (IMAGE_FILE_NET_RUN_FROM_SWAP
, "copy to swap file if on network media");
2738 PF (IMAGE_FILE_SYSTEM
, "system file");
2739 PF (IMAGE_FILE_DLL
, "DLL");
2740 PF (IMAGE_FILE_UP_SYSTEM_ONLY
, "run only on uniprocessor machine");
2741 PF (IMAGE_FILE_BYTES_REVERSED_HI
, "big endian");
2745 If a PE_IMAGE_DEBUG_TYPE_REPRO entry is present in the debug directory, the
2746 timestamp is to be interpreted as the hash of a reproducible build.
2748 if (pe_is_repro (abfd
))
2750 fprintf (file
, "\nTime/Date\t\t%08lx", pe
->coff
.timestamp
);
2751 fprintf (file
, "\t(This is a reproducible build file hash, not a timestamp)\n");
2755 /* ctime implies '\n'. */
2756 time_t t
= pe
->coff
.timestamp
;
2757 fprintf (file
, "\nTime/Date\t\t%s", ctime (&t
));
2760 #ifndef IMAGE_NT_OPTIONAL_HDR_MAGIC
2761 # define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b
2763 #ifndef IMAGE_NT_OPTIONAL_HDR64_MAGIC
2764 # define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
2766 #ifndef IMAGE_NT_OPTIONAL_HDRROM_MAGIC
2767 # define IMAGE_NT_OPTIONAL_HDRROM_MAGIC 0x107
2772 case IMAGE_NT_OPTIONAL_HDR_MAGIC
:
2775 case IMAGE_NT_OPTIONAL_HDR64_MAGIC
:
2778 case IMAGE_NT_OPTIONAL_HDRROM_MAGIC
:
2785 fprintf (file
, "Magic\t\t\t%04x", i
->Magic
);
2787 fprintf (file
, "\t(%s)",name
);
2788 fprintf (file
, "\nMajorLinkerVersion\t%d\n", i
->MajorLinkerVersion
);
2789 fprintf (file
, "MinorLinkerVersion\t%d\n", i
->MinorLinkerVersion
);
2790 fprintf (file
, "SizeOfCode\t\t");
2791 bfd_fprintf_vma (abfd
, file
, i
->SizeOfCode
);
2792 fprintf (file
, "\nSizeOfInitializedData\t");
2793 bfd_fprintf_vma (abfd
, file
, i
->SizeOfInitializedData
);
2794 fprintf (file
, "\nSizeOfUninitializedData\t");
2795 bfd_fprintf_vma (abfd
, file
, i
->SizeOfUninitializedData
);
2796 fprintf (file
, "\nAddressOfEntryPoint\t");
2797 bfd_fprintf_vma (abfd
, file
, i
->AddressOfEntryPoint
);
2798 fprintf (file
, "\nBaseOfCode\t\t");
2799 bfd_fprintf_vma (abfd
, file
, i
->BaseOfCode
);
2800 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64)
2801 /* PE32+ does not have BaseOfData member! */
2802 fprintf (file
, "\nBaseOfData\t\t");
2803 bfd_fprintf_vma (abfd
, file
, i
->BaseOfData
);
2806 fprintf (file
, "\nImageBase\t\t");
2807 bfd_fprintf_vma (abfd
, file
, i
->ImageBase
);
2808 fprintf (file
, "\nSectionAlignment\t%08x\n", i
->SectionAlignment
);
2809 fprintf (file
, "FileAlignment\t\t%08x\n", i
->FileAlignment
);
2810 fprintf (file
, "MajorOSystemVersion\t%d\n", i
->MajorOperatingSystemVersion
);
2811 fprintf (file
, "MinorOSystemVersion\t%d\n", i
->MinorOperatingSystemVersion
);
2812 fprintf (file
, "MajorImageVersion\t%d\n", i
->MajorImageVersion
);
2813 fprintf (file
, "MinorImageVersion\t%d\n", i
->MinorImageVersion
);
2814 fprintf (file
, "MajorSubsystemVersion\t%d\n", i
->MajorSubsystemVersion
);
2815 fprintf (file
, "MinorSubsystemVersion\t%d\n", i
->MinorSubsystemVersion
);
2816 fprintf (file
, "Win32Version\t\t%08x\n", i
->Reserved1
);
2817 fprintf (file
, "SizeOfImage\t\t%08x\n", i
->SizeOfImage
);
2818 fprintf (file
, "SizeOfHeaders\t\t%08x\n", i
->SizeOfHeaders
);
2819 fprintf (file
, "CheckSum\t\t%08x\n", i
->CheckSum
);
2821 switch (i
->Subsystem
)
2823 case IMAGE_SUBSYSTEM_UNKNOWN
:
2824 subsystem_name
= "unspecified";
2826 case IMAGE_SUBSYSTEM_NATIVE
:
2827 subsystem_name
= "NT native";
2829 case IMAGE_SUBSYSTEM_WINDOWS_GUI
:
2830 subsystem_name
= "Windows GUI";
2832 case IMAGE_SUBSYSTEM_WINDOWS_CUI
:
2833 subsystem_name
= "Windows CUI";
2835 case IMAGE_SUBSYSTEM_POSIX_CUI
:
2836 subsystem_name
= "POSIX CUI";
2838 case IMAGE_SUBSYSTEM_WINDOWS_CE_GUI
:
2839 subsystem_name
= "Wince CUI";
2841 /* These are from UEFI Platform Initialization Specification 1.1. */
2842 case IMAGE_SUBSYSTEM_EFI_APPLICATION
:
2843 subsystem_name
= "EFI application";
2845 case IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER
:
2846 subsystem_name
= "EFI boot service driver";
2848 case IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER
:
2849 subsystem_name
= "EFI runtime driver";
2851 case IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER
:
2852 subsystem_name
= "SAL runtime driver";
2854 /* This is from revision 8.0 of the MS PE/COFF spec */
2855 case IMAGE_SUBSYSTEM_XBOX
:
2856 subsystem_name
= "XBOX";
2858 /* Added default case for clarity - subsystem_name is NULL anyway. */
2860 subsystem_name
= NULL
;
2863 fprintf (file
, "Subsystem\t\t%08x", i
->Subsystem
);
2865 fprintf (file
, "\t(%s)", subsystem_name
);
2866 fprintf (file
, "\nDllCharacteristics\t%08x\n", i
->DllCharacteristics
);
2867 if (i
->DllCharacteristics
)
2869 unsigned short dllch
= i
->DllCharacteristics
;
2870 const char *indent
= "\t\t\t\t\t";
2872 if (dllch
& IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA
)
2873 fprintf (file
, "%sHIGH_ENTROPY_VA\n", indent
);
2874 if (dllch
& IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE
)
2875 fprintf (file
, "%sDYNAMIC_BASE\n", indent
);
2876 if (dllch
& IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY
)
2877 fprintf (file
, "%sFORCE_INTEGRITY\n", indent
);
2878 if (dllch
& IMAGE_DLL_CHARACTERISTICS_NX_COMPAT
)
2879 fprintf (file
, "%sNX_COMPAT\n", indent
);
2880 if (dllch
& IMAGE_DLLCHARACTERISTICS_NO_ISOLATION
)
2881 fprintf (file
, "%sNO_ISOLATION\n", indent
);
2882 if (dllch
& IMAGE_DLLCHARACTERISTICS_NO_SEH
)
2883 fprintf (file
, "%sNO_SEH\n", indent
);
2884 if (dllch
& IMAGE_DLLCHARACTERISTICS_NO_BIND
)
2885 fprintf (file
, "%sNO_BIND\n", indent
);
2886 if (dllch
& IMAGE_DLLCHARACTERISTICS_APPCONTAINER
)
2887 fprintf (file
, "%sAPPCONTAINER\n", indent
);
2888 if (dllch
& IMAGE_DLLCHARACTERISTICS_WDM_DRIVER
)
2889 fprintf (file
, "%sWDM_DRIVER\n", indent
);
2890 if (dllch
& IMAGE_DLLCHARACTERISTICS_GUARD_CF
)
2891 fprintf (file
, "%sGUARD_CF\n", indent
);
2892 if (dllch
& IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE
)
2893 fprintf (file
, "%sTERMINAL_SERVICE_AWARE\n", indent
);
2895 fprintf (file
, "SizeOfStackReserve\t");
2896 bfd_fprintf_vma (abfd
, file
, i
->SizeOfStackReserve
);
2897 fprintf (file
, "\nSizeOfStackCommit\t");
2898 bfd_fprintf_vma (abfd
, file
, i
->SizeOfStackCommit
);
2899 fprintf (file
, "\nSizeOfHeapReserve\t");
2900 bfd_fprintf_vma (abfd
, file
, i
->SizeOfHeapReserve
);
2901 fprintf (file
, "\nSizeOfHeapCommit\t");
2902 bfd_fprintf_vma (abfd
, file
, i
->SizeOfHeapCommit
);
2903 fprintf (file
, "\nLoaderFlags\t\t%08lx\n", (unsigned long) i
->LoaderFlags
);
2904 fprintf (file
, "NumberOfRvaAndSizes\t%08lx\n",
2905 (unsigned long) i
->NumberOfRvaAndSizes
);
2907 fprintf (file
, "\nThe Data Directory\n");
2908 for (j
= 0; j
< IMAGE_NUMBEROF_DIRECTORY_ENTRIES
; j
++)
2910 fprintf (file
, "Entry %1x ", j
);
2911 bfd_fprintf_vma (abfd
, file
, i
->DataDirectory
[j
].VirtualAddress
);
2912 fprintf (file
, " %08lx ", (unsigned long) i
->DataDirectory
[j
].Size
);
2913 fprintf (file
, "%s\n", dir_names
[j
]);
2916 pe_print_idata (abfd
, vfile
);
2917 pe_print_edata (abfd
, vfile
);
2918 if (bfd_coff_have_print_pdata (abfd
))
2919 bfd_coff_print_pdata (abfd
, vfile
);
2921 pe_print_pdata (abfd
, vfile
);
2922 pe_print_reloc (abfd
, vfile
);
2923 pe_print_debugdata (abfd
, file
);
2925 rsrc_print_section (abfd
, vfile
);
2931 is_vma_in_section (bfd
*abfd ATTRIBUTE_UNUSED
, asection
*sect
, void *obj
)
2933 bfd_vma addr
= * (bfd_vma
*) obj
;
2934 return (addr
>= sect
->vma
) && (addr
< (sect
->vma
+ sect
->size
));
2938 find_section_by_vma (bfd
*abfd
, bfd_vma addr
)
2940 return bfd_sections_find_if (abfd
, is_vma_in_section
, (void *) & addr
);
2943 /* Copy any private info we understand from the input bfd
2944 to the output bfd. */
2947 _bfd_XX_bfd_copy_private_bfd_data_common (bfd
* ibfd
, bfd
* obfd
)
2949 pe_data_type
*ipe
, *ope
;
2952 /* One day we may try to grok other private data. */
2953 if (ibfd
->xvec
->flavour
!= bfd_target_coff_flavour
2954 || obfd
->xvec
->flavour
!= bfd_target_coff_flavour
)
2957 ipe
= pe_data (ibfd
);
2958 ope
= pe_data (obfd
);
2960 /* pe_opthdr is copied in copy_object. */
2961 ope
->dll
= ipe
->dll
;
2963 /* Don't copy input subsystem if output is different from input. */
2964 if (obfd
->xvec
!= ibfd
->xvec
)
2965 ope
->pe_opthdr
.Subsystem
= IMAGE_SUBSYSTEM_UNKNOWN
;
2967 /* For strip: if we removed .reloc, we'll make a real mess of things
2968 if we don't remove this entry as well. */
2969 if (! pe_data (obfd
)->has_reloc_section
)
2971 pe_data (obfd
)->pe_opthdr
.DataDirectory
[PE_BASE_RELOCATION_TABLE
].VirtualAddress
= 0;
2972 pe_data (obfd
)->pe_opthdr
.DataDirectory
[PE_BASE_RELOCATION_TABLE
].Size
= 0;
2975 /* For PIE, if there is .reloc, we won't add IMAGE_FILE_RELOCS_STRIPPED.
2976 But there is no .reloc, we make sure that IMAGE_FILE_RELOCS_STRIPPED
2978 if (! pe_data (ibfd
)->has_reloc_section
2979 && ! (pe_data (ibfd
)->real_flags
& IMAGE_FILE_RELOCS_STRIPPED
))
2980 pe_data (obfd
)->dont_strip_reloc
= 1;
2982 memcpy (ope
->dos_message
, ipe
->dos_message
, sizeof (ope
->dos_message
));
2984 /* The file offsets contained in the debug directory need rewriting. */
2985 size
= ope
->pe_opthdr
.DataDirectory
[PE_DEBUG_DATA
].Size
;
2988 bfd_vma addr
= ope
->pe_opthdr
.DataDirectory
[PE_DEBUG_DATA
].VirtualAddress
2989 + ope
->pe_opthdr
.ImageBase
;
2990 /* In particular a .buildid section may overlap (in VA space) with
2991 whatever section comes ahead of it (largely because of section->size
2992 representing s_size, not virt_size). Therefore don't look for the
2993 section containing the first byte, but for that covering the last
2995 bfd_vma last
= addr
+ size
- 1;
2996 asection
*section
= find_section_by_vma (obfd
, last
);
2998 if (section
!= NULL
)
3001 bfd_vma dataoff
= addr
- section
->vma
;
3003 /* PR 17512: file: 0f15796a. */
3004 if (addr
< section
->vma
3005 || section
->size
< dataoff
3006 || section
->size
- dataoff
< size
)
3008 /* xgettext:c-format */
3010 (_("%pB: Data Directory (%lx bytes at %" PRIx64
") "
3011 "extends across section boundary at %" PRIx64
),
3012 obfd
, ope
->pe_opthdr
.DataDirectory
[PE_DEBUG_DATA
].Size
,
3013 (uint64_t) addr
, (uint64_t) section
->vma
);
3017 if (bfd_malloc_and_get_section (obfd
, section
, &data
))
3020 struct external_IMAGE_DEBUG_DIRECTORY
*dd
=
3021 (struct external_IMAGE_DEBUG_DIRECTORY
*)(data
+ dataoff
);
3023 for (i
= 0; i
< ope
->pe_opthdr
.DataDirectory
[PE_DEBUG_DATA
].Size
3024 / sizeof (struct external_IMAGE_DEBUG_DIRECTORY
); i
++)
3026 asection
*ddsection
;
3027 struct external_IMAGE_DEBUG_DIRECTORY
*edd
= &(dd
[i
]);
3028 struct internal_IMAGE_DEBUG_DIRECTORY idd
;
3031 _bfd_XXi_swap_debugdir_in (obfd
, edd
, &idd
);
3033 /* RVA 0 means only offset is valid, not handled yet. */
3034 if (idd
.AddressOfRawData
== 0)
3037 idd_vma
= idd
.AddressOfRawData
+ ope
->pe_opthdr
.ImageBase
;
3038 ddsection
= find_section_by_vma (obfd
, idd_vma
);
3040 continue; /* Not in a section! */
3042 idd
.PointerToRawData
3043 = ddsection
->filepos
+ idd_vma
- ddsection
->vma
;
3044 _bfd_XXi_swap_debugdir_out (obfd
, &idd
, edd
);
3047 if (!bfd_set_section_contents (obfd
, section
, data
, 0,
3050 _bfd_error_handler (_("failed to update file offsets"
3051 " in debug directory"));
3059 _bfd_error_handler (_("%pB: failed to read "
3060 "debug data section"), obfd
);
3069 /* Copy private section data. */
3072 _bfd_XX_bfd_copy_private_section_data (bfd
*ibfd
,
3077 if (bfd_get_flavour (ibfd
) != bfd_target_coff_flavour
3078 || bfd_get_flavour (obfd
) != bfd_target_coff_flavour
)
3081 if (coff_section_data (ibfd
, isec
) != NULL
3082 && pei_section_data (ibfd
, isec
) != NULL
)
3084 if (coff_section_data (obfd
, osec
) == NULL
)
3086 size_t amt
= sizeof (struct coff_section_tdata
);
3087 osec
->used_by_bfd
= bfd_zalloc (obfd
, amt
);
3088 if (osec
->used_by_bfd
== NULL
)
3092 if (pei_section_data (obfd
, osec
) == NULL
)
3094 size_t amt
= sizeof (struct pei_section_tdata
);
3095 coff_section_data (obfd
, osec
)->tdata
= bfd_zalloc (obfd
, amt
);
3096 if (coff_section_data (obfd
, osec
)->tdata
== NULL
)
3100 pei_section_data (obfd
, osec
)->virt_size
=
3101 pei_section_data (ibfd
, isec
)->virt_size
;
3102 pei_section_data (obfd
, osec
)->pe_flags
=
3103 pei_section_data (ibfd
, isec
)->pe_flags
;
3110 _bfd_XX_get_symbol_info (bfd
* abfd
, asymbol
*symbol
, symbol_info
*ret
)
3112 coff_get_symbol_info (abfd
, symbol
, ret
);
3115 #if !defined(COFF_WITH_pep) && (defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64))
3117 sort_x64_pdata (const void *l
, const void *r
)
3119 const char *lp
= (const char *) l
;
3120 const char *rp
= (const char *) r
;
3122 vl
= bfd_getl32 (lp
); vr
= bfd_getl32 (rp
);
3124 return (vl
< vr
? -1 : 1);
3125 /* We compare just begin address. */
3130 /* Functions to process a .rsrc section. */
3132 static unsigned int sizeof_leaves
;
3133 static unsigned int sizeof_strings
;
3134 static unsigned int sizeof_tables_and_entries
;
3137 rsrc_count_directory (bfd
*, bfd_byte
*, bfd_byte
*, bfd_byte
*, bfd_vma
);
3140 rsrc_count_entries (bfd
*abfd
,
3142 bfd_byte
*datastart
,
3147 unsigned long entry
, addr
, size
;
3149 if (data
+ 8 >= dataend
)
3156 entry
= (long) bfd_get_32 (abfd
, data
);
3158 if (HighBitSet (entry
))
3159 name
= datastart
+ WithoutHighBit (entry
);
3161 name
= datastart
+ entry
- rva_bias
;
3163 if (name
+ 2 >= dataend
|| name
< datastart
)
3166 unsigned int len
= bfd_get_16 (abfd
, name
);
3167 if (len
== 0 || len
> 256)
3171 entry
= (long) bfd_get_32 (abfd
, data
+ 4);
3173 if (HighBitSet (entry
))
3175 data
= datastart
+ WithoutHighBit (entry
);
3177 if (data
<= datastart
|| data
>= dataend
)
3180 return rsrc_count_directory (abfd
, datastart
, data
, dataend
, rva_bias
);
3183 if (datastart
+ entry
+ 16 >= dataend
)
3186 addr
= (long) bfd_get_32 (abfd
, datastart
+ entry
);
3187 size
= (long) bfd_get_32 (abfd
, datastart
+ entry
+ 4);
3189 return datastart
+ addr
- rva_bias
+ size
;
3193 rsrc_count_directory (bfd
* abfd
,
3194 bfd_byte
* datastart
,
3199 unsigned int num_entries
, num_ids
;
3200 bfd_byte
* highest_data
= data
;
3202 if (data
+ 16 >= dataend
)
3205 num_entries
= (int) bfd_get_16 (abfd
, data
+ 12);
3206 num_ids
= (int) bfd_get_16 (abfd
, data
+ 14);
3208 num_entries
+= num_ids
;
3212 while (num_entries
--)
3214 bfd_byte
* entry_end
;
3216 entry_end
= rsrc_count_entries (abfd
, num_entries
>= num_ids
,
3217 datastart
, data
, dataend
, rva_bias
);
3219 highest_data
= max (highest_data
, entry_end
);
3220 if (entry_end
>= dataend
)
3224 return max (highest_data
, data
);
3227 typedef struct rsrc_dir_chain
3229 unsigned int num_entries
;
3230 struct rsrc_entry
* first_entry
;
3231 struct rsrc_entry
* last_entry
;
3234 typedef struct rsrc_directory
3236 unsigned int characteristics
;
3241 rsrc_dir_chain names
;
3244 struct rsrc_entry
* entry
;
3247 typedef struct rsrc_string
3253 typedef struct rsrc_leaf
3256 unsigned int codepage
;
3260 typedef struct rsrc_entry
3266 struct rsrc_string name
;
3272 struct rsrc_directory
* directory
;
3273 struct rsrc_leaf
* leaf
;
3276 struct rsrc_entry
* next_entry
;
3277 struct rsrc_directory
* parent
;
3281 rsrc_parse_directory (bfd
*, rsrc_directory
*, bfd_byte
*,
3282 bfd_byte
*, bfd_byte
*, bfd_vma
, rsrc_entry
*);
3285 rsrc_parse_entry (bfd
*abfd
,
3288 bfd_byte
*datastart
,
3292 rsrc_directory
*parent
)
3294 unsigned long val
, addr
, size
;
3296 val
= bfd_get_32 (abfd
, data
);
3298 entry
->parent
= parent
;
3299 entry
->is_name
= is_name
;
3305 if (HighBitSet (val
))
3307 val
= WithoutHighBit (val
);
3309 address
= datastart
+ val
;
3313 address
= datastart
+ val
- rva_bias
;
3316 if (address
+ 3 > dataend
)
3319 entry
->name_id
.name
.len
= bfd_get_16 (abfd
, address
);
3320 entry
->name_id
.name
.string
= address
+ 2;
3323 entry
->name_id
.id
= val
;
3325 val
= bfd_get_32 (abfd
, data
+ 4);
3327 if (HighBitSet (val
))
3329 entry
->is_dir
= true;
3330 entry
->value
.directory
= bfd_malloc (sizeof * entry
->value
.directory
);
3331 if (entry
->value
.directory
== NULL
)
3334 return rsrc_parse_directory (abfd
, entry
->value
.directory
,
3336 datastart
+ WithoutHighBit (val
),
3337 dataend
, rva_bias
, entry
);
3340 entry
->is_dir
= false;
3341 entry
->value
.leaf
= bfd_malloc (sizeof * entry
->value
.leaf
);
3342 if (entry
->value
.leaf
== NULL
)
3345 data
= datastart
+ val
;
3346 if (data
< datastart
|| data
>= dataend
)
3349 addr
= bfd_get_32 (abfd
, data
);
3350 size
= entry
->value
.leaf
->size
= bfd_get_32 (abfd
, data
+ 4);
3351 entry
->value
.leaf
->codepage
= bfd_get_32 (abfd
, data
+ 8);
3352 /* FIXME: We assume that the reserved field (data + 12) is OK. */
3354 entry
->value
.leaf
->data
= bfd_malloc (size
);
3355 if (entry
->value
.leaf
->data
== NULL
)
3358 memcpy (entry
->value
.leaf
->data
, datastart
+ addr
- rva_bias
, size
);
3359 return datastart
+ (addr
- rva_bias
) + size
;
3363 rsrc_parse_entries (bfd
*abfd
,
3364 rsrc_dir_chain
*chain
,
3366 bfd_byte
*highest_data
,
3367 bfd_byte
*datastart
,
3371 rsrc_directory
*parent
)
3376 if (chain
->num_entries
== 0)
3378 chain
->first_entry
= chain
->last_entry
= NULL
;
3379 return highest_data
;
3382 entry
= bfd_malloc (sizeof * entry
);
3386 chain
->first_entry
= entry
;
3388 for (i
= chain
->num_entries
; i
--;)
3390 bfd_byte
* entry_end
;
3392 entry_end
= rsrc_parse_entry (abfd
, is_name
, entry
, datastart
,
3393 data
, dataend
, rva_bias
, parent
);
3395 highest_data
= max (entry_end
, highest_data
);
3396 if (entry_end
> dataend
)
3401 entry
->next_entry
= bfd_malloc (sizeof * entry
);
3402 entry
= entry
->next_entry
;
3407 entry
->next_entry
= NULL
;
3410 chain
->last_entry
= entry
;
3412 return highest_data
;
3416 rsrc_parse_directory (bfd
* abfd
,
3417 rsrc_directory
* table
,
3418 bfd_byte
* datastart
,
3424 bfd_byte
* highest_data
= data
;
3429 table
->characteristics
= bfd_get_32 (abfd
, data
);
3430 table
->time
= bfd_get_32 (abfd
, data
+ 4);
3431 table
->major
= bfd_get_16 (abfd
, data
+ 8);
3432 table
->minor
= bfd_get_16 (abfd
, data
+ 10);
3433 table
->names
.num_entries
= bfd_get_16 (abfd
, data
+ 12);
3434 table
->ids
.num_entries
= bfd_get_16 (abfd
, data
+ 14);
3435 table
->entry
= entry
;
3439 highest_data
= rsrc_parse_entries (abfd
, & table
->names
, true, data
,
3440 datastart
, data
, dataend
, rva_bias
, table
);
3441 data
+= table
->names
.num_entries
* 8;
3443 highest_data
= rsrc_parse_entries (abfd
, & table
->ids
, false, highest_data
,
3444 datastart
, data
, dataend
, rva_bias
, table
);
3445 data
+= table
->ids
.num_entries
* 8;
3447 return max (highest_data
, data
);
3450 typedef struct rsrc_write_data
3453 bfd_byte
* datastart
;
3454 bfd_byte
* next_table
;
3455 bfd_byte
* next_leaf
;
3456 bfd_byte
* next_string
;
3457 bfd_byte
* next_data
;
3462 rsrc_write_string (rsrc_write_data
* data
,
3463 rsrc_string
* string
)
3465 bfd_put_16 (data
->abfd
, string
->len
, data
->next_string
);
3466 memcpy (data
->next_string
+ 2, string
->string
, string
->len
* 2);
3467 data
->next_string
+= (string
->len
+ 1) * 2;
3470 static inline unsigned int
3471 rsrc_compute_rva (rsrc_write_data
* data
,
3474 return (addr
- data
->datastart
) + data
->rva_bias
;
3478 rsrc_write_leaf (rsrc_write_data
* data
,
3481 bfd_put_32 (data
->abfd
, rsrc_compute_rva (data
, data
->next_data
),
3483 bfd_put_32 (data
->abfd
, leaf
->size
, data
->next_leaf
+ 4);
3484 bfd_put_32 (data
->abfd
, leaf
->codepage
, data
->next_leaf
+ 8);
3485 bfd_put_32 (data
->abfd
, 0 /*reserved*/, data
->next_leaf
+ 12);
3486 data
->next_leaf
+= 16;
3488 memcpy (data
->next_data
, leaf
->data
, leaf
->size
);
3489 /* An undocumented feature of Windows resources is that each unit
3490 of raw data is 8-byte aligned... */
3491 data
->next_data
+= ((leaf
->size
+ 7) & ~7);
3494 static void rsrc_write_directory (rsrc_write_data
*, rsrc_directory
*);
3497 rsrc_write_entry (rsrc_write_data
* data
,
3503 bfd_put_32 (data
->abfd
,
3504 SetHighBit (data
->next_string
- data
->datastart
),
3506 rsrc_write_string (data
, & entry
->name_id
.name
);
3509 bfd_put_32 (data
->abfd
, entry
->name_id
.id
, where
);
3513 bfd_put_32 (data
->abfd
,
3514 SetHighBit (data
->next_table
- data
->datastart
),
3516 rsrc_write_directory (data
, entry
->value
.directory
);
3520 bfd_put_32 (data
->abfd
, data
->next_leaf
- data
->datastart
, where
+ 4);
3521 rsrc_write_leaf (data
, entry
->value
.leaf
);
3526 rsrc_compute_region_sizes (rsrc_directory
* dir
)
3528 struct rsrc_entry
* entry
;
3533 sizeof_tables_and_entries
+= 16;
3535 for (entry
= dir
->names
.first_entry
; entry
!= NULL
; entry
= entry
->next_entry
)
3537 sizeof_tables_and_entries
+= 8;
3539 sizeof_strings
+= (entry
->name_id
.name
.len
+ 1) * 2;
3542 rsrc_compute_region_sizes (entry
->value
.directory
);
3544 sizeof_leaves
+= 16;
3547 for (entry
= dir
->ids
.first_entry
; entry
!= NULL
; entry
= entry
->next_entry
)
3549 sizeof_tables_and_entries
+= 8;
3552 rsrc_compute_region_sizes (entry
->value
.directory
);
3554 sizeof_leaves
+= 16;
3559 rsrc_write_directory (rsrc_write_data
* data
,
3560 rsrc_directory
* dir
)
3564 bfd_byte
* next_entry
;
3567 bfd_put_32 (data
->abfd
, dir
->characteristics
, data
->next_table
);
3568 bfd_put_32 (data
->abfd
, 0 /*dir->time*/, data
->next_table
+ 4);
3569 bfd_put_16 (data
->abfd
, dir
->major
, data
->next_table
+ 8);
3570 bfd_put_16 (data
->abfd
, dir
->minor
, data
->next_table
+ 10);
3571 bfd_put_16 (data
->abfd
, dir
->names
.num_entries
, data
->next_table
+ 12);
3572 bfd_put_16 (data
->abfd
, dir
->ids
.num_entries
, data
->next_table
+ 14);
3574 /* Compute where the entries and the next table will be placed. */
3575 next_entry
= data
->next_table
+ 16;
3576 data
->next_table
= next_entry
+ (dir
->names
.num_entries
* 8)
3577 + (dir
->ids
.num_entries
* 8);
3578 nt
= data
->next_table
;
3580 /* Write the entries. */
3581 for (i
= dir
->names
.num_entries
, entry
= dir
->names
.first_entry
;
3582 i
> 0 && entry
!= NULL
;
3583 i
--, entry
= entry
->next_entry
)
3585 BFD_ASSERT (entry
->is_name
);
3586 rsrc_write_entry (data
, next_entry
, entry
);
3589 BFD_ASSERT (i
== 0);
3590 BFD_ASSERT (entry
== NULL
);
3592 for (i
= dir
->ids
.num_entries
, entry
= dir
->ids
.first_entry
;
3593 i
> 0 && entry
!= NULL
;
3594 i
--, entry
= entry
->next_entry
)
3596 BFD_ASSERT (! entry
->is_name
);
3597 rsrc_write_entry (data
, next_entry
, entry
);
3600 BFD_ASSERT (i
== 0);
3601 BFD_ASSERT (entry
== NULL
);
3602 BFD_ASSERT (nt
== next_entry
);
3605 #if ! defined __CYGWIN__ && ! defined __MINGW32__
3606 /* Return the length (number of units) of the first character in S,
3607 putting its 'ucs4_t' representation in *PUC. */
3610 u16_mbtouc (wint_t * puc
, const unsigned short * s
, unsigned int n
)
3612 unsigned short c
= * s
;
3614 if (c
< 0xd800 || c
>= 0xe000)
3624 if (s
[1] >= 0xdc00 && s
[1] < 0xe000)
3626 *puc
= 0x10000 + ((c
- 0xd800) << 10) + (s
[1] - 0xdc00);
3632 /* Incomplete multibyte character. */
3638 /* Invalid multibyte character. */
3642 #endif /* not Cygwin/Mingw */
3644 /* Perform a comparison of two entries. */
3646 rsrc_cmp (bool is_name
, rsrc_entry
* a
, rsrc_entry
* b
)
3655 return a
->name_id
.id
- b
->name_id
.id
;
3657 /* We have to perform a case insenstive, unicode string comparison... */
3658 astring
= a
->name_id
.name
.string
;
3659 alen
= a
->name_id
.name
.len
;
3660 bstring
= b
->name_id
.name
.string
;
3661 blen
= b
->name_id
.name
.len
;
3663 #if defined __CYGWIN__ || defined __MINGW32__
3664 /* Under Windows hosts (both Cygwin and Mingw types),
3665 unicode == UTF-16 == wchar_t. The case insensitive string comparison
3666 function however goes by different names in the two environments... */
3670 #define rscpcmp wcsncasecmp
3673 #define rscpcmp wcsnicmp
3676 res
= rscpcmp ((const wchar_t *) astring
, (const wchar_t *) bstring
,
3684 for (i
= min (alen
, blen
); i
--; astring
+= 2, bstring
+= 2)
3689 /* Convert UTF-16 unicode characters into wchar_t characters
3690 so that we can then perform a case insensitive comparison. */
3691 unsigned int Alen
= u16_mbtouc (& awc
, (const unsigned short *) astring
, 2);
3692 unsigned int Blen
= u16_mbtouc (& bwc
, (const unsigned short *) bstring
, 2);
3697 awc
= towlower (awc
);
3698 bwc
= towlower (bwc
);
3714 rsrc_print_name (char * buffer
, rsrc_string string
)
3717 bfd_byte
* name
= string
.string
;
3719 for (i
= string
.len
; i
--; name
+= 2)
3720 sprintf (buffer
+ strlen (buffer
), "%.1s", name
);
3724 rsrc_resource_name (rsrc_entry
*entry
, rsrc_directory
*dir
, char *buffer
)
3726 bool is_string
= false;
3730 if (dir
!= NULL
&& dir
->entry
!= NULL
&& dir
->entry
->parent
!= NULL
3731 && dir
->entry
->parent
->entry
!= NULL
)
3733 strcpy (buffer
, "type: ");
3734 if (dir
->entry
->parent
->entry
->is_name
)
3735 rsrc_print_name (buffer
+ strlen (buffer
),
3736 dir
->entry
->parent
->entry
->name_id
.name
);
3739 unsigned int id
= dir
->entry
->parent
->entry
->name_id
.id
;
3741 sprintf (buffer
+ strlen (buffer
), "%x", id
);
3744 case 1: strcat (buffer
, " (CURSOR)"); break;
3745 case 2: strcat (buffer
, " (BITMAP)"); break;
3746 case 3: strcat (buffer
, " (ICON)"); break;
3747 case 4: strcat (buffer
, " (MENU)"); break;
3748 case 5: strcat (buffer
, " (DIALOG)"); break;
3749 case 6: strcat (buffer
, " (STRING)"); is_string
= true; break;
3750 case 7: strcat (buffer
, " (FONTDIR)"); break;
3751 case 8: strcat (buffer
, " (FONT)"); break;
3752 case 9: strcat (buffer
, " (ACCELERATOR)"); break;
3753 case 10: strcat (buffer
, " (RCDATA)"); break;
3754 case 11: strcat (buffer
, " (MESSAGETABLE)"); break;
3755 case 12: strcat (buffer
, " (GROUP_CURSOR)"); break;
3756 case 14: strcat (buffer
, " (GROUP_ICON)"); break;
3757 case 16: strcat (buffer
, " (VERSION)"); break;
3758 case 17: strcat (buffer
, " (DLGINCLUDE)"); break;
3759 case 19: strcat (buffer
, " (PLUGPLAY)"); break;
3760 case 20: strcat (buffer
, " (VXD)"); break;
3761 case 21: strcat (buffer
, " (ANICURSOR)"); break;
3762 case 22: strcat (buffer
, " (ANIICON)"); break;
3763 case 23: strcat (buffer
, " (HTML)"); break;
3764 case 24: strcat (buffer
, " (MANIFEST)"); break;
3765 case 240: strcat (buffer
, " (DLGINIT)"); break;
3766 case 241: strcat (buffer
, " (TOOLBAR)"); break;
3771 if (dir
!= NULL
&& dir
->entry
!= NULL
)
3773 strcat (buffer
, " name: ");
3774 if (dir
->entry
->is_name
)
3775 rsrc_print_name (buffer
+ strlen (buffer
), dir
->entry
->name_id
.name
);
3778 unsigned int id
= dir
->entry
->name_id
.id
;
3780 sprintf (buffer
+ strlen (buffer
), "%x", id
);
3783 sprintf (buffer
+ strlen (buffer
), " (resource id range: %d - %d)",
3784 (id
- 1) << 4, (id
<< 4) - 1);
3790 strcat (buffer
, " lang: ");
3793 rsrc_print_name (buffer
+ strlen (buffer
), entry
->name_id
.name
);
3795 sprintf (buffer
+ strlen (buffer
), "%x", entry
->name_id
.id
);
3801 /* *sigh* Windows resource strings are special. Only the top 28-bits of
3802 their ID is stored in the NAME entry. The bottom four bits are used as
3803 an index into unicode string table that makes up the data of the leaf.
3804 So identical type-name-lang string resources may not actually be
3807 This function is called when we have detected two string resources with
3808 match top-28-bit IDs. We have to scan the string tables inside the leaves
3809 and discover if there are any real collisions. If there are then we report
3810 them and return FALSE. Otherwise we copy any strings from B into A and
3811 then return TRUE. */
3814 rsrc_merge_string_entries (rsrc_entry
* a ATTRIBUTE_UNUSED
,
3815 rsrc_entry
* b ATTRIBUTE_UNUSED
)
3817 unsigned int copy_needed
= 0;
3821 bfd_byte
* new_data
;
3824 /* Step one: Find out what we have to do. */
3825 BFD_ASSERT (! a
->is_dir
);
3826 astring
= a
->value
.leaf
->data
;
3828 BFD_ASSERT (! b
->is_dir
);
3829 bstring
= b
->value
.leaf
->data
;
3831 for (i
= 0; i
< 16; i
++)
3833 unsigned int alen
= astring
[0] + (astring
[1] << 8);
3834 unsigned int blen
= bstring
[0] + (bstring
[1] << 8);
3838 copy_needed
+= blen
* 2;
3842 else if (alen
!= blen
)
3843 /* FIXME: Should we continue the loop in order to report other duplicates ? */
3845 /* alen == blen != 0. We might have two identical strings. If so we
3846 can ignore the second one. There is no need for wchar_t vs UTF-16
3847 theatrics here - we are only interested in (case sensitive) equality. */
3848 else if (memcmp (astring
+ 2, bstring
+ 2, alen
* 2) != 0)
3851 astring
+= (alen
+ 1) * 2;
3852 bstring
+= (blen
+ 1) * 2;
3857 if (a
->parent
!= NULL
3858 && a
->parent
->entry
!= NULL
3859 && !a
->parent
->entry
->is_name
)
3860 _bfd_error_handler (_(".rsrc merge failure: duplicate string resource: %d"),
3861 ((a
->parent
->entry
->name_id
.id
- 1) << 4) + i
);
3865 if (copy_needed
== 0)
3868 /* If we reach here then A and B must both have non-colliding strings.
3869 (We never get string resources with fully empty string tables).
3870 We need to allocate an extra COPY_NEEDED bytes in A and then bring
3872 new_data
= bfd_malloc (a
->value
.leaf
->size
+ copy_needed
);
3873 if (new_data
== NULL
)
3877 astring
= a
->value
.leaf
->data
;
3878 bstring
= b
->value
.leaf
->data
;
3880 for (i
= 0; i
< 16; i
++)
3882 unsigned int alen
= astring
[0] + (astring
[1] << 8);
3883 unsigned int blen
= bstring
[0] + (bstring
[1] << 8);
3887 memcpy (nstring
, astring
, (alen
+ 1) * 2);
3888 nstring
+= (alen
+ 1) * 2;
3892 memcpy (nstring
, bstring
, (blen
+ 1) * 2);
3893 nstring
+= (blen
+ 1) * 2;
3901 astring
+= (alen
+ 1) * 2;
3902 bstring
+= (blen
+ 1) * 2;
3905 BFD_ASSERT (nstring
- new_data
== (signed) (a
->value
.leaf
->size
+ copy_needed
));
3907 free (a
->value
.leaf
->data
);
3908 a
->value
.leaf
->data
= new_data
;
3909 a
->value
.leaf
->size
+= copy_needed
;
3914 static void rsrc_merge (rsrc_entry
*, rsrc_entry
*);
3916 /* Sort the entries in given part of the directory.
3917 We use an old fashioned bubble sort because we are dealing
3918 with lists and we want to handle matches specially. */
3921 rsrc_sort_entries (rsrc_dir_chain
*chain
,
3923 rsrc_directory
*dir
)
3927 rsrc_entry
** points_to_entry
;
3930 if (chain
->num_entries
< 2)
3936 points_to_entry
= & chain
->first_entry
;
3937 entry
= * points_to_entry
;
3938 next
= entry
->next_entry
;
3942 signed int cmp
= rsrc_cmp (is_name
, entry
, next
);
3946 entry
->next_entry
= next
->next_entry
;
3947 next
->next_entry
= entry
;
3948 * points_to_entry
= next
;
3949 points_to_entry
= & next
->next_entry
;
3950 next
= entry
->next_entry
;
3955 if (entry
->is_dir
&& next
->is_dir
)
3957 /* When we encounter identical directory entries we have to
3958 merge them together. The exception to this rule is for
3959 resource manifests - there can only be one of these,
3960 even if they differ in language. Zero-language manifests
3961 are assumed to be default manifests (provided by the
3962 Cygwin/MinGW build system) and these can be silently dropped,
3963 unless that would reduce the number of manifests to zero.
3964 There should only ever be one non-zero lang manifest -
3965 if there are more it is an error. A non-zero lang
3966 manifest takes precedence over a default manifest. */
3968 && entry
->name_id
.id
== 1
3970 && dir
->entry
!= NULL
3971 && !dir
->entry
->is_name
3972 && dir
->entry
->name_id
.id
== 0x18)
3974 if (next
->value
.directory
->names
.num_entries
== 0
3975 && next
->value
.directory
->ids
.num_entries
== 1
3976 && !next
->value
.directory
->ids
.first_entry
->is_name
3977 && next
->value
.directory
->ids
.first_entry
->name_id
.id
== 0)
3978 /* Fall through so that NEXT is dropped. */
3980 else if (entry
->value
.directory
->names
.num_entries
== 0
3981 && entry
->value
.directory
->ids
.num_entries
== 1
3982 && !entry
->value
.directory
->ids
.first_entry
->is_name
3983 && entry
->value
.directory
->ids
.first_entry
->name_id
.id
== 0)
3985 /* Swap ENTRY and NEXT. Then fall through so that the old ENTRY is dropped. */
3986 entry
->next_entry
= next
->next_entry
;
3987 next
->next_entry
= entry
;
3988 * points_to_entry
= next
;
3989 points_to_entry
= & next
->next_entry
;
3990 next
= entry
->next_entry
;
3995 _bfd_error_handler (_(".rsrc merge failure: multiple non-default manifests"));
3996 bfd_set_error (bfd_error_file_truncated
);
4000 /* Unhook NEXT from the chain. */
4001 /* FIXME: memory loss here. */
4002 entry
->next_entry
= next
->next_entry
;
4003 chain
->num_entries
--;
4004 if (chain
->num_entries
< 2)
4006 next
= next
->next_entry
;
4009 rsrc_merge (entry
, next
);
4011 else if (entry
->is_dir
!= next
->is_dir
)
4013 _bfd_error_handler (_(".rsrc merge failure: a directory matches a leaf"));
4014 bfd_set_error (bfd_error_file_truncated
);
4019 /* Otherwise with identical leaves we issue an error
4020 message - because there should never be duplicates.
4021 The exception is Type 18/Name 1/Lang 0 which is the
4022 defaul manifest - this can just be dropped. */
4024 && entry
->name_id
.id
== 0
4026 && dir
->entry
!= NULL
4027 && !dir
->entry
->is_name
4028 && dir
->entry
->name_id
.id
== 1
4029 && dir
->entry
->parent
!= NULL
4030 && dir
->entry
->parent
->entry
!= NULL
4031 && !dir
->entry
->parent
->entry
->is_name
4032 && dir
->entry
->parent
->entry
->name_id
.id
== 0x18 /* RT_MANIFEST */)
4034 else if (dir
!= NULL
4035 && dir
->entry
!= NULL
4036 && dir
->entry
->parent
!= NULL
4037 && dir
->entry
->parent
->entry
!= NULL
4038 && !dir
->entry
->parent
->entry
->is_name
4039 && dir
->entry
->parent
->entry
->name_id
.id
== 0x6 /* RT_STRING */)
4041 /* Strings need special handling. */
4042 if (! rsrc_merge_string_entries (entry
, next
))
4044 /* _bfd_error_handler should have been called inside merge_strings. */
4045 bfd_set_error (bfd_error_file_truncated
);
4052 || dir
->entry
== NULL
4053 || dir
->entry
->parent
== NULL
4054 || dir
->entry
->parent
->entry
== NULL
)
4055 _bfd_error_handler (_(".rsrc merge failure: duplicate leaf"));
4060 _bfd_error_handler (_(".rsrc merge failure: duplicate leaf: %s"),
4061 rsrc_resource_name (entry
, dir
, buff
));
4063 bfd_set_error (bfd_error_file_truncated
);
4068 /* Unhook NEXT from the chain. */
4069 entry
->next_entry
= next
->next_entry
;
4070 chain
->num_entries
--;
4071 if (chain
->num_entries
< 2)
4073 next
= next
->next_entry
;
4077 points_to_entry
= & entry
->next_entry
;
4079 next
= next
->next_entry
;
4084 chain
->last_entry
= entry
;
4089 /* Attach B's chain onto A. */
4091 rsrc_attach_chain (rsrc_dir_chain
* achain
, rsrc_dir_chain
* bchain
)
4093 if (bchain
->num_entries
== 0)
4096 achain
->num_entries
+= bchain
->num_entries
;
4098 if (achain
->first_entry
== NULL
)
4100 achain
->first_entry
= bchain
->first_entry
;
4101 achain
->last_entry
= bchain
->last_entry
;
4105 achain
->last_entry
->next_entry
= bchain
->first_entry
;
4106 achain
->last_entry
= bchain
->last_entry
;
4109 bchain
->num_entries
= 0;
4110 bchain
->first_entry
= bchain
->last_entry
= NULL
;
4114 rsrc_merge (struct rsrc_entry
* a
, struct rsrc_entry
* b
)
4116 rsrc_directory
* adir
;
4117 rsrc_directory
* bdir
;
4119 BFD_ASSERT (a
->is_dir
);
4120 BFD_ASSERT (b
->is_dir
);
4122 adir
= a
->value
.directory
;
4123 bdir
= b
->value
.directory
;
4125 if (adir
->characteristics
!= bdir
->characteristics
)
4127 _bfd_error_handler (_(".rsrc merge failure: dirs with differing characteristics"));
4128 bfd_set_error (bfd_error_file_truncated
);
4132 if (adir
->major
!= bdir
->major
|| adir
->minor
!= bdir
->minor
)
4134 _bfd_error_handler (_(".rsrc merge failure: differing directory versions"));
4135 bfd_set_error (bfd_error_file_truncated
);
4139 /* Attach B's name chain to A. */
4140 rsrc_attach_chain (& adir
->names
, & bdir
->names
);
4142 /* Attach B's ID chain to A. */
4143 rsrc_attach_chain (& adir
->ids
, & bdir
->ids
);
4145 /* Now sort A's entries. */
4146 rsrc_sort_entries (& adir
->names
, true, adir
);
4147 rsrc_sort_entries (& adir
->ids
, false, adir
);
4150 /* Check the .rsrc section. If it contains multiple concatenated
4151 resources then we must merge them properly. Otherwise Windows
4152 will ignore all but the first set. */
4155 rsrc_process_section (bfd
* abfd
,
4156 struct coff_final_link_info
* pfinfo
)
4158 rsrc_directory new_table
;
4164 bfd_byte
* datastart
;
4166 bfd_byte
* new_data
;
4167 unsigned int num_resource_sets
;
4168 rsrc_directory
* type_tables
;
4169 rsrc_write_data write_data
;
4172 unsigned int num_input_rsrc
= 0;
4173 unsigned int max_num_input_rsrc
= 4;
4174 ptrdiff_t * rsrc_sizes
= NULL
;
4176 new_table
.names
.num_entries
= 0;
4177 new_table
.ids
.num_entries
= 0;
4179 sec
= bfd_get_section_by_name (abfd
, ".rsrc");
4180 if (sec
== NULL
|| (size
= sec
->rawsize
) == 0)
4183 pe
= pe_data (abfd
);
4187 rva_bias
= sec
->vma
- pe
->pe_opthdr
.ImageBase
;
4189 data
= bfd_malloc (size
);
4195 if (! bfd_get_section_contents (abfd
, sec
, data
, 0, size
))
4198 /* Step zero: Scan the input bfds looking for .rsrc sections and record
4199 their lengths. Note - we rely upon the fact that the linker script
4200 does *not* sort the input .rsrc sections, so that the order in the
4201 linkinfo list matches the order in the output .rsrc section.
4203 We need to know the lengths because each input .rsrc section has padding
4204 at the end of a variable amount. (It does not appear to be based upon
4205 the section alignment or the file alignment). We need to skip any
4206 padding bytes when parsing the input .rsrc sections. */
4207 rsrc_sizes
= bfd_malloc (max_num_input_rsrc
* sizeof * rsrc_sizes
);
4208 if (rsrc_sizes
== NULL
)
4211 for (input
= pfinfo
->info
->input_bfds
;
4213 input
= input
->link
.next
)
4215 asection
* rsrc_sec
= bfd_get_section_by_name (input
, ".rsrc");
4217 /* PR 18372 - skip discarded .rsrc sections. */
4218 if (rsrc_sec
!= NULL
&& !discarded_section (rsrc_sec
))
4220 if (num_input_rsrc
== max_num_input_rsrc
)
4222 max_num_input_rsrc
+= 10;
4223 rsrc_sizes
= bfd_realloc (rsrc_sizes
, max_num_input_rsrc
4224 * sizeof * rsrc_sizes
);
4225 if (rsrc_sizes
== NULL
)
4229 BFD_ASSERT (rsrc_sec
->size
> 0);
4230 rsrc_sizes
[num_input_rsrc
++] = rsrc_sec
->size
;
4234 if (num_input_rsrc
< 2)
4237 /* Step one: Walk the section, computing the size of the tables,
4238 leaves and data and decide if we need to do anything. */
4239 dataend
= data
+ size
;
4240 num_resource_sets
= 0;
4242 while (data
< dataend
)
4244 bfd_byte
* p
= data
;
4246 data
= rsrc_count_directory (abfd
, data
, data
, dataend
, rva_bias
);
4250 /* Corrupted .rsrc section - cannot merge. */
4251 _bfd_error_handler (_("%pB: .rsrc merge failure: corrupt .rsrc section"),
4253 bfd_set_error (bfd_error_file_truncated
);
4257 if ((data
- p
) > rsrc_sizes
[num_resource_sets
])
4259 _bfd_error_handler (_("%pB: .rsrc merge failure: unexpected .rsrc size"),
4261 bfd_set_error (bfd_error_file_truncated
);
4264 /* FIXME: Should we add a check for "data - p" being much smaller
4265 than rsrc_sizes[num_resource_sets] ? */
4267 data
= p
+ rsrc_sizes
[num_resource_sets
];
4268 rva_bias
+= data
- p
;
4269 ++ num_resource_sets
;
4271 BFD_ASSERT (num_resource_sets
== num_input_rsrc
);
4273 /* Step two: Walk the data again, building trees of the resources. */
4275 rva_bias
= sec
->vma
- pe
->pe_opthdr
.ImageBase
;
4277 type_tables
= bfd_malloc (num_resource_sets
* sizeof * type_tables
);
4278 if (type_tables
== NULL
)
4282 while (data
< dataend
)
4284 bfd_byte
* p
= data
;
4286 (void) rsrc_parse_directory (abfd
, type_tables
+ indx
, data
, data
,
4287 dataend
, rva_bias
, NULL
);
4288 data
= p
+ rsrc_sizes
[indx
];
4289 rva_bias
+= data
- p
;
4292 BFD_ASSERT (indx
== num_resource_sets
);
4294 /* Step three: Merge the top level tables (there can be only one).
4296 We must ensure that the merged entries are in ascending order.
4298 We also thread the top level table entries from the old tree onto
4299 the new table, so that they can be pulled off later. */
4301 /* FIXME: Should we verify that all type tables are the same ? */
4302 new_table
.characteristics
= type_tables
[0].characteristics
;
4303 new_table
.time
= type_tables
[0].time
;
4304 new_table
.major
= type_tables
[0].major
;
4305 new_table
.minor
= type_tables
[0].minor
;
4307 /* Chain the NAME entries onto the table. */
4308 new_table
.names
.first_entry
= NULL
;
4309 new_table
.names
.last_entry
= NULL
;
4311 for (indx
= 0; indx
< num_resource_sets
; indx
++)
4312 rsrc_attach_chain (& new_table
.names
, & type_tables
[indx
].names
);
4314 rsrc_sort_entries (& new_table
.names
, true, & new_table
);
4316 /* Chain the ID entries onto the table. */
4317 new_table
.ids
.first_entry
= NULL
;
4318 new_table
.ids
.last_entry
= NULL
;
4320 for (indx
= 0; indx
< num_resource_sets
; indx
++)
4321 rsrc_attach_chain (& new_table
.ids
, & type_tables
[indx
].ids
);
4323 rsrc_sort_entries (& new_table
.ids
, false, & new_table
);
4325 /* Step four: Create new contents for the .rsrc section. */
4326 /* Step four point one: Compute the size of each region of the .rsrc section.
4327 We do this now, rather than earlier, as the merging above may have dropped
4329 sizeof_leaves
= sizeof_strings
= sizeof_tables_and_entries
= 0;
4330 rsrc_compute_region_sizes (& new_table
);
4331 /* We increment sizeof_strings to make sure that resource data
4332 starts on an 8-byte boundary. FIXME: Is this correct ? */
4333 sizeof_strings
= (sizeof_strings
+ 7) & ~ 7;
4335 new_data
= bfd_zalloc (abfd
, size
);
4336 if (new_data
== NULL
)
4339 write_data
.abfd
= abfd
;
4340 write_data
.datastart
= new_data
;
4341 write_data
.next_table
= new_data
;
4342 write_data
.next_leaf
= new_data
+ sizeof_tables_and_entries
;
4343 write_data
.next_string
= write_data
.next_leaf
+ sizeof_leaves
;
4344 write_data
.next_data
= write_data
.next_string
+ sizeof_strings
;
4345 write_data
.rva_bias
= sec
->vma
- pe
->pe_opthdr
.ImageBase
;
4347 rsrc_write_directory (& write_data
, & new_table
);
4349 /* Step five: Replace the old contents with the new.
4350 We don't recompute the size as it's too late here to shrink section.
4351 See PR ld/20193 for more details. */
4352 bfd_set_section_contents (pfinfo
->output_bfd
, sec
, new_data
, 0, size
);
4353 sec
->size
= sec
->rawsize
= size
;
4356 /* Step six: Free all the memory that we have used. */
4357 /* FIXME: Free the resource tree, if we have one. */
4362 /* Handle the .idata section and other things that need symbol table
4366 _bfd_XXi_final_link_postscript (bfd
* abfd
, struct coff_final_link_info
*pfinfo
)
4368 struct coff_link_hash_entry
*h1
;
4369 struct bfd_link_info
*info
= pfinfo
->info
;
4372 /* There are a few fields that need to be filled in now while we
4373 have symbol table access.
4375 The .idata subsections aren't directly available as sections, but
4376 they are in the symbol table, so get them from there. */
4378 /* The import directory. This is the address of .idata$2, with size
4379 of .idata$2 + .idata$3. */
4380 h1
= coff_link_hash_lookup (coff_hash_table (info
),
4381 ".idata$2", false, false, true);
4384 /* PR ld/2729: We cannot rely upon all the output sections having been
4385 created properly, so check before referencing them. Issue a warning
4386 message for any sections tht could not be found. */
4387 if ((h1
->root
.type
== bfd_link_hash_defined
4388 || h1
->root
.type
== bfd_link_hash_defweak
)
4389 && h1
->root
.u
.def
.section
!= NULL
4390 && h1
->root
.u
.def
.section
->output_section
!= NULL
)
4391 pe_data (abfd
)->pe_opthdr
.DataDirectory
[PE_IMPORT_TABLE
].VirtualAddress
=
4392 (h1
->root
.u
.def
.value
4393 + h1
->root
.u
.def
.section
->output_section
->vma
4394 + h1
->root
.u
.def
.section
->output_offset
);
4398 (_("%pB: unable to fill in DataDictionary[1] because .idata$2 is missing"),
4403 h1
= coff_link_hash_lookup (coff_hash_table (info
),
4404 ".idata$4", false, false, true);
4406 && (h1
->root
.type
== bfd_link_hash_defined
4407 || h1
->root
.type
== bfd_link_hash_defweak
)
4408 && h1
->root
.u
.def
.section
!= NULL
4409 && h1
->root
.u
.def
.section
->output_section
!= NULL
)
4410 pe_data (abfd
)->pe_opthdr
.DataDirectory
[PE_IMPORT_TABLE
].Size
=
4411 ((h1
->root
.u
.def
.value
4412 + h1
->root
.u
.def
.section
->output_section
->vma
4413 + h1
->root
.u
.def
.section
->output_offset
)
4414 - pe_data (abfd
)->pe_opthdr
.DataDirectory
[PE_IMPORT_TABLE
].VirtualAddress
);
4418 (_("%pB: unable to fill in DataDictionary[1] because .idata$4 is missing"),
4423 /* The import address table. This is the size/address of
4425 h1
= coff_link_hash_lookup (coff_hash_table (info
),
4426 ".idata$5", false, false, true);
4428 && (h1
->root
.type
== bfd_link_hash_defined
4429 || h1
->root
.type
== bfd_link_hash_defweak
)
4430 && h1
->root
.u
.def
.section
!= NULL
4431 && h1
->root
.u
.def
.section
->output_section
!= NULL
)
4432 pe_data (abfd
)->pe_opthdr
.DataDirectory
[PE_IMPORT_ADDRESS_TABLE
].VirtualAddress
=
4433 (h1
->root
.u
.def
.value
4434 + h1
->root
.u
.def
.section
->output_section
->vma
4435 + h1
->root
.u
.def
.section
->output_offset
);
4439 (_("%pB: unable to fill in DataDictionary[12] because .idata$5 is missing"),
4444 h1
= coff_link_hash_lookup (coff_hash_table (info
),
4445 ".idata$6", false, false, true);
4447 && (h1
->root
.type
== bfd_link_hash_defined
4448 || h1
->root
.type
== bfd_link_hash_defweak
)
4449 && h1
->root
.u
.def
.section
!= NULL
4450 && h1
->root
.u
.def
.section
->output_section
!= NULL
)
4451 pe_data (abfd
)->pe_opthdr
.DataDirectory
[PE_IMPORT_ADDRESS_TABLE
].Size
=
4452 ((h1
->root
.u
.def
.value
4453 + h1
->root
.u
.def
.section
->output_section
->vma
4454 + h1
->root
.u
.def
.section
->output_offset
)
4455 - pe_data (abfd
)->pe_opthdr
.DataDirectory
[PE_IMPORT_ADDRESS_TABLE
].VirtualAddress
);
4459 (_("%pB: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE (12)] because .idata$6 is missing"),
4466 h1
= coff_link_hash_lookup (coff_hash_table (info
),
4467 "__IAT_start__", false, false, true);
4469 && (h1
->root
.type
== bfd_link_hash_defined
4470 || h1
->root
.type
== bfd_link_hash_defweak
)
4471 && h1
->root
.u
.def
.section
!= NULL
4472 && h1
->root
.u
.def
.section
->output_section
!= NULL
)
4477 (h1
->root
.u
.def
.value
4478 + h1
->root
.u
.def
.section
->output_section
->vma
4479 + h1
->root
.u
.def
.section
->output_offset
);
4481 h1
= coff_link_hash_lookup (coff_hash_table (info
),
4482 "__IAT_end__", false, false, true);
4484 && (h1
->root
.type
== bfd_link_hash_defined
4485 || h1
->root
.type
== bfd_link_hash_defweak
)
4486 && h1
->root
.u
.def
.section
!= NULL
4487 && h1
->root
.u
.def
.section
->output_section
!= NULL
)
4489 pe_data (abfd
)->pe_opthdr
.DataDirectory
[PE_IMPORT_ADDRESS_TABLE
].Size
=
4490 ((h1
->root
.u
.def
.value
4491 + h1
->root
.u
.def
.section
->output_section
->vma
4492 + h1
->root
.u
.def
.section
->output_offset
)
4494 if (pe_data (abfd
)->pe_opthdr
.DataDirectory
[PE_IMPORT_ADDRESS_TABLE
].Size
!= 0)
4495 pe_data (abfd
)->pe_opthdr
.DataDirectory
[PE_IMPORT_ADDRESS_TABLE
].VirtualAddress
=
4496 iat_va
- pe_data (abfd
)->pe_opthdr
.ImageBase
;
4501 (_("%pB: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE(12)]"
4502 " because .idata$6 is missing"), abfd
);
4508 h1
= coff_link_hash_lookup (coff_hash_table (info
),
4509 (bfd_get_symbol_leading_char (abfd
) != 0
4510 ? "__tls_used" : "_tls_used"),
4511 false, false, true);
4514 if ((h1
->root
.type
== bfd_link_hash_defined
4515 || h1
->root
.type
== bfd_link_hash_defweak
)
4516 && h1
->root
.u
.def
.section
!= NULL
4517 && h1
->root
.u
.def
.section
->output_section
!= NULL
)
4518 pe_data (abfd
)->pe_opthdr
.DataDirectory
[PE_TLS_TABLE
].VirtualAddress
=
4519 (h1
->root
.u
.def
.value
4520 + h1
->root
.u
.def
.section
->output_section
->vma
4521 + h1
->root
.u
.def
.section
->output_offset
4522 - pe_data (abfd
)->pe_opthdr
.ImageBase
);
4526 (_("%pB: unable to fill in DataDictionary[9] because __tls_used is missing"),
4530 /* According to PECOFF sepcifications by Microsoft version 8.2
4531 the TLS data directory consists of 4 pointers, followed
4532 by two 4-byte integer. This implies that the total size
4533 is different for 32-bit and 64-bit executables. */
4534 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64)
4535 pe_data (abfd
)->pe_opthdr
.DataDirectory
[PE_TLS_TABLE
].Size
= 0x18;
4537 pe_data (abfd
)->pe_opthdr
.DataDirectory
[PE_TLS_TABLE
].Size
= 0x28;
4541 /* If there is a .pdata section and we have linked pdata finally, we
4542 need to sort the entries ascending. */
4543 #if !defined(COFF_WITH_pep) && (defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64))
4545 asection
*sec
= bfd_get_section_by_name (abfd
, ".pdata");
4549 bfd_size_type x
= sec
->rawsize
;
4550 bfd_byte
*tmp_data
= NULL
;
4553 tmp_data
= bfd_malloc (x
);
4555 if (tmp_data
!= NULL
)
4557 if (bfd_get_section_contents (abfd
, sec
, tmp_data
, 0, x
))
4561 12, sort_x64_pdata
);
4562 bfd_set_section_contents (pfinfo
->output_bfd
, sec
,
4573 rsrc_process_section (abfd
, pfinfo
);
4575 /* If we couldn't find idata$2, we either have an excessively
4576 trivial program or are in DEEP trouble; we have to assume trivial