Automatic date update in version.in
[binutils-gdb.git] / bfd / peXXigen.c
blob5ab09387e72a357a6aee7fa5a4ef335c931a9d0c
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.
34 Another reference:
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
51 document it here!)
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
65 PE or PE+. */
66 #define COFF_WITH_XX
68 #include "sysdep.h"
69 #include "bfd.h"
70 #include "libbfd.h"
71 #include "coff/internal.h"
72 #include "bfdver.h"
73 #include "libiberty.h"
74 #include <wchar.h>
75 #include <wctype.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"
89 #else
90 # include "coff/i386.h"
91 #endif
93 #include "coff/pe.h"
94 #include "libcoff.h"
95 #include "libpei.h"
96 #include "safe-ctype.h"
98 #if defined COFF_WITH_pep || defined COFF_WITH_pex64 || defined COFF_WITH_peAArch64
99 # undef AOUTSZ
100 # define AOUTSZ PEPAOUTSZ
101 # define PEAOUTHDR PEPAOUTHDR
102 #endif
104 #define HighBitSet(val) ((val) & 0x80000000)
105 #define SetHighBit(val) ((val) | 0x80000000)
106 #define WithoutHighBit(val) ((val) & 0x7fffffff)
108 void
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);
119 else
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);
127 else
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;
147 in->n_value = 0x0;
149 /* Create synthetic empty sections as needed. DJ */
150 if (in->n_scnum == 0)
152 asection *sec;
154 name = _bfd_coff_internal_syment_name (abfd, in, namebuf);
155 if (name == NULL)
157 _bfd_error_handler (_("%pB: unable to find name for empty section"),
158 abfd);
159 bfd_set_error (bfd_error_invalid_target);
160 return;
163 sec = bfd_get_section_by_name (abfd, name);
164 if (sec != NULL)
165 in->n_scnum = sec->target_index;
168 if (in->n_scnum == 0)
170 int unused_section_number = 0;
171 asection *sec;
172 flagword flags;
173 size_t name_len;
174 char *sec_name;
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);
186 return;
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);
192 if (sec == NULL)
194 _bfd_error_handler (_("%pB: unable to create fake empty section"),
195 abfd);
196 return;
199 sec->vma = 0;
200 sec->lma = 0;
201 sec->size = 0;
202 sec->filepos = 0;
203 sec->rel_filepos = 0;
204 sec->reloc_count = 0;
205 sec->line_filepos = 0;
206 sec->lineno_count = 0;
207 sec->userdata = NULL;
208 sec->next = 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;
217 #endif
220 static bool
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);
228 unsigned int
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);
239 else
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)
257 asection * sec;
259 sec = bfd_sections_find_if (abfd, abs_finder, & in->n_value);
260 if (sec)
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);
275 else
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);
281 return SYMESZ;
284 void
285 _bfd_XXi_swap_aux_in (bfd * abfd,
286 void * ext1,
287 int type,
288 int in_class,
289 int indx ATTRIBUTE_UNUSED,
290 int numaux ATTRIBUTE_UNUSED,
291 void * in1)
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
297 are initialised. */
298 memset (in, 0, sizeof * in);
299 switch (in_class)
301 case C_FILE:
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);
307 else
308 memcpy (in->x_file.x_n.x_fname, ext->x_file.x_fname, FILNMLEN);
309 return;
311 case C_STAT:
312 case C_LEAFSTAT:
313 case C_HIDDEN:
314 if (type == T_NULL)
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);
322 return;
324 break;
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)
331 || ISTAG (in_class))
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);
336 else
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]);
348 if (ISFCN (type))
350 in->x_sym.x_misc.x_fsize = H_GET_32 (abfd, ext->x_sym.x_misc.x_fsize);
352 else
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);
359 unsigned int
360 _bfd_XXi_swap_aux_out (bfd * abfd,
361 void * inp,
362 int type,
363 int in_class,
364 int indx ATTRIBUTE_UNUSED,
365 int numaux ATTRIBUTE_UNUSED,
366 void * extp)
368 union internal_auxent *in = (union internal_auxent *) inp;
369 AUXENT *ext = (AUXENT *) extp;
371 memset (ext, 0, AUXESZ);
373 switch (in_class)
375 case C_FILE:
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);
381 else
382 memcpy (ext->x_file.x_fname, in->x_file.x_n.x_fname, sizeof (ext->x_file.x_fname));
384 return AUXESZ;
386 case C_STAT:
387 case C_LEAFSTAT:
388 case C_HIDDEN:
389 if (type == T_NULL)
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);
397 return AUXESZ;
399 break;
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)
406 || ISTAG (in_class))
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);
411 else
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]);
423 if (ISFCN (type))
424 H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_sym.x_misc.x_fsize);
425 else
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);
431 return AUXESZ;
434 void
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);
444 unsigned int
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);
452 return LINESZ;
455 void
456 _bfd_XXi_swap_aouthdr_in (bfd * abfd,
457 void * aouthdr_ext1,
458 void * aouthdr_int1)
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;
480 #endif
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);
519 unsigned idx;
521 /* PR 17512: Corrupt PE binaries can cause seg-faults. */
522 if (a->NumberOfRvaAndSizes > IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
524 /* xgettext:c-format */
525 _bfd_error_handler
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. */
538 int size =
539 H_GET_32 (abfd, src->DataDirectory[idx][1]);
541 a->DataDirectory[idx].Size = size;
543 if (size)
544 a->DataDirectory[idx].VirtualAddress =
545 H_GET_32 (abfd, src->DataDirectory[idx][0]);
546 else
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;
554 idx ++;
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;
563 #endif
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;
571 #endif
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;
581 #endif
584 /* A support function for below. */
586 static void
587 add_data_entry (bfd * abfd,
588 struct internal_extra_pe_aouthdr *aout,
589 int idx,
590 char *name,
591 bfd_vma base)
593 asection *sec = bfd_get_section_by_name (abfd, name);
595 /* Add import directory information if it exists. */
596 if ((sec != NULL)
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;
604 if (size)
606 aout->DataDirectory[idx].VirtualAddress =
607 (sec->vma - base) & 0xffffffff;
608 sec->flags |= SEC_DATA;
613 unsigned int
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;
620 bfd_vma sa, fa, ib;
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;
636 #endif
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;
644 #endif
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;
652 #endif
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
689 thing for .pdata. */
690 if (pe->has_reloc_section)
691 add_data_entry (abfd, extra, PE_BASE_RELOCATION_TABLE, ".reloc", ib);
694 asection *sec;
695 bfd_vma hsize = 0;
696 bfd_vma dsize = 0;
697 bfd_vma isize = 0;
698 bfd_vma tsize = 0;
700 for (sec = abfd->sections; sec; sec = sec->next)
702 int rounded = FA (sec->size);
704 if (rounded == 0)
705 continue;
707 /* The first non-zero section filepos is the header size.
708 Sections without contents will have a filepos of 0. */
709 if (hsize == 0)
710 hsize = sec->filepos;
711 if (sec->flags & SEC_DATA)
712 dsize += rounded;
713 if (sec->flags & SEC_CODE)
714 tsize += rounded;
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);
746 else
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
752 LINKER_VERSION. */
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);
768 #endif
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);
801 int idx;
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]);
812 return AOUTSZ;
815 unsigned int
816 _bfd_XXi_only_swap_filehdr_out (bfd * abfd, void * in, void * out)
818 int idx;
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);
869 else
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
880 for NT. */
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);
914 return FILHSZ;
917 unsigned int
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);
931 return FILHSZ;
934 unsigned int
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;
940 bfd_vma ps;
941 bfd_vma ss;
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,
955 sometimes). */
956 if ((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0)
958 if (bfd_pei_p (abfd))
960 ps = scnhdr_int->s_size;
961 ss = 0;
963 else
965 ps = 0;
966 ss = scnhdr_int->s_size;
969 else
971 if (bfd_pei_p (abfd))
972 ps = scnhdr_int->s_paddr;
973 else
974 ps = 0;
976 ss = scnhdr_int->s_size;
979 PUT_SCNHDR_SIZE (abfd, ss,
980 scnhdr_ext->s_size);
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
1001 writable. */
1003 /* FIXME: Alignment is also encoded in this field, at least on
1004 ARM-WINCE. Although - how do we get the original alignment field
1005 back ? */
1007 typedef struct
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);
1042 p++)
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;
1049 break;
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);
1071 else
1073 if (scnhdr_int->s_nlnno <= 0xffff)
1074 H_PUT_16 (abfd, scnhdr_int->s_nlnno, scnhdr_ext->s_nlnno);
1075 else
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);
1082 ret = 0;
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
1088 set. */
1089 if (scnhdr_int->s_nreloc < 0xffff)
1090 H_PUT_16 (abfd, scnhdr_int->s_nreloc, scnhdr_ext->s_nreloc);
1091 else
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);
1099 return ret;
1102 void
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);
1118 unsigned int
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);
1136 CODEVIEW_INFO *
1137 _bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length, CODEVIEW_INFO *cvinfo)
1139 char buffer[256+1];
1140 bfd_size_type nread;
1142 if (bfd_seek (abfd, where, SEEK_SET) != 0)
1143 return NULL;
1145 if (length <= sizeof (CV_INFO_PDB70) && length <= sizeof (CV_INFO_PDB20))
1146 return NULL;
1147 if (length > 256)
1148 length = 256;
1149 nread = bfd_bread (buffer, length, abfd);
1150 if (length != nread)
1151 return NULL;
1153 /* Ensure null termination of filename. */
1154 memset (buffer + nread, 0, sizeof (buffer) - nread);
1156 cvinfo->CVSignature = H_GET_32 (abfd, buffer);
1157 cvinfo->Age = 0;
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; */
1177 return cvinfo;
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; */
1188 return cvinfo;
1191 return NULL;
1194 unsigned int
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;
1200 char * buffer;
1202 if (bfd_seek (abfd, where, SEEK_SET) != 0)
1203 return 0;
1205 buffer = bfd_malloc (size);
1206 if (buffer == NULL)
1207 return 0;
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);
1224 free (buffer);
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"),
1246 N_("Reserved")
1249 static bool
1250 pe_print_idata (bfd * abfd, void * vfile)
1252 FILE *file = (FILE *) vfile;
1253 bfd_byte *data;
1254 asection *section;
1255 bfd_signed_vma adj;
1256 bfd_size_type datasize = 0;
1257 bfd_size_type dataoff;
1258 bfd_size_type i;
1259 int onaline = 20;
1261 pe_data_type *pe = pe_data (abfd);
1262 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1264 bfd_vma addr;
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)
1273 return true;
1275 addr = section->vma;
1276 datasize = section->size;
1277 if (datasize == 0)
1278 return true;
1280 else
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)
1287 break;
1290 if (section == NULL)
1292 fprintf (file,
1293 _("\nThere is an import table, but the section containing it could not be found\n"));
1294 return true;
1296 else if (!(section->flags & SEC_HAS_CONTENTS))
1298 fprintf (file,
1299 _("\nThere is an import table in %s, but that section has no contents\n"),
1300 section->name);
1301 return true;
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;
1311 fprintf (file,
1312 _("\nThe Import Tables (interpreted %s section contents)\n"),
1313 section->name);
1314 fprintf (file,
1315 _("\
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))
1322 free (data);
1323 return false;
1326 adj = section->vma - extra->ImageBase;
1328 /* Print all image import descriptors. */
1329 for (i = dataoff; i + onaline <= datasize; i += onaline)
1331 bfd_vma hint_addr;
1332 bfd_vma time_stamp;
1333 bfd_vma forward_chain;
1334 bfd_vma dll_name;
1335 bfd_vma first_thunk;
1336 int idx = 0;
1337 bfd_size_type j;
1338 char *dll;
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)
1356 break;
1358 if (dll_name - adj >= section->size)
1359 break;
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. */
1368 if (hint_addr == 0)
1369 hint_addr = first_thunk;
1371 if (hint_addr != 0 && hint_addr - adj < datasize)
1373 bfd_byte *ft_data;
1374 asection *ft_section;
1375 bfd_vma ft_addr;
1376 bfd_size_type ft_datasize;
1377 int ft_idx;
1378 int ft_allocated;
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;
1388 ft_allocated = 0;
1390 if (first_thunk != hint_addr)
1392 /* Find the section which contains the first thunk. */
1393 for (ft_section = abfd->sections;
1394 ft_section != NULL;
1395 ft_section = ft_section->next)
1397 if (ft_addr >= ft_section->vma
1398 && ft_addr < ft_section->vma + ft_section->size)
1399 break;
1402 if (ft_section == NULL)
1404 fprintf (file,
1405 _("\nThere is a first thunk, but the section containing it could not be found\n"));
1406 continue;
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)
1417 continue;
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))
1423 free (ft_data);
1424 continue;
1426 ft_allocated = 1;
1430 /* Print HintName vector entries. */
1431 #ifdef COFF_WITH_pex64
1432 for (j = 0; idx + j + 8 <= datasize; j += 8)
1434 bfd_size_type amt;
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)
1439 break;
1441 amt = member - adj;
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);
1450 else
1452 int ordinal;
1453 char *member_name;
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. */
1463 if (time_stamp != 0
1464 && first_thunk != 0
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");
1471 #else
1472 for (j = 0; idx + j + 4 <= datasize; j += 4)
1474 bfd_size_type amt;
1475 unsigned long member = bfd_get_32 (abfd, data + idx + j);
1477 /* Print single IMAGE_IMPORT_BY_NAME vector. */
1478 if (member == 0)
1479 break;
1481 amt = member - adj;
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);
1489 else
1491 int ordinal;
1492 char *member_name;
1494 ordinal = bfd_get_16 (abfd, data + amt);
1495 member_name = (char *) data + amt + 2;
1496 fprintf (file, "\t%04lx\t %4d %.*s",
1497 member, ordinal,
1498 (int) (datasize - (amt + 2)), member_name);
1501 /* If the time stamp is not zero, the import address
1502 table holds actual addresses. */
1503 if (time_stamp != 0
1504 && first_thunk != 0
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");
1512 #endif
1513 if (ft_allocated)
1514 free (ft_data);
1517 fprintf (file, "\n");
1520 free (data);
1522 return true;
1525 static bool
1526 pe_print_edata (bfd * abfd, void * vfile)
1528 FILE *file = (FILE *) vfile;
1529 bfd_byte *data;
1530 asection *section;
1531 bfd_size_type datasize = 0;
1532 bfd_size_type dataoff;
1533 bfd_size_type i;
1534 bfd_vma adj;
1535 struct EDT_type
1537 long export_flags; /* Reserved - should be zero. */
1538 long time_stamp;
1539 short major_ver;
1540 short minor_ver;
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. */
1548 } edt;
1550 pe_data_type *pe = pe_data (abfd);
1551 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1553 bfd_vma addr;
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)
1562 return true;
1564 addr = section->vma;
1565 dataoff = 0;
1566 datasize = section->size;
1567 if (datasize == 0)
1568 return true;
1570 else
1572 addr += extra->ImageBase;
1574 for (section = abfd->sections; section != NULL; section = section->next)
1575 if (addr >= section->vma && addr < section->vma + section->size)
1576 break;
1578 if (section == NULL)
1580 fprintf (file,
1581 _("\nThere is an export table, but the section containing it could not be found\n"));
1582 return true;
1584 else if (!(section->flags & SEC_HAS_CONTENTS))
1586 fprintf (file,
1587 _("\nThere is an export table in %s, but that section has no contents\n"),
1588 section->name);
1589 return true;
1592 dataoff = addr - section->vma;
1593 datasize = extra->DataDirectory[PE_EXPORT_TABLE].Size;
1594 if (dataoff > section->size
1595 || datasize > section->size - dataoff)
1597 fprintf (file,
1598 _("\nThere is an export table in %s, but it does not fit into that section\n"),
1599 section->name);
1600 return true;
1604 /* PR 17512: Handle corrupt PE binaries. */
1605 if (datasize < 40)
1607 fprintf (file,
1608 /* xgettext:c-format */
1609 _("\nThere is an export table in %s, but it is too small (%d)\n"),
1610 section->name, (int) datasize);
1611 return true;
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);
1619 if (data == NULL)
1620 return false;
1622 if (! bfd_get_section_contents (abfd, section, data,
1623 (file_ptr) dataoff, datasize))
1624 return false;
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. */
1642 fprintf (file,
1643 _("\nThe Export Tables (interpreted %s section contents)\n\n"),
1644 section->name);
1646 fprintf (file,
1647 _("Export Flags \t\t\t%lx\n"), (unsigned long) edt.export_flags);
1649 fprintf (file,
1650 _("Time/Date stamp \t\t%lx\n"), (unsigned long) edt.time_stamp);
1652 fprintf (file,
1653 /* xgettext:c-format */
1654 _("Major/Minor \t\t\t%d/%d\n"), edt.major_ver, edt.minor_ver);
1656 fprintf (file,
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);
1664 else
1665 fprintf (file, "(outside .edata section)\n");
1667 fprintf (file,
1668 _("Ordinal Base \t\t\t%ld\n"), edt.base);
1670 fprintf (file,
1671 _("Number in:\n"));
1673 fprintf (file,
1674 _("\tExport Address Table \t\t%08lx\n"),
1675 edt.num_functions);
1677 fprintf (file,
1678 _("\t[Name Pointer/Ordinal] Table\t%08lx\n"), edt.num_names);
1680 fprintf (file,
1681 _("Table Addresses\n"));
1683 fprintf (file,
1684 _("\tExport Address Table \t\t"));
1685 bfd_fprintf_vma (abfd, file, edt.eat_addr);
1686 fprintf (file, "\n");
1688 fprintf (file,
1689 _("\tName Pointer Table \t\t"));
1690 bfd_fprintf_vma (abfd, file, edt.npt_addr);
1691 fprintf (file, "\n");
1693 fprintf (file,
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:
1701 typedef union
1703 long export_rva;
1704 long forwarder_rva;
1705 } export_address_table_entry; */
1707 fprintf (file,
1708 _("\nExport Address Table -- Ordinal Base %ld\n"),
1709 edt.base);
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)
1725 continue;
1727 if (eat_member - adj <= datasize)
1729 /* This rva is to a name (forwarding function) in our section. */
1730 /* Should locate a function descriptor. */
1731 fprintf (file,
1732 "\t[%4ld] +base[%4ld] %04lx %s -- %.*s\n",
1733 (long) i,
1734 (long) (i + edt.base),
1735 (unsigned long) eat_member,
1736 _("Forwarder RVA"),
1737 (int)(datasize - (eat_member - adj)),
1738 data + eat_member - adj);
1740 else
1742 /* Should locate a function descriptor in the reldata section. */
1743 fprintf (file,
1744 "\t[%4ld] +base[%4ld] %04lx %s\n",
1745 (long) i,
1746 (long) (i + edt.base),
1747 (unsigned long) eat_member,
1748 _("Export RVA"));
1752 /* The Export Name Pointer Table is paired with the Export Ordinal Table. */
1753 /* Dump them in parallel for clarity. */
1754 fprintf (file,
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"),
1771 (long) edt.ot_addr,
1772 (long) edt.num_names);
1773 else for (i = 0; i < edt.num_names; ++i)
1775 bfd_vma name_ptr;
1776 bfd_vma ord;
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);
1787 else
1789 char * name = (char *) data + name_ptr - adj;
1791 fprintf (file, "\t[%4ld] %.*s\n", (long) ord,
1792 (int)((char *)(data + datasize) - name), name);
1796 free (data);
1798 return true;
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. */
1813 static bool
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)
1818 #else
1819 # define PDATA_ROW_SIZE (5 * 4)
1820 #endif
1821 FILE *file = (FILE *) vfile;
1822 bfd_byte *data = 0;
1823 asection *section = bfd_get_section_by_name (abfd, ".pdata");
1824 bfd_size_type datasize = 0;
1825 bfd_size_type i;
1826 bfd_size_type start, stop;
1827 int onaline = PDATA_ROW_SIZE;
1829 if (section == NULL
1830 || coff_section_data (abfd, section) == NULL
1831 || pei_section_data (abfd, section) == NULL)
1832 return true;
1834 stop = pei_section_data (abfd, section)->virt_size;
1835 if ((stop % onaline) != 0)
1836 fprintf (file,
1837 /* xgettext:c-format */
1838 _("warning, .pdata section size (%ld) is not a multiple of %d\n"),
1839 (long) stop, onaline);
1841 fprintf (file,
1842 _("\nThe Function Table (interpreted .pdata section contents)\n"));
1843 #if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64)
1844 fprintf (file,
1845 _(" vma:\t\t\tBegin Address End Address Unwind Info\n"));
1846 #else
1847 fprintf (file, _("\
1848 vma:\t\tBegin End EH EH PrologEnd Exception\n\
1849 \t\tAddress Address Handler Data Address Mask\n"));
1850 #endif
1852 datasize = section->size;
1853 if (datasize == 0)
1854 return true;
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);
1862 return false;
1865 if (! bfd_malloc_and_get_section (abfd, section, &data))
1867 free (data);
1868 return false;
1871 start = 0;
1873 for (i = start; i < stop; i += onaline)
1875 bfd_vma begin_addr;
1876 bfd_vma end_addr;
1877 bfd_vma eh_handler;
1878 bfd_vma eh_data;
1879 bfd_vma prolog_end_addr;
1880 #if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64)
1881 int em_data;
1882 #endif
1884 if (i + PDATA_ROW_SIZE > stop)
1885 break;
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. */
1896 break;
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);
1900 #endif
1901 eh_handler &= ~(bfd_vma) 0x3;
1902 prolog_end_addr &= ~(bfd_vma) 0x3;
1904 fputc (' ', file);
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)
1910 fputc (' ', file);
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);
1914 #endif
1915 fprintf (file, "\n");
1918 free (data);
1920 return true;
1921 #undef PDATA_ROW_SIZE
1924 typedef struct sym_cache
1926 int symcount;
1927 asymbol ** syms;
1928 } sym_cache;
1930 static asymbol **
1931 slurp_symtab (bfd *abfd, sym_cache *psc)
1933 asymbol ** sy = NULL;
1934 long storage;
1936 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
1938 psc->symcount = 0;
1939 return NULL;
1942 storage = bfd_get_symtab_upper_bound (abfd);
1943 if (storage < 0)
1944 return NULL;
1945 if (storage)
1947 sy = (asymbol **) bfd_malloc (storage);
1948 if (sy == NULL)
1949 return NULL;
1952 psc->symcount = bfd_canonicalize_symtab (abfd, sy);
1953 if (psc->symcount < 0)
1954 return NULL;
1955 return sy;
1958 static const char *
1959 my_symbol_for_address (bfd *abfd, bfd_vma func, sym_cache *psc)
1961 int i;
1963 if (psc->syms == 0)
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;
1972 return NULL;
1975 static void
1976 cleanup_syms (sym_cache *psc)
1978 psc->symcount = 0;
1979 free (psc->syms);
1980 psc->syms = NULL;
1983 /* This is the version for "compressed" pdata. */
1985 bool
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;
1993 bfd_size_type i;
1994 bfd_size_type start, stop;
1995 int onaline = PDATA_ROW_SIZE;
1996 struct sym_cache cache = {0, 0} ;
1998 if (section == NULL
1999 || coff_section_data (abfd, section) == NULL
2000 || pei_section_data (abfd, section) == NULL)
2001 return true;
2003 stop = pei_section_data (abfd, section)->virt_size;
2004 if ((stop % onaline) != 0)
2005 fprintf (file,
2006 /* xgettext:c-format */
2007 _("warning, .pdata section size (%ld) is not a multiple of %d\n"),
2008 (long) stop, onaline);
2010 fprintf (file,
2011 _("\nThe Function Table (interpreted .pdata section contents)\n"));
2013 fprintf (file, _("\
2014 vma:\t\tBegin Prolog Function Flags Exception EH\n\
2015 \t\tAddress Length Length 32b exc Handler Data\n"));
2017 datasize = section->size;
2018 if (datasize == 0)
2019 return true;
2021 if (! bfd_malloc_and_get_section (abfd, section, &data))
2023 free (data);
2024 return false;
2027 start = 0;
2029 for (i = start; i < stop; i += onaline)
2031 bfd_vma begin_addr;
2032 bfd_vma other_data;
2033 bfd_vma prolog_length, function_length;
2034 int flag32bit, exception_flag;
2035 asection *tsection;
2037 if (i + PDATA_ROW_SIZE > stop)
2038 break;
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. */
2045 break;
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);
2052 fputc (' ', file);
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;
2067 bfd_byte *tdata;
2069 tdata = (bfd_byte *) bfd_malloc (8);
2070 if (tdata)
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);
2080 if (eh != 0)
2082 const char *s = my_symbol_for_address (abfd, eh, &cache);
2084 if (s)
2085 fprintf (file, " (%s) ", s);
2088 free (tdata);
2092 fprintf (file, "\n");
2095 free (data);
2097 cleanup_syms (& cache);
2099 return true;
2100 #undef PDATA_ROW_SIZE
2104 #define IMAGE_REL_BASED_HIGHADJ 4
2105 static const char * const tbl[] =
2107 "ABSOLUTE",
2108 "HIGH",
2109 "LOW",
2110 "HIGHLOW",
2111 "HIGHADJ",
2112 "MIPS_JMPADDR",
2113 "SECTION",
2114 "REL32",
2115 "RESERVED1",
2116 "MIPS_JMPADDR16",
2117 "DIR64",
2118 "HIGH3ADJ",
2119 "UNKNOWN", /* MUST be last. */
2122 static bool
2123 pe_print_reloc (bfd * abfd, void * vfile)
2125 FILE *file = (FILE *) vfile;
2126 bfd_byte *data = 0;
2127 asection *section = bfd_get_section_by_name (abfd, ".reloc");
2128 bfd_byte *p, *end;
2130 if (section == NULL || section->size == 0 || !(section->flags & SEC_HAS_CONTENTS))
2131 return true;
2133 fprintf (file,
2134 _("\n\nPE File Base Relocations (interpreted .reloc section contents)\n"));
2136 if (! bfd_malloc_and_get_section (abfd, section, &data))
2138 free (data);
2139 return false;
2142 p = data;
2143 end = data + section->size;
2144 while (p + 8 <= end)
2146 int j;
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);
2155 p += 8;
2156 number = (size - 8) / 2;
2158 if (size == 0)
2159 break;
2161 fprintf (file,
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)
2168 chunk_end = end;
2169 j = 0;
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;
2179 fprintf (file,
2180 /* xgettext:c-format */
2181 _("\treloc %4d offset %4x [%4lx] %s"),
2182 j, off, (unsigned long) (off + virtual_address), tbl[t]);
2184 p += 2;
2185 j++;
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));
2192 p += 2;
2193 j++;
2196 fprintf (file, "\n");
2200 free (data);
2202 return true;
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;
2214 } rsrc_regions;
2216 static bfd_byte *
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. */
2226 static bfd_byte *
2227 rsrc_print_resource_entries (FILE *file,
2228 bfd *abfd,
2229 unsigned int indent,
2230 bool is_name,
2231 bfd_byte *data,
2232 rsrc_regions *regions,
2233 bfd_vma rva_bias)
2235 unsigned long entry, addr, size;
2236 bfd_byte * leaf;
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);
2245 if (is_name)
2247 bfd_byte * name;
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);
2254 else
2255 name = regions->section_start + entry - rva_bias;
2257 if (name + 2 < regions->section_end && name > regions->section_start)
2259 unsigned int len;
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. */
2271 while (len --)
2273 char c;
2275 name += 2;
2276 c = * name;
2277 /* Avoid printing control characters. */
2278 if (c > 0 && c < 32)
2279 fprintf (file, "^%c", c + 64);
2280 else
2281 fprintf (file, "%.1s", name);
2284 else
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;
2294 else
2296 fprintf (file, _("<corrupt string offset: %#lx>\n"), entry);
2297 return regions->section_end + 1;
2300 else
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,
2315 regions, rva_bias);
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))
2347 static bfd_byte *
2348 rsrc_print_resource_directory (FILE * file,
2349 bfd * abfd,
2350 unsigned int indent,
2351 bfd_byte * data,
2352 rsrc_regions * regions,
2353 bfd_vma rva_bias)
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, " ");
2362 switch (indent)
2364 case 0: fprintf (file, "Type"); break;
2365 case 2: fprintf (file, "Name"); break;
2366 case 4: fprintf (file, "Language"); break;
2367 default:
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));
2383 data += 16;
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);
2391 data += 8;
2392 highest_data = max (highest_data, entry_end);
2393 if (entry_end >= regions->section_end)
2394 return entry_end;
2397 while (num_ids --)
2399 bfd_byte * entry_end;
2401 entry_end = rsrc_print_resource_entries (file, abfd, indent + 1, false,
2402 data, regions, rva_bias);
2403 data += 8;
2404 highest_data = max (highest_data, entry_end);
2405 if (entry_end >= regions->section_end)
2406 return entry_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. */
2416 static bool
2417 rsrc_print_section (bfd * abfd, void * vfile)
2419 bfd_vma rva_bias;
2420 pe_data_type * pe;
2421 FILE * file = (FILE *) vfile;
2422 bfd_size_type datasize;
2423 asection * section;
2424 bfd_byte * data;
2425 rsrc_regions regions;
2427 pe = pe_data (abfd);
2428 if (pe == NULL)
2429 return true;
2431 section = bfd_get_section_by_name (abfd, ".rsrc");
2432 if (section == NULL)
2433 return true;
2434 if (!(section->flags & SEC_HAS_CONTENTS))
2435 return true;
2437 datasize = section->size;
2438 if (datasize == 0)
2439 return true;
2441 rva_bias = section->vma - pe->pe_opthdr.ImageBase;
2443 if (! bfd_malloc_and_get_section (abfd, section, & data))
2445 free (data);
2446 return false;
2449 regions.section_start = data;
2450 regions.section_end = data + datasize;
2451 regions.strings_start = NULL;
2452 regions.resource_start = NULL;
2454 fflush (file);
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"));
2465 else
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
2476 message. */
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)
2485 if (*data != 0)
2486 break;
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);
2501 return true;
2504 #define IMAGE_NUMBEROF_DEBUG_TYPES 17
2506 static char * debug_type_names[IMAGE_NUMBEROF_DEBUG_TYPES] =
2508 "Unknown",
2509 "COFF",
2510 "CodeView",
2511 "FPO",
2512 "Misc",
2513 "Exception",
2514 "Fixup",
2515 "OMAP-to-SRC",
2516 "OMAP-from-SRC",
2517 "Borland",
2518 "Reserved",
2519 "CLSID",
2520 "Feature",
2521 "CoffGrp",
2522 "ILTCG",
2523 "MPX",
2524 "Repro",
2527 static bool
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;
2533 asection *section;
2534 bfd_byte *data = 0;
2535 bfd_size_type dataoff;
2536 unsigned int i, j;
2538 bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
2539 bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
2541 if (size == 0)
2542 return true;
2544 addr += extra->ImageBase;
2545 for (section = abfd->sections; section != NULL; section = section->next)
2547 if ((addr >= section->vma) && (addr < (section->vma + section->size)))
2548 break;
2551 if (section == NULL)
2553 fprintf (file,
2554 _("\nThere is a debug directory, but the section containing it could not be found\n"));
2555 return true;
2557 else if (!(section->flags & SEC_HAS_CONTENTS))
2559 fprintf (file,
2560 _("\nThere is a debug directory in %s, but that section has no contents\n"),
2561 section->name);
2562 return true;
2564 else if (section->size < size)
2566 fprintf (file,
2567 _("\nError: section %s contains the debug data starting address but it is too small\n"),
2568 section->name);
2569 return false;
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"));
2580 return false;
2583 fprintf (file,
2584 _("Type Size Rva Offset\n"));
2586 /* Read the whole section. */
2587 if (!bfd_malloc_and_get_section (abfd, section, &data))
2589 free (data);
2590 return false;
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];
2604 else
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))
2625 continue;
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);
2637 free(data);
2639 if (size % sizeof (struct external_IMAGE_DEBUG_DIRECTORY) != 0)
2640 fprintf (file,
2641 _("The debug directory size is not a multiple of the debug directory entry size\n"));
2643 return true;
2646 static bool
2647 pe_is_repro (bfd * abfd)
2649 pe_data_type *pe = pe_data (abfd);
2650 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
2651 asection *section;
2652 bfd_byte *data = 0;
2653 bfd_size_type dataoff;
2654 unsigned int i;
2655 bool res = false;
2657 bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
2658 bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
2660 if (size == 0)
2661 return false;
2663 addr += extra->ImageBase;
2664 for (section = abfd->sections; section != NULL; section = section->next)
2666 if ((addr >= section->vma) && (addr < (section->vma + section->size)))
2667 break;
2670 if ((section == NULL)
2671 || (!(section->flags & SEC_HAS_CONTENTS))
2672 || (section->size < size))
2674 return false;
2677 dataoff = addr - section->vma;
2679 if (size > (section->size - dataoff))
2681 return false;
2684 if (!bfd_malloc_and_get_section (abfd, section, &data))
2686 free (data);
2687 return false;
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)
2700 res = true;
2701 break;
2705 free(data);
2707 return res;
2710 /* Print out the program headers. */
2712 bool
2713 _bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile)
2715 FILE *file = (FILE *) vfile;
2716 int j;
2717 pe_data_type *pe = pe_data (abfd);
2718 struct internal_extra_pe_aouthdr *i = &pe->pe_opthdr;
2719 const char *subsystem_name = NULL;
2720 const char *name;
2722 /* The MS dumpbin program reportedly ands with 0xff0f before
2723 printing the characteristics field. Not sure why. No reason to
2724 emulate it here. */
2725 fprintf (file, _("\nCharacteristics 0x%x\n"), pe->real_flags);
2726 #undef PF
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");
2742 #undef PF
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");
2753 else
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
2762 #endif
2763 #ifndef IMAGE_NT_OPTIONAL_HDR64_MAGIC
2764 # define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
2765 #endif
2766 #ifndef IMAGE_NT_OPTIONAL_HDRROM_MAGIC
2767 # define IMAGE_NT_OPTIONAL_HDRROM_MAGIC 0x107
2768 #endif
2770 switch (i->Magic)
2772 case IMAGE_NT_OPTIONAL_HDR_MAGIC:
2773 name = "PE32";
2774 break;
2775 case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
2776 name = "PE32+";
2777 break;
2778 case IMAGE_NT_OPTIONAL_HDRROM_MAGIC:
2779 name = "ROM";
2780 break;
2781 default:
2782 name = NULL;
2783 break;
2785 fprintf (file, "Magic\t\t\t%04x", i->Magic);
2786 if (name)
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);
2804 #endif
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";
2825 break;
2826 case IMAGE_SUBSYSTEM_NATIVE:
2827 subsystem_name = "NT native";
2828 break;
2829 case IMAGE_SUBSYSTEM_WINDOWS_GUI:
2830 subsystem_name = "Windows GUI";
2831 break;
2832 case IMAGE_SUBSYSTEM_WINDOWS_CUI:
2833 subsystem_name = "Windows CUI";
2834 break;
2835 case IMAGE_SUBSYSTEM_POSIX_CUI:
2836 subsystem_name = "POSIX CUI";
2837 break;
2838 case IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:
2839 subsystem_name = "Wince CUI";
2840 break;
2841 /* These are from UEFI Platform Initialization Specification 1.1. */
2842 case IMAGE_SUBSYSTEM_EFI_APPLICATION:
2843 subsystem_name = "EFI application";
2844 break;
2845 case IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:
2846 subsystem_name = "EFI boot service driver";
2847 break;
2848 case IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
2849 subsystem_name = "EFI runtime driver";
2850 break;
2851 case IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER:
2852 subsystem_name = "SAL runtime driver";
2853 break;
2854 /* This is from revision 8.0 of the MS PE/COFF spec */
2855 case IMAGE_SUBSYSTEM_XBOX:
2856 subsystem_name = "XBOX";
2857 break;
2858 /* Added default case for clarity - subsystem_name is NULL anyway. */
2859 default:
2860 subsystem_name = NULL;
2863 fprintf (file, "Subsystem\t\t%08x", i->Subsystem);
2864 if (subsystem_name)
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);
2920 else
2921 pe_print_pdata (abfd, vfile);
2922 pe_print_reloc (abfd, vfile);
2923 pe_print_debugdata (abfd, file);
2925 rsrc_print_section (abfd, vfile);
2927 return true;
2930 static bool
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));
2937 static asection *
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. */
2946 bool
2947 _bfd_XX_bfd_copy_private_bfd_data_common (bfd * ibfd, bfd * obfd)
2949 pe_data_type *ipe, *ope;
2950 bfd_size_type size;
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)
2955 return true;
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
2977 won't be added. */
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;
2986 if (size != 0)
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
2994 one. */
2995 bfd_vma last = addr + size - 1;
2996 asection *section = find_section_by_vma (obfd, last);
2998 if (section != NULL)
3000 bfd_byte *data;
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 */
3009 _bfd_error_handler
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);
3014 return false;
3017 if (bfd_malloc_and_get_section (obfd, section, &data))
3019 unsigned int i;
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;
3029 bfd_vma idd_vma;
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)
3035 continue;
3037 idd_vma = idd.AddressOfRawData + ope->pe_opthdr.ImageBase;
3038 ddsection = find_section_by_vma (obfd, idd_vma);
3039 if (!ddsection)
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,
3048 section->size))
3050 _bfd_error_handler (_("failed to update file offsets"
3051 " in debug directory"));
3052 free (data);
3053 return false;
3055 free (data);
3057 else
3059 _bfd_error_handler (_("%pB: failed to read "
3060 "debug data section"), obfd);
3061 return false;
3066 return true;
3069 /* Copy private section data. */
3071 bool
3072 _bfd_XX_bfd_copy_private_section_data (bfd *ibfd,
3073 asection *isec,
3074 bfd *obfd,
3075 asection *osec)
3077 if (bfd_get_flavour (ibfd) != bfd_target_coff_flavour
3078 || bfd_get_flavour (obfd) != bfd_target_coff_flavour)
3079 return true;
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)
3089 return false;
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)
3097 return false;
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;
3106 return true;
3109 void
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))
3116 static int
3117 sort_x64_pdata (const void *l, const void *r)
3119 const char *lp = (const char *) l;
3120 const char *rp = (const char *) r;
3121 bfd_vma vl, vr;
3122 vl = bfd_getl32 (lp); vr = bfd_getl32 (rp);
3123 if (vl != vr)
3124 return (vl < vr ? -1 : 1);
3125 /* We compare just begin address. */
3126 return 0;
3128 #endif
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;
3136 static bfd_byte *
3137 rsrc_count_directory (bfd *, bfd_byte *, bfd_byte *, bfd_byte *, bfd_vma);
3139 static bfd_byte *
3140 rsrc_count_entries (bfd *abfd,
3141 bool is_name,
3142 bfd_byte *datastart,
3143 bfd_byte *data,
3144 bfd_byte *dataend,
3145 bfd_vma rva_bias)
3147 unsigned long entry, addr, size;
3149 if (data + 8 >= dataend)
3150 return dataend + 1;
3152 if (is_name)
3154 bfd_byte * name;
3156 entry = (long) bfd_get_32 (abfd, data);
3158 if (HighBitSet (entry))
3159 name = datastart + WithoutHighBit (entry);
3160 else
3161 name = datastart + entry - rva_bias;
3163 if (name + 2 >= dataend || name < datastart)
3164 return dataend + 1;
3166 unsigned int len = bfd_get_16 (abfd, name);
3167 if (len == 0 || len > 256)
3168 return dataend + 1;
3171 entry = (long) bfd_get_32 (abfd, data + 4);
3173 if (HighBitSet (entry))
3175 data = datastart + WithoutHighBit (entry);
3177 if (data <= datastart || data >= dataend)
3178 return dataend + 1;
3180 return rsrc_count_directory (abfd, datastart, data, dataend, rva_bias);
3183 if (datastart + entry + 16 >= dataend)
3184 return dataend + 1;
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;
3192 static bfd_byte *
3193 rsrc_count_directory (bfd * abfd,
3194 bfd_byte * datastart,
3195 bfd_byte * data,
3196 bfd_byte * dataend,
3197 bfd_vma rva_bias)
3199 unsigned int num_entries, num_ids;
3200 bfd_byte * highest_data = data;
3202 if (data + 16 >= dataend)
3203 return dataend + 1;
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;
3210 data += 16;
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);
3218 data += 8;
3219 highest_data = max (highest_data, entry_end);
3220 if (entry_end >= dataend)
3221 break;
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;
3232 } rsrc_dir_chain;
3234 typedef struct rsrc_directory
3236 unsigned int characteristics;
3237 unsigned int time;
3238 unsigned int major;
3239 unsigned int minor;
3241 rsrc_dir_chain names;
3242 rsrc_dir_chain ids;
3244 struct rsrc_entry * entry;
3245 } rsrc_directory;
3247 typedef struct rsrc_string
3249 unsigned int len;
3250 bfd_byte * string;
3251 } rsrc_string;
3253 typedef struct rsrc_leaf
3255 unsigned int size;
3256 unsigned int codepage;
3257 bfd_byte * data;
3258 } rsrc_leaf;
3260 typedef struct rsrc_entry
3262 bool is_name;
3263 union
3265 unsigned int id;
3266 struct rsrc_string name;
3267 } name_id;
3269 bool is_dir;
3270 union
3272 struct rsrc_directory * directory;
3273 struct rsrc_leaf * leaf;
3274 } value;
3276 struct rsrc_entry * next_entry;
3277 struct rsrc_directory * parent;
3278 } rsrc_entry;
3280 static bfd_byte *
3281 rsrc_parse_directory (bfd *, rsrc_directory *, bfd_byte *,
3282 bfd_byte *, bfd_byte *, bfd_vma, rsrc_entry *);
3284 static bfd_byte *
3285 rsrc_parse_entry (bfd *abfd,
3286 bool is_name,
3287 rsrc_entry *entry,
3288 bfd_byte *datastart,
3289 bfd_byte * data,
3290 bfd_byte *dataend,
3291 bfd_vma rva_bias,
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;
3301 if (is_name)
3303 bfd_byte * address;
3305 if (HighBitSet (val))
3307 val = WithoutHighBit (val);
3309 address = datastart + val;
3311 else
3313 address = datastart + val - rva_bias;
3316 if (address + 3 > dataend)
3317 return dataend;
3319 entry->name_id.name.len = bfd_get_16 (abfd, address);
3320 entry->name_id.name.string = address + 2;
3322 else
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)
3332 return dataend;
3334 return rsrc_parse_directory (abfd, entry->value.directory,
3335 datastart,
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)
3343 return dataend;
3345 data = datastart + val;
3346 if (data < datastart || data >= dataend)
3347 return 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)
3356 return dataend;
3358 memcpy (entry->value.leaf->data, datastart + addr - rva_bias, size);
3359 return datastart + (addr - rva_bias) + size;
3362 static bfd_byte *
3363 rsrc_parse_entries (bfd *abfd,
3364 rsrc_dir_chain *chain,
3365 bool is_name,
3366 bfd_byte *highest_data,
3367 bfd_byte *datastart,
3368 bfd_byte *data,
3369 bfd_byte *dataend,
3370 bfd_vma rva_bias,
3371 rsrc_directory *parent)
3373 unsigned int i;
3374 rsrc_entry * entry;
3376 if (chain->num_entries == 0)
3378 chain->first_entry = chain->last_entry = NULL;
3379 return highest_data;
3382 entry = bfd_malloc (sizeof * entry);
3383 if (entry == NULL)
3384 return dataend;
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);
3394 data += 8;
3395 highest_data = max (entry_end, highest_data);
3396 if (entry_end > dataend)
3397 return dataend;
3399 if (i)
3401 entry->next_entry = bfd_malloc (sizeof * entry);
3402 entry = entry->next_entry;
3403 if (entry == NULL)
3404 return dataend;
3406 else
3407 entry->next_entry = NULL;
3410 chain->last_entry = entry;
3412 return highest_data;
3415 static bfd_byte *
3416 rsrc_parse_directory (bfd * abfd,
3417 rsrc_directory * table,
3418 bfd_byte * datastart,
3419 bfd_byte * data,
3420 bfd_byte * dataend,
3421 bfd_vma rva_bias,
3422 rsrc_entry * entry)
3424 bfd_byte * highest_data = data;
3426 if (table == NULL)
3427 return dataend;
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;
3437 data += 16;
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
3452 bfd * abfd;
3453 bfd_byte * datastart;
3454 bfd_byte * next_table;
3455 bfd_byte * next_leaf;
3456 bfd_byte * next_string;
3457 bfd_byte * next_data;
3458 bfd_vma rva_bias;
3459 } rsrc_write_data;
3461 static void
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,
3472 bfd_byte * addr)
3474 return (addr - data->datastart) + data->rva_bias;
3477 static void
3478 rsrc_write_leaf (rsrc_write_data * data,
3479 rsrc_leaf * leaf)
3481 bfd_put_32 (data->abfd, rsrc_compute_rva (data, data->next_data),
3482 data->next_leaf);
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 *);
3496 static void
3497 rsrc_write_entry (rsrc_write_data * data,
3498 bfd_byte * where,
3499 rsrc_entry * entry)
3501 if (entry->is_name)
3503 bfd_put_32 (data->abfd,
3504 SetHighBit (data->next_string - data->datastart),
3505 where);
3506 rsrc_write_string (data, & entry->name_id.name);
3508 else
3509 bfd_put_32 (data->abfd, entry->name_id.id, where);
3511 if (entry->is_dir)
3513 bfd_put_32 (data->abfd,
3514 SetHighBit (data->next_table - data->datastart),
3515 where + 4);
3516 rsrc_write_directory (data, entry->value.directory);
3518 else
3520 bfd_put_32 (data->abfd, data->next_leaf - data->datastart, where + 4);
3521 rsrc_write_leaf (data, entry->value.leaf);
3525 static void
3526 rsrc_compute_region_sizes (rsrc_directory * dir)
3528 struct rsrc_entry * entry;
3530 if (dir == NULL)
3531 return;
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;
3541 if (entry->is_dir)
3542 rsrc_compute_region_sizes (entry->value.directory);
3543 else
3544 sizeof_leaves += 16;
3547 for (entry = dir->ids.first_entry; entry != NULL; entry = entry->next_entry)
3549 sizeof_tables_and_entries += 8;
3551 if (entry->is_dir)
3552 rsrc_compute_region_sizes (entry->value.directory);
3553 else
3554 sizeof_leaves += 16;
3558 static void
3559 rsrc_write_directory (rsrc_write_data * data,
3560 rsrc_directory * dir)
3562 rsrc_entry * entry;
3563 unsigned int i;
3564 bfd_byte * next_entry;
3565 bfd_byte * nt;
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);
3587 next_entry += 8;
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);
3598 next_entry += 8;
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. */
3609 static unsigned int
3610 u16_mbtouc (wint_t * puc, const unsigned short * s, unsigned int n)
3612 unsigned short c = * s;
3614 if (c < 0xd800 || c >= 0xe000)
3616 *puc = c;
3617 return 1;
3620 if (c < 0xdc00)
3622 if (n >= 2)
3624 if (s[1] >= 0xdc00 && s[1] < 0xe000)
3626 *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
3627 return 2;
3630 else
3632 /* Incomplete multibyte character. */
3633 *puc = 0xfffd;
3634 return n;
3638 /* Invalid multibyte character. */
3639 *puc = 0xfffd;
3640 return 1;
3642 #endif /* not Cygwin/Mingw */
3644 /* Perform a comparison of two entries. */
3645 static signed int
3646 rsrc_cmp (bool is_name, rsrc_entry * a, rsrc_entry * b)
3648 signed int res;
3649 bfd_byte * astring;
3650 unsigned int alen;
3651 bfd_byte * bstring;
3652 unsigned int blen;
3654 if (! is_name)
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... */
3668 #undef rscpcmp
3669 #ifdef __CYGWIN__
3670 #define rscpcmp wcsncasecmp
3671 #endif
3672 #ifdef __MINGW32__
3673 #define rscpcmp wcsnicmp
3674 #endif
3676 res = rscpcmp ((const wchar_t *) astring, (const wchar_t *) bstring,
3677 min (alen, blen));
3679 #else
3681 unsigned int i;
3683 res = 0;
3684 for (i = min (alen, blen); i--; astring += 2, bstring += 2)
3686 wint_t awc;
3687 wint_t bwc;
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);
3694 if (Alen != Blen)
3695 return Alen - Blen;
3697 awc = towlower (awc);
3698 bwc = towlower (bwc);
3700 res = awc - bwc;
3701 if (res)
3702 break;
3705 #endif
3707 if (res == 0)
3708 res = alen - blen;
3710 return res;
3713 static void
3714 rsrc_print_name (char * buffer, rsrc_string string)
3716 unsigned int i;
3717 bfd_byte * name = string.string;
3719 for (i = string.len; i--; name += 2)
3720 sprintf (buffer + strlen (buffer), "%.1s", name);
3723 static const char *
3724 rsrc_resource_name (rsrc_entry *entry, rsrc_directory *dir, char *buffer)
3726 bool is_string = false;
3728 buffer[0] = 0;
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);
3737 else
3739 unsigned int id = dir->entry->parent->entry->name_id.id;
3741 sprintf (buffer + strlen (buffer), "%x", id);
3742 switch (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);
3776 else
3778 unsigned int id = dir->entry->name_id.id;
3780 sprintf (buffer + strlen (buffer), "%x", id);
3782 if (is_string)
3783 sprintf (buffer + strlen (buffer), " (resource id range: %d - %d)",
3784 (id - 1) << 4, (id << 4) - 1);
3788 if (entry != NULL)
3790 strcat (buffer, " lang: ");
3792 if (entry->is_name)
3793 rsrc_print_name (buffer + strlen (buffer), entry->name_id.name);
3794 else
3795 sprintf (buffer + strlen (buffer), "%x", entry->name_id.id);
3798 return buffer;
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
3805 identical at all.
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. */
3813 static bool
3814 rsrc_merge_string_entries (rsrc_entry * a ATTRIBUTE_UNUSED,
3815 rsrc_entry * b ATTRIBUTE_UNUSED)
3817 unsigned int copy_needed = 0;
3818 unsigned int i;
3819 bfd_byte * astring;
3820 bfd_byte * bstring;
3821 bfd_byte * new_data;
3822 bfd_byte * nstring;
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);
3836 if (alen == 0)
3838 copy_needed += blen * 2;
3840 else if (blen == 0)
3842 else if (alen != blen)
3843 /* FIXME: Should we continue the loop in order to report other duplicates ? */
3844 break;
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)
3849 break;
3851 astring += (alen + 1) * 2;
3852 bstring += (blen + 1) * 2;
3855 if (i != 16)
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);
3862 return false;
3865 if (copy_needed == 0)
3866 return true;
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
3871 in B's strings. */
3872 new_data = bfd_malloc (a->value.leaf->size + copy_needed);
3873 if (new_data == NULL)
3874 return false;
3876 nstring = new_data;
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);
3885 if (alen != 0)
3887 memcpy (nstring, astring, (alen + 1) * 2);
3888 nstring += (alen + 1) * 2;
3890 else if (blen != 0)
3892 memcpy (nstring, bstring, (blen + 1) * 2);
3893 nstring += (blen + 1) * 2;
3895 else
3897 * nstring++ = 0;
3898 * nstring++ = 0;
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;
3911 return true;
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. */
3920 static void
3921 rsrc_sort_entries (rsrc_dir_chain *chain,
3922 bool is_name,
3923 rsrc_directory *dir)
3925 rsrc_entry * entry;
3926 rsrc_entry * next;
3927 rsrc_entry ** points_to_entry;
3928 bool swapped;
3930 if (chain->num_entries < 2)
3931 return;
3935 swapped = false;
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);
3944 if (cmp > 0)
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;
3951 swapped = true;
3953 else if (cmp == 0)
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. */
3967 if (!entry->is_name
3968 && entry->name_id.id == 1
3969 && dir != NULL
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;
3991 swapped = true;
3993 else
3995 _bfd_error_handler (_(".rsrc merge failure: multiple non-default manifests"));
3996 bfd_set_error (bfd_error_file_truncated);
3997 return;
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)
4005 return;
4006 next = next->next_entry;
4008 else
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);
4015 return;
4017 else
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. */
4023 if (!entry->is_name
4024 && entry->name_id.id == 0
4025 && dir != NULL
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);
4046 return;
4049 else
4051 if (dir == NULL
4052 || dir->entry == NULL
4053 || dir->entry->parent == NULL
4054 || dir->entry->parent->entry == NULL)
4055 _bfd_error_handler (_(".rsrc merge failure: duplicate leaf"));
4056 else
4058 char buff[256];
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);
4064 return;
4068 /* Unhook NEXT from the chain. */
4069 entry->next_entry = next->next_entry;
4070 chain->num_entries --;
4071 if (chain->num_entries < 2)
4072 return;
4073 next = next->next_entry;
4075 else
4077 points_to_entry = & entry->next_entry;
4078 entry = next;
4079 next = next->next_entry;
4082 while (next);
4084 chain->last_entry = entry;
4086 while (swapped);
4089 /* Attach B's chain onto A. */
4090 static void
4091 rsrc_attach_chain (rsrc_dir_chain * achain, rsrc_dir_chain * bchain)
4093 if (bchain->num_entries == 0)
4094 return;
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;
4103 else
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;
4113 static void
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);
4129 return;
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);
4136 return;
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. */
4154 static void
4155 rsrc_process_section (bfd * abfd,
4156 struct coff_final_link_info * pfinfo)
4158 rsrc_directory new_table;
4159 bfd_size_type size;
4160 asection * sec;
4161 pe_data_type * pe;
4162 bfd_vma rva_bias;
4163 bfd_byte * data;
4164 bfd_byte * datastart;
4165 bfd_byte * dataend;
4166 bfd_byte * new_data;
4167 unsigned int num_resource_sets;
4168 rsrc_directory * type_tables;
4169 rsrc_write_data write_data;
4170 unsigned int indx;
4171 bfd * input;
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)
4181 return;
4183 pe = pe_data (abfd);
4184 if (pe == NULL)
4185 return;
4187 rva_bias = sec->vma - pe->pe_opthdr.ImageBase;
4189 data = bfd_malloc (size);
4190 if (data == NULL)
4191 return;
4193 datastart = data;
4195 if (! bfd_get_section_contents (abfd, sec, data, 0, size))
4196 goto end;
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)
4209 goto end;
4211 for (input = pfinfo->info->input_bfds;
4212 input != NULL;
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)
4226 goto end;
4229 BFD_ASSERT (rsrc_sec->size > 0);
4230 rsrc_sizes [num_input_rsrc ++] = rsrc_sec->size;
4234 if (num_input_rsrc < 2)
4235 goto end;
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);
4248 if (data > dataend)
4250 /* Corrupted .rsrc section - cannot merge. */
4251 _bfd_error_handler (_("%pB: .rsrc merge failure: corrupt .rsrc section"),
4252 abfd);
4253 bfd_set_error (bfd_error_file_truncated);
4254 goto end;
4257 if ((data - p) > rsrc_sizes [num_resource_sets])
4259 _bfd_error_handler (_("%pB: .rsrc merge failure: unexpected .rsrc size"),
4260 abfd);
4261 bfd_set_error (bfd_error_file_truncated);
4262 goto end;
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. */
4274 data = datastart;
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)
4279 goto end;
4281 indx = 0;
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;
4290 ++ indx;
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
4328 some entries. */
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)
4337 goto end;
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;
4355 end:
4356 /* Step six: Free all the memory that we have used. */
4357 /* FIXME: Free the resource tree, if we have one. */
4358 free (datastart);
4359 free (rsrc_sizes);
4362 /* Handle the .idata section and other things that need symbol table
4363 access. */
4365 bool
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;
4370 bool result = true;
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);
4382 if (h1 != NULL)
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);
4395 else
4397 _bfd_error_handler
4398 (_("%pB: unable to fill in DataDictionary[1] because .idata$2 is missing"),
4399 abfd);
4400 result = false;
4403 h1 = coff_link_hash_lookup (coff_hash_table (info),
4404 ".idata$4", false, false, true);
4405 if (h1 != NULL
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);
4415 else
4417 _bfd_error_handler
4418 (_("%pB: unable to fill in DataDictionary[1] because .idata$4 is missing"),
4419 abfd);
4420 result = false;
4423 /* The import address table. This is the size/address of
4424 .idata$5. */
4425 h1 = coff_link_hash_lookup (coff_hash_table (info),
4426 ".idata$5", false, false, true);
4427 if (h1 != NULL
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);
4436 else
4438 _bfd_error_handler
4439 (_("%pB: unable to fill in DataDictionary[12] because .idata$5 is missing"),
4440 abfd);
4441 result = false;
4444 h1 = coff_link_hash_lookup (coff_hash_table (info),
4445 ".idata$6", false, false, true);
4446 if (h1 != NULL
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);
4456 else
4458 _bfd_error_handler
4459 (_("%pB: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE (12)] because .idata$6 is missing"),
4460 abfd);
4461 result = false;
4464 else
4466 h1 = coff_link_hash_lookup (coff_hash_table (info),
4467 "__IAT_start__", false, false, true);
4468 if (h1 != NULL
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)
4474 bfd_vma iat_va;
4476 iat_va =
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);
4483 if (h1 != NULL
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)
4493 - iat_va);
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;
4498 else
4500 _bfd_error_handler
4501 (_("%pB: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE(12)]"
4502 " because .idata$6 is missing"), abfd);
4503 result = false;
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);
4512 if (h1 != NULL)
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);
4523 else
4525 _bfd_error_handler
4526 (_("%pB: unable to fill in DataDictionary[9] because __tls_used is missing"),
4527 abfd);
4528 result = false;
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;
4536 #else
4537 pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].Size = 0x28;
4538 #endif
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");
4547 if (sec)
4549 bfd_size_type x = sec->rawsize;
4550 bfd_byte *tmp_data = NULL;
4552 if (x)
4553 tmp_data = bfd_malloc (x);
4555 if (tmp_data != NULL)
4557 if (bfd_get_section_contents (abfd, sec, tmp_data, 0, x))
4559 qsort (tmp_data,
4560 (size_t) (x / 12),
4561 12, sort_x64_pdata);
4562 bfd_set_section_contents (pfinfo->output_bfd, sec,
4563 tmp_data, 0, x);
4565 free (tmp_data);
4567 else
4568 result = false;
4571 #endif
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
4577 program.... */
4578 return result;