Remove path name from test case
[binutils-gdb.git] / bfd / peXXigen.c
1 /* Support for the generic parts of PE/PEI; the common executable parts.
2 Copyright (C) 1995-2023 Free Software Foundation, Inc.
3 Written by Cygnus Solutions.
4
5 This file is part of BFD, the Binary File Descriptor library.
6
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.
11
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.
16
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. */
21
22
23 /* Most of this hacked by Steve Chamberlain <sac@cygnus.com>.
24
25 PE/PEI rearrangement (and code added): Donn Terry
26 Softway Systems, Inc. */
27
28 /* Hey look, some documentation [and in a place you expect to find it]!
29
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.
33
34 Another reference:
35 "Peering Inside the PE: A Tour of the Win32 Portable Executable
36 File Format", MSJ 1994, Volume 9.
37
38 The PE/PEI format is also used by .NET. ECMA-335 describes this:
39
40 "Standard ECMA-335 Common Language Infrastructure (CLI)", 6th Edition, June 2012.
41
42 This is also available at
43 https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf.
44
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!)
52
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.
58
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. */
62
63 /* This expands into COFF_WITH_pe, COFF_WITH_pep, COFF_WITH_pex64,
64 COFF_WITH_peAArch64 or COFF_WITH_peLoongArch64 depending on whether we're
65 compiling for straight PE or PE+. */
66 #define COFF_WITH_XX
67
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>
76
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 #elif defined COFF_WITH_peLoongArch64
90 # include "coff/loongarch64.h"
91 #else
92 # include "coff/i386.h"
93 #endif
94
95 #include "coff/pe.h"
96 #include "libcoff.h"
97 #include "libpei.h"
98 #include "safe-ctype.h"
99
100 #if defined COFF_WITH_pep || defined COFF_WITH_pex64 || defined COFF_WITH_peAArch64 || defined COFF_WITH_peLoongArch64
101 # undef AOUTSZ
102 # define AOUTSZ PEPAOUTSZ
103 # define PEAOUTHDR PEPAOUTHDR
104 #endif
105
106 #define HighBitSet(val) ((val) & 0x80000000)
107 #define SetHighBit(val) ((val) | 0x80000000)
108 #define WithoutHighBit(val) ((val) & 0x7fffffff)
109 \f
110 void
111 _bfd_XXi_swap_sym_in (bfd * abfd, void * ext1, void * in1)
112 {
113 SYMENT *ext = (SYMENT *) ext1;
114 struct internal_syment *in = (struct internal_syment *) in1;
115
116 if (ext->e.e_name[0] == 0)
117 {
118 in->_n._n_n._n_zeroes = 0;
119 in->_n._n_n._n_offset = H_GET_32 (abfd, ext->e.e.e_offset);
120 }
121 else
122 memcpy (in->_n._n_name, ext->e.e_name, SYMNMLEN);
123
124 in->n_value = H_GET_32 (abfd, ext->e_value);
125 in->n_scnum = (short) H_GET_16 (abfd, ext->e_scnum);
126
127 if (sizeof (ext->e_type) == 2)
128 in->n_type = H_GET_16 (abfd, ext->e_type);
129 else
130 in->n_type = H_GET_32 (abfd, ext->e_type);
131
132 in->n_sclass = H_GET_8 (abfd, ext->e_sclass);
133 in->n_numaux = H_GET_8 (abfd, ext->e_numaux);
134
135 #ifndef STRICT_PE_FORMAT
136 /* This is for Gnu-created DLLs. */
137
138 /* The section symbols for the .idata$ sections have class 0x68
139 (C_SECTION), which MS documentation indicates is a section
140 symbol. Unfortunately, the value field in the symbol is simply a
141 copy of the .idata section's flags rather than something useful.
142 When these symbols are encountered, change the value to 0 so that
143 they will be handled somewhat correctly in the bfd code. */
144 if (in->n_sclass == C_SECTION)
145 {
146 char namebuf[SYMNMLEN + 1];
147 const char *name = NULL;
148
149 in->n_value = 0x0;
150
151 /* Create synthetic empty sections as needed. DJ */
152 if (in->n_scnum == 0)
153 {
154 asection *sec;
155
156 name = _bfd_coff_internal_syment_name (abfd, in, namebuf);
157 if (name == NULL)
158 {
159 _bfd_error_handler (_("%pB: unable to find name for empty section"),
160 abfd);
161 bfd_set_error (bfd_error_invalid_target);
162 return;
163 }
164
165 sec = bfd_get_section_by_name (abfd, name);
166 if (sec != NULL)
167 in->n_scnum = sec->target_index;
168 }
169
170 if (in->n_scnum == 0)
171 {
172 int unused_section_number = 0;
173 asection *sec;
174 flagword flags;
175 size_t name_len;
176 char *sec_name;
177
178 for (sec = abfd->sections; sec; sec = sec->next)
179 if (unused_section_number <= sec->target_index)
180 unused_section_number = sec->target_index + 1;
181
182 name_len = strlen (name) + 1;
183 sec_name = bfd_alloc (abfd, name_len);
184 if (sec_name == NULL)
185 {
186 _bfd_error_handler (_("%pB: out of memory creating name "
187 "for empty section"), abfd);
188 return;
189 }
190 memcpy (sec_name, name, name_len);
191
192 flags = (SEC_HAS_CONTENTS | SEC_ALLOC | SEC_DATA | SEC_LOAD
193 | SEC_LINKER_CREATED);
194 sec = bfd_make_section_anyway_with_flags (abfd, sec_name, flags);
195 if (sec == NULL)
196 {
197 _bfd_error_handler (_("%pB: unable to create fake empty section"),
198 abfd);
199 return;
200 }
201
202 sec->alignment_power = 2;
203 sec->target_index = unused_section_number;
204
205 in->n_scnum = unused_section_number;
206 }
207 in->n_sclass = C_STAT;
208 }
209 #endif
210 }
211
212 static bool
213 abs_finder (bfd * abfd ATTRIBUTE_UNUSED, asection * sec, void * data)
214 {
215 bfd_vma abs_val = * (bfd_vma *) data;
216
217 return (sec->vma <= abs_val) && ((sec->vma + (1ULL << 32)) > abs_val);
218 }
219
220 unsigned int
221 _bfd_XXi_swap_sym_out (bfd * abfd, void * inp, void * extp)
222 {
223 struct internal_syment *in = (struct internal_syment *) inp;
224 SYMENT *ext = (SYMENT *) extp;
225
226 if (in->_n._n_name[0] == 0)
227 {
228 H_PUT_32 (abfd, 0, ext->e.e.e_zeroes);
229 H_PUT_32 (abfd, in->_n._n_n._n_offset, ext->e.e.e_offset);
230 }
231 else
232 memcpy (ext->e.e_name, in->_n._n_name, SYMNMLEN);
233
234 /* The PE32 and PE32+ formats only use 4 bytes to hold the value of a
235 symbol. This is a problem on 64-bit targets where we can generate
236 absolute symbols with values >= 1^32. We try to work around this
237 problem by finding a section whose base address is sufficient to
238 reduce the absolute value to < 1^32, and then transforming the
239 symbol into a section relative symbol. This of course is a hack. */
240 if (sizeof (in->n_value) > 4
241 /* The strange computation of the shift amount is here in order to
242 avoid a compile time warning about the comparison always being
243 false. It does not matter if this test fails to work as expected
244 as the worst that can happen is that some absolute symbols are
245 needlessly converted into section relative symbols. */
246 && in->n_value > ((1ULL << (sizeof (in->n_value) > 4 ? 32 : 31)) - 1)
247 && in->n_scnum == N_ABS)
248 {
249 asection * sec;
250
251 sec = bfd_sections_find_if (abfd, abs_finder, & in->n_value);
252 if (sec)
253 {
254 in->n_value -= sec->vma;
255 in->n_scnum = sec->target_index;
256 }
257 /* else: FIXME: The value is outside the range of any section. This
258 happens for __image_base__ and __ImageBase and maybe some other
259 symbols as well. We should find a way to handle these values. */
260 }
261
262 H_PUT_32 (abfd, in->n_value, ext->e_value);
263 H_PUT_16 (abfd, in->n_scnum, ext->e_scnum);
264
265 if (sizeof (ext->e_type) == 2)
266 H_PUT_16 (abfd, in->n_type, ext->e_type);
267 else
268 H_PUT_32 (abfd, in->n_type, ext->e_type);
269
270 H_PUT_8 (abfd, in->n_sclass, ext->e_sclass);
271 H_PUT_8 (abfd, in->n_numaux, ext->e_numaux);
272
273 return SYMESZ;
274 }
275
276 void
277 _bfd_XXi_swap_aux_in (bfd * abfd,
278 void * ext1,
279 int type,
280 int in_class,
281 int indx ATTRIBUTE_UNUSED,
282 int numaux ATTRIBUTE_UNUSED,
283 void * in1)
284 {
285 AUXENT *ext = (AUXENT *) ext1;
286 union internal_auxent *in = (union internal_auxent *) in1;
287
288 /* PR 17521: Make sure that all fields in the aux structure
289 are initialised. */
290 memset (in, 0, sizeof * in);
291 switch (in_class)
292 {
293 case C_FILE:
294 if (ext->x_file.x_fname[0] == 0)
295 {
296 in->x_file.x_n.x_n.x_zeroes = 0;
297 in->x_file.x_n.x_n.x_offset = H_GET_32 (abfd, ext->x_file.x_n.x_offset);
298 }
299 else
300 memcpy (in->x_file.x_n.x_fname, ext->x_file.x_fname, FILNMLEN);
301 return;
302
303 case C_STAT:
304 case C_LEAFSTAT:
305 case C_HIDDEN:
306 if (type == T_NULL)
307 {
308 in->x_scn.x_scnlen = GET_SCN_SCNLEN (abfd, ext);
309 in->x_scn.x_nreloc = GET_SCN_NRELOC (abfd, ext);
310 in->x_scn.x_nlinno = GET_SCN_NLINNO (abfd, ext);
311 in->x_scn.x_checksum = H_GET_32 (abfd, ext->x_scn.x_checksum);
312 in->x_scn.x_associated = H_GET_16 (abfd, ext->x_scn.x_associated);
313 in->x_scn.x_comdat = H_GET_8 (abfd, ext->x_scn.x_comdat);
314 return;
315 }
316 break;
317 }
318
319 in->x_sym.x_tagndx.u32 = H_GET_32 (abfd, ext->x_sym.x_tagndx);
320 in->x_sym.x_tvndx = H_GET_16 (abfd, ext->x_sym.x_tvndx);
321
322 if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
323 || ISTAG (in_class))
324 {
325 in->x_sym.x_fcnary.x_fcn.x_lnnoptr = GET_FCN_LNNOPTR (abfd, ext);
326 in->x_sym.x_fcnary.x_fcn.x_endndx.u32 = GET_FCN_ENDNDX (abfd, ext);
327 }
328 else
329 {
330 in->x_sym.x_fcnary.x_ary.x_dimen[0] =
331 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
332 in->x_sym.x_fcnary.x_ary.x_dimen[1] =
333 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
334 in->x_sym.x_fcnary.x_ary.x_dimen[2] =
335 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
336 in->x_sym.x_fcnary.x_ary.x_dimen[3] =
337 H_GET_16 (abfd, ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
338 }
339
340 if (ISFCN (type))
341 {
342 in->x_sym.x_misc.x_fsize = H_GET_32 (abfd, ext->x_sym.x_misc.x_fsize);
343 }
344 else
345 {
346 in->x_sym.x_misc.x_lnsz.x_lnno = GET_LNSZ_LNNO (abfd, ext);
347 in->x_sym.x_misc.x_lnsz.x_size = GET_LNSZ_SIZE (abfd, ext);
348 }
349 }
350
351 unsigned int
352 _bfd_XXi_swap_aux_out (bfd * abfd,
353 void * inp,
354 int type,
355 int in_class,
356 int indx ATTRIBUTE_UNUSED,
357 int numaux ATTRIBUTE_UNUSED,
358 void * extp)
359 {
360 union internal_auxent *in = (union internal_auxent *) inp;
361 AUXENT *ext = (AUXENT *) extp;
362
363 memset (ext, 0, AUXESZ);
364
365 switch (in_class)
366 {
367 case C_FILE:
368 if (in->x_file.x_n.x_fname[0] == 0)
369 {
370 H_PUT_32 (abfd, 0, ext->x_file.x_n.x_zeroes);
371 H_PUT_32 (abfd, in->x_file.x_n.x_n.x_offset, ext->x_file.x_n.x_offset);
372 }
373 else
374 memcpy (ext->x_file.x_fname, in->x_file.x_n.x_fname, sizeof (ext->x_file.x_fname));
375
376 return AUXESZ;
377
378 case C_STAT:
379 case C_LEAFSTAT:
380 case C_HIDDEN:
381 if (type == T_NULL)
382 {
383 PUT_SCN_SCNLEN (abfd, in->x_scn.x_scnlen, ext);
384 PUT_SCN_NRELOC (abfd, in->x_scn.x_nreloc, ext);
385 PUT_SCN_NLINNO (abfd, in->x_scn.x_nlinno, ext);
386 H_PUT_32 (abfd, in->x_scn.x_checksum, ext->x_scn.x_checksum);
387 H_PUT_16 (abfd, in->x_scn.x_associated, ext->x_scn.x_associated);
388 H_PUT_8 (abfd, in->x_scn.x_comdat, ext->x_scn.x_comdat);
389 return AUXESZ;
390 }
391 break;
392 }
393
394 H_PUT_32 (abfd, in->x_sym.x_tagndx.u32, ext->x_sym.x_tagndx);
395 H_PUT_16 (abfd, in->x_sym.x_tvndx, ext->x_sym.x_tvndx);
396
397 if (in_class == C_BLOCK || in_class == C_FCN || ISFCN (type)
398 || ISTAG (in_class))
399 {
400 PUT_FCN_LNNOPTR (abfd, in->x_sym.x_fcnary.x_fcn.x_lnnoptr, ext);
401 PUT_FCN_ENDNDX (abfd, in->x_sym.x_fcnary.x_fcn.x_endndx.u32, ext);
402 }
403 else
404 {
405 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[0],
406 ext->x_sym.x_fcnary.x_ary.x_dimen[0]);
407 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[1],
408 ext->x_sym.x_fcnary.x_ary.x_dimen[1]);
409 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[2],
410 ext->x_sym.x_fcnary.x_ary.x_dimen[2]);
411 H_PUT_16 (abfd, in->x_sym.x_fcnary.x_ary.x_dimen[3],
412 ext->x_sym.x_fcnary.x_ary.x_dimen[3]);
413 }
414
415 if (ISFCN (type))
416 H_PUT_32 (abfd, in->x_sym.x_misc.x_fsize, ext->x_sym.x_misc.x_fsize);
417 else
418 {
419 PUT_LNSZ_LNNO (abfd, in->x_sym.x_misc.x_lnsz.x_lnno, ext);
420 PUT_LNSZ_SIZE (abfd, in->x_sym.x_misc.x_lnsz.x_size, ext);
421 }
422
423 return AUXESZ;
424 }
425
426 void
427 _bfd_XXi_swap_lineno_in (bfd * abfd, void * ext1, void * in1)
428 {
429 LINENO *ext = (LINENO *) ext1;
430 struct internal_lineno *in = (struct internal_lineno *) in1;
431
432 in->l_addr.l_symndx = H_GET_32 (abfd, ext->l_addr.l_symndx);
433 in->l_lnno = GET_LINENO_LNNO (abfd, ext);
434 }
435
436 unsigned int
437 _bfd_XXi_swap_lineno_out (bfd * abfd, void * inp, void * outp)
438 {
439 struct internal_lineno *in = (struct internal_lineno *) inp;
440 struct external_lineno *ext = (struct external_lineno *) outp;
441 H_PUT_32 (abfd, in->l_addr.l_symndx, ext->l_addr.l_symndx);
442
443 PUT_LINENO_LNNO (abfd, in->l_lnno, ext);
444 return LINESZ;
445 }
446
447 void
448 _bfd_XXi_swap_aouthdr_in (bfd * abfd,
449 void * aouthdr_ext1,
450 void * aouthdr_int1)
451 {
452 PEAOUTHDR * src = (PEAOUTHDR *) aouthdr_ext1;
453 AOUTHDR * aouthdr_ext = (AOUTHDR *) aouthdr_ext1;
454 struct internal_aouthdr *aouthdr_int
455 = (struct internal_aouthdr *) aouthdr_int1;
456 struct internal_extra_pe_aouthdr *a = &aouthdr_int->pe;
457
458 aouthdr_int->magic = H_GET_16 (abfd, aouthdr_ext->magic);
459 aouthdr_int->vstamp = H_GET_16 (abfd, aouthdr_ext->vstamp);
460 aouthdr_int->tsize = GET_AOUTHDR_TSIZE (abfd, aouthdr_ext->tsize);
461 aouthdr_int->dsize = GET_AOUTHDR_DSIZE (abfd, aouthdr_ext->dsize);
462 aouthdr_int->bsize = GET_AOUTHDR_BSIZE (abfd, aouthdr_ext->bsize);
463 aouthdr_int->entry = GET_AOUTHDR_ENTRY (abfd, aouthdr_ext->entry);
464 aouthdr_int->text_start =
465 GET_AOUTHDR_TEXT_START (abfd, aouthdr_ext->text_start);
466
467 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
468 /* PE32+ does not have data_start member! */
469 aouthdr_int->data_start =
470 GET_AOUTHDR_DATA_START (abfd, aouthdr_ext->data_start);
471 a->BaseOfData = aouthdr_int->data_start;
472 #endif
473
474 a->Magic = aouthdr_int->magic;
475 a->MajorLinkerVersion = H_GET_8 (abfd, aouthdr_ext->vstamp);
476 a->MinorLinkerVersion = H_GET_8 (abfd, aouthdr_ext->vstamp + 1);
477 a->SizeOfCode = aouthdr_int->tsize ;
478 a->SizeOfInitializedData = aouthdr_int->dsize ;
479 a->SizeOfUninitializedData = aouthdr_int->bsize ;
480 a->AddressOfEntryPoint = aouthdr_int->entry;
481 a->BaseOfCode = aouthdr_int->text_start;
482 a->ImageBase = GET_OPTHDR_IMAGE_BASE (abfd, src->ImageBase);
483 a->SectionAlignment = H_GET_32 (abfd, src->SectionAlignment);
484 a->FileAlignment = H_GET_32 (abfd, src->FileAlignment);
485 a->MajorOperatingSystemVersion =
486 H_GET_16 (abfd, src->MajorOperatingSystemVersion);
487 a->MinorOperatingSystemVersion =
488 H_GET_16 (abfd, src->MinorOperatingSystemVersion);
489 a->MajorImageVersion = H_GET_16 (abfd, src->MajorImageVersion);
490 a->MinorImageVersion = H_GET_16 (abfd, src->MinorImageVersion);
491 a->MajorSubsystemVersion = H_GET_16 (abfd, src->MajorSubsystemVersion);
492 a->MinorSubsystemVersion = H_GET_16 (abfd, src->MinorSubsystemVersion);
493 a->Reserved1 = H_GET_32 (abfd, src->Reserved1);
494 a->SizeOfImage = H_GET_32 (abfd, src->SizeOfImage);
495 a->SizeOfHeaders = H_GET_32 (abfd, src->SizeOfHeaders);
496 a->CheckSum = H_GET_32 (abfd, src->CheckSum);
497 a->Subsystem = H_GET_16 (abfd, src->Subsystem);
498 a->DllCharacteristics = H_GET_16 (abfd, src->DllCharacteristics);
499 a->SizeOfStackReserve =
500 GET_OPTHDR_SIZE_OF_STACK_RESERVE (abfd, src->SizeOfStackReserve);
501 a->SizeOfStackCommit =
502 GET_OPTHDR_SIZE_OF_STACK_COMMIT (abfd, src->SizeOfStackCommit);
503 a->SizeOfHeapReserve =
504 GET_OPTHDR_SIZE_OF_HEAP_RESERVE (abfd, src->SizeOfHeapReserve);
505 a->SizeOfHeapCommit =
506 GET_OPTHDR_SIZE_OF_HEAP_COMMIT (abfd, src->SizeOfHeapCommit);
507 a->LoaderFlags = H_GET_32 (abfd, src->LoaderFlags);
508 a->NumberOfRvaAndSizes = H_GET_32 (abfd, src->NumberOfRvaAndSizes);
509
510 /* PR 17512: Don't blindly trust NumberOfRvaAndSizes. */
511 unsigned idx;
512 for (idx = 0;
513 idx < a->NumberOfRvaAndSizes && idx < IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
514 idx++)
515 {
516 /* If data directory is empty, rva also should be 0. */
517 int size = H_GET_32 (abfd, src->DataDirectory[idx][1]);
518 int vma = size ? H_GET_32 (abfd, src->DataDirectory[idx][0]) : 0;
519
520 a->DataDirectory[idx].Size = size;
521 a->DataDirectory[idx].VirtualAddress = vma;
522 }
523
524 while (idx < IMAGE_NUMBEROF_DIRECTORY_ENTRIES)
525 {
526 a->DataDirectory[idx].Size = 0;
527 a->DataDirectory[idx].VirtualAddress = 0;
528 idx++;
529 }
530
531 if (aouthdr_int->entry)
532 {
533 aouthdr_int->entry += a->ImageBase;
534 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
535 aouthdr_int->entry &= 0xffffffff;
536 #endif
537 }
538
539 if (aouthdr_int->tsize)
540 {
541 aouthdr_int->text_start += a->ImageBase;
542 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
543 aouthdr_int->text_start &= 0xffffffff;
544 #endif
545 }
546
547 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
548 /* PE32+ does not have data_start member! */
549 if (aouthdr_int->dsize)
550 {
551 aouthdr_int->data_start += a->ImageBase;
552 aouthdr_int->data_start &= 0xffffffff;
553 }
554 #endif
555 }
556
557 /* A support function for below. */
558
559 static void
560 add_data_entry (bfd * abfd,
561 struct internal_extra_pe_aouthdr *aout,
562 int idx,
563 char *name,
564 bfd_vma base)
565 {
566 asection *sec = bfd_get_section_by_name (abfd, name);
567
568 /* Add import directory information if it exists. */
569 if ((sec != NULL)
570 && (coff_section_data (abfd, sec) != NULL)
571 && (pei_section_data (abfd, sec) != NULL))
572 {
573 /* If data directory is empty, rva also should be 0. */
574 int size = pei_section_data (abfd, sec)->virt_size;
575 aout->DataDirectory[idx].Size = size;
576
577 if (size)
578 {
579 aout->DataDirectory[idx].VirtualAddress =
580 (sec->vma - base) & 0xffffffff;
581 sec->flags |= SEC_DATA;
582 }
583 }
584 }
585
586 unsigned int
587 _bfd_XXi_swap_aouthdr_out (bfd * abfd, void * in, void * out)
588 {
589 struct internal_aouthdr *aouthdr_in = (struct internal_aouthdr *) in;
590 pe_data_type *pe = pe_data (abfd);
591 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
592 PEAOUTHDR *aouthdr_out = (PEAOUTHDR *) out;
593 bfd_vma sa, fa, ib;
594 IMAGE_DATA_DIRECTORY idata2, idata5, tls;
595
596 sa = extra->SectionAlignment;
597 fa = extra->FileAlignment;
598 ib = extra->ImageBase;
599
600 idata2 = pe->pe_opthdr.DataDirectory[PE_IMPORT_TABLE];
601 idata5 = pe->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE];
602 tls = pe->pe_opthdr.DataDirectory[PE_TLS_TABLE];
603
604 if (aouthdr_in->tsize)
605 {
606 aouthdr_in->text_start -= ib;
607 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
608 aouthdr_in->text_start &= 0xffffffff;
609 #endif
610 }
611
612 if (aouthdr_in->dsize)
613 {
614 aouthdr_in->data_start -= ib;
615 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
616 aouthdr_in->data_start &= 0xffffffff;
617 #endif
618 }
619
620 if (aouthdr_in->entry)
621 {
622 aouthdr_in->entry -= ib;
623 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
624 aouthdr_in->entry &= 0xffffffff;
625 #endif
626 }
627
628 #define FA(x) (((x) + fa -1 ) & (- fa))
629 #define SA(x) (((x) + sa -1 ) & (- sa))
630
631 /* We like to have the sizes aligned. */
632 aouthdr_in->bsize = FA (aouthdr_in->bsize);
633
634 extra->NumberOfRvaAndSizes = IMAGE_NUMBEROF_DIRECTORY_ENTRIES;
635
636 add_data_entry (abfd, extra, PE_EXPORT_TABLE, ".edata", ib);
637 add_data_entry (abfd, extra, PE_RESOURCE_TABLE, ".rsrc", ib);
638 add_data_entry (abfd, extra, PE_EXCEPTION_TABLE, ".pdata", ib);
639
640 /* In theory we do not need to call add_data_entry for .idata$2 or
641 .idata$5. It will be done in bfd_coff_final_link where all the
642 required information is available. If however, we are not going
643 to perform a final link, eg because we have been invoked by objcopy
644 or strip, then we need to make sure that these Data Directory
645 entries are initialised properly.
646
647 So - we copy the input values into the output values, and then, if
648 a final link is going to be performed, it can overwrite them. */
649 extra->DataDirectory[PE_IMPORT_TABLE] = idata2;
650 extra->DataDirectory[PE_IMPORT_ADDRESS_TABLE] = idata5;
651 extra->DataDirectory[PE_TLS_TABLE] = tls;
652
653 if (extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress == 0)
654 /* Until other .idata fixes are made (pending patch), the entry for
655 .idata is needed for backwards compatibility. FIXME. */
656 add_data_entry (abfd, extra, PE_IMPORT_TABLE, ".idata", ib);
657
658 /* For some reason, the virtual size (which is what's set by
659 add_data_entry) for .reloc is not the same as the size recorded
660 in this slot by MSVC; it doesn't seem to cause problems (so far),
661 but since it's the best we've got, use it. It does do the right
662 thing for .pdata. */
663 if (pe->has_reloc_section)
664 add_data_entry (abfd, extra, PE_BASE_RELOCATION_TABLE, ".reloc", ib);
665
666 {
667 asection *sec;
668 bfd_vma hsize = 0;
669 bfd_vma dsize = 0;
670 bfd_vma isize = 0;
671 bfd_vma tsize = 0;
672
673 for (sec = abfd->sections; sec; sec = sec->next)
674 {
675 int rounded = FA (sec->size);
676
677 if (rounded == 0)
678 continue;
679
680 /* The first non-zero section filepos is the header size.
681 Sections without contents will have a filepos of 0. */
682 if (hsize == 0)
683 hsize = sec->filepos;
684 if (sec->flags & SEC_DATA)
685 dsize += rounded;
686 if (sec->flags & SEC_CODE)
687 tsize += rounded;
688 /* The image size is the total VIRTUAL size (which is what is
689 in the virt_size field). Files have been seen (from MSVC
690 5.0 link.exe) where the file size of the .data segment is
691 quite small compared to the virtual size. Without this
692 fix, strip munges the file.
693
694 FIXME: We need to handle holes between sections, which may
695 happpen when we covert from another format. We just use
696 the virtual address and virtual size of the last section
697 for the image size. */
698 if (coff_section_data (abfd, sec) != NULL
699 && pei_section_data (abfd, sec) != NULL)
700 isize = (sec->vma - extra->ImageBase
701 + SA (FA (pei_section_data (abfd, sec)->virt_size)));
702 }
703
704 aouthdr_in->dsize = dsize;
705 aouthdr_in->tsize = tsize;
706 extra->SizeOfHeaders = hsize;
707 extra->SizeOfImage = isize;
708 }
709
710 H_PUT_16 (abfd, aouthdr_in->magic, aouthdr_out->standard.magic);
711
712 if (extra->MajorLinkerVersion || extra->MinorLinkerVersion)
713 {
714 H_PUT_8 (abfd, extra->MajorLinkerVersion,
715 aouthdr_out->standard.vstamp);
716 H_PUT_8 (abfd, extra->MinorLinkerVersion,
717 aouthdr_out->standard.vstamp + 1);
718 }
719 else
720 {
721 /* e.g. 219510000 is linker version 2.19 */
722 #define LINKER_VERSION ((short) (BFD_VERSION / 1000000))
723
724 /* This piece of magic sets the "linker version" field to
725 LINKER_VERSION. */
726 H_PUT_16 (abfd, (LINKER_VERSION / 100 + (LINKER_VERSION % 100) * 256),
727 aouthdr_out->standard.vstamp);
728 }
729
730 PUT_AOUTHDR_TSIZE (abfd, aouthdr_in->tsize, aouthdr_out->standard.tsize);
731 PUT_AOUTHDR_DSIZE (abfd, aouthdr_in->dsize, aouthdr_out->standard.dsize);
732 PUT_AOUTHDR_BSIZE (abfd, aouthdr_in->bsize, aouthdr_out->standard.bsize);
733 PUT_AOUTHDR_ENTRY (abfd, aouthdr_in->entry, aouthdr_out->standard.entry);
734 PUT_AOUTHDR_TEXT_START (abfd, aouthdr_in->text_start,
735 aouthdr_out->standard.text_start);
736
737 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
738 /* PE32+ does not have data_start member! */
739 PUT_AOUTHDR_DATA_START (abfd, aouthdr_in->data_start,
740 aouthdr_out->standard.data_start);
741 #endif
742
743 PUT_OPTHDR_IMAGE_BASE (abfd, extra->ImageBase, aouthdr_out->ImageBase);
744 H_PUT_32 (abfd, extra->SectionAlignment, aouthdr_out->SectionAlignment);
745 H_PUT_32 (abfd, extra->FileAlignment, aouthdr_out->FileAlignment);
746 H_PUT_16 (abfd, extra->MajorOperatingSystemVersion,
747 aouthdr_out->MajorOperatingSystemVersion);
748 H_PUT_16 (abfd, extra->MinorOperatingSystemVersion,
749 aouthdr_out->MinorOperatingSystemVersion);
750 H_PUT_16 (abfd, extra->MajorImageVersion, aouthdr_out->MajorImageVersion);
751 H_PUT_16 (abfd, extra->MinorImageVersion, aouthdr_out->MinorImageVersion);
752 H_PUT_16 (abfd, extra->MajorSubsystemVersion,
753 aouthdr_out->MajorSubsystemVersion);
754 H_PUT_16 (abfd, extra->MinorSubsystemVersion,
755 aouthdr_out->MinorSubsystemVersion);
756 H_PUT_32 (abfd, extra->Reserved1, aouthdr_out->Reserved1);
757 H_PUT_32 (abfd, extra->SizeOfImage, aouthdr_out->SizeOfImage);
758 H_PUT_32 (abfd, extra->SizeOfHeaders, aouthdr_out->SizeOfHeaders);
759 H_PUT_32 (abfd, extra->CheckSum, aouthdr_out->CheckSum);
760 H_PUT_16 (abfd, extra->Subsystem, aouthdr_out->Subsystem);
761 H_PUT_16 (abfd, extra->DllCharacteristics, aouthdr_out->DllCharacteristics);
762 PUT_OPTHDR_SIZE_OF_STACK_RESERVE (abfd, extra->SizeOfStackReserve,
763 aouthdr_out->SizeOfStackReserve);
764 PUT_OPTHDR_SIZE_OF_STACK_COMMIT (abfd, extra->SizeOfStackCommit,
765 aouthdr_out->SizeOfStackCommit);
766 PUT_OPTHDR_SIZE_OF_HEAP_RESERVE (abfd, extra->SizeOfHeapReserve,
767 aouthdr_out->SizeOfHeapReserve);
768 PUT_OPTHDR_SIZE_OF_HEAP_COMMIT (abfd, extra->SizeOfHeapCommit,
769 aouthdr_out->SizeOfHeapCommit);
770 H_PUT_32 (abfd, extra->LoaderFlags, aouthdr_out->LoaderFlags);
771 H_PUT_32 (abfd, extra->NumberOfRvaAndSizes,
772 aouthdr_out->NumberOfRvaAndSizes);
773 {
774 int idx;
775
776 for (idx = 0; idx < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; idx++)
777 {
778 H_PUT_32 (abfd, extra->DataDirectory[idx].VirtualAddress,
779 aouthdr_out->DataDirectory[idx][0]);
780 H_PUT_32 (abfd, extra->DataDirectory[idx].Size,
781 aouthdr_out->DataDirectory[idx][1]);
782 }
783 }
784
785 return AOUTSZ;
786 }
787
788 unsigned int
789 _bfd_XXi_only_swap_filehdr_out (bfd * abfd, void * in, void * out)
790 {
791 int idx;
792 struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
793 struct external_PEI_filehdr *filehdr_out = (struct external_PEI_filehdr *) out;
794
795 if (pe_data (abfd)->has_reloc_section
796 || pe_data (abfd)->dont_strip_reloc)
797 filehdr_in->f_flags &= ~F_RELFLG;
798
799 if (pe_data (abfd)->dll)
800 filehdr_in->f_flags |= F_DLL;
801
802 filehdr_in->pe.e_magic = IMAGE_DOS_SIGNATURE;
803 filehdr_in->pe.e_cblp = 0x90;
804 filehdr_in->pe.e_cp = 0x3;
805 filehdr_in->pe.e_crlc = 0x0;
806 filehdr_in->pe.e_cparhdr = 0x4;
807 filehdr_in->pe.e_minalloc = 0x0;
808 filehdr_in->pe.e_maxalloc = 0xffff;
809 filehdr_in->pe.e_ss = 0x0;
810 filehdr_in->pe.e_sp = 0xb8;
811 filehdr_in->pe.e_csum = 0x0;
812 filehdr_in->pe.e_ip = 0x0;
813 filehdr_in->pe.e_cs = 0x0;
814 filehdr_in->pe.e_lfarlc = 0x40;
815 filehdr_in->pe.e_ovno = 0x0;
816
817 for (idx = 0; idx < 4; idx++)
818 filehdr_in->pe.e_res[idx] = 0x0;
819
820 filehdr_in->pe.e_oemid = 0x0;
821 filehdr_in->pe.e_oeminfo = 0x0;
822
823 for (idx = 0; idx < 10; idx++)
824 filehdr_in->pe.e_res2[idx] = 0x0;
825
826 filehdr_in->pe.e_lfanew = 0x80;
827
828 /* This next collection of data are mostly just characters. It
829 appears to be constant within the headers put on NT exes. */
830 memcpy (filehdr_in->pe.dos_message, pe_data (abfd)->dos_message,
831 sizeof (filehdr_in->pe.dos_message));
832
833 filehdr_in->pe.nt_signature = IMAGE_NT_SIGNATURE;
834
835 H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->f_magic);
836 H_PUT_16 (abfd, filehdr_in->f_nscns, filehdr_out->f_nscns);
837
838 /* Use a real timestamp by default, unless the no-insert-timestamp
839 option was chosen. */
840 if ((pe_data (abfd)->timestamp) == -1)
841 {
842 time_t now = bfd_get_current_time (0);
843 H_PUT_32 (abfd, now, filehdr_out->f_timdat);
844 }
845 else
846 H_PUT_32 (abfd, pe_data (abfd)->timestamp, filehdr_out->f_timdat);
847
848 PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr,
849 filehdr_out->f_symptr);
850 H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->f_nsyms);
851 H_PUT_16 (abfd, filehdr_in->f_opthdr, filehdr_out->f_opthdr);
852 H_PUT_16 (abfd, filehdr_in->f_flags, filehdr_out->f_flags);
853
854 /* Put in extra dos header stuff. This data remains essentially
855 constant, it just has to be tacked on to the beginning of all exes
856 for NT. */
857 H_PUT_16 (abfd, filehdr_in->pe.e_magic, filehdr_out->e_magic);
858 H_PUT_16 (abfd, filehdr_in->pe.e_cblp, filehdr_out->e_cblp);
859 H_PUT_16 (abfd, filehdr_in->pe.e_cp, filehdr_out->e_cp);
860 H_PUT_16 (abfd, filehdr_in->pe.e_crlc, filehdr_out->e_crlc);
861 H_PUT_16 (abfd, filehdr_in->pe.e_cparhdr, filehdr_out->e_cparhdr);
862 H_PUT_16 (abfd, filehdr_in->pe.e_minalloc, filehdr_out->e_minalloc);
863 H_PUT_16 (abfd, filehdr_in->pe.e_maxalloc, filehdr_out->e_maxalloc);
864 H_PUT_16 (abfd, filehdr_in->pe.e_ss, filehdr_out->e_ss);
865 H_PUT_16 (abfd, filehdr_in->pe.e_sp, filehdr_out->e_sp);
866 H_PUT_16 (abfd, filehdr_in->pe.e_csum, filehdr_out->e_csum);
867 H_PUT_16 (abfd, filehdr_in->pe.e_ip, filehdr_out->e_ip);
868 H_PUT_16 (abfd, filehdr_in->pe.e_cs, filehdr_out->e_cs);
869 H_PUT_16 (abfd, filehdr_in->pe.e_lfarlc, filehdr_out->e_lfarlc);
870 H_PUT_16 (abfd, filehdr_in->pe.e_ovno, filehdr_out->e_ovno);
871
872 for (idx = 0; idx < 4; idx++)
873 H_PUT_16 (abfd, filehdr_in->pe.e_res[idx], filehdr_out->e_res[idx]);
874
875 H_PUT_16 (abfd, filehdr_in->pe.e_oemid, filehdr_out->e_oemid);
876 H_PUT_16 (abfd, filehdr_in->pe.e_oeminfo, filehdr_out->e_oeminfo);
877
878 for (idx = 0; idx < 10; idx++)
879 H_PUT_16 (abfd, filehdr_in->pe.e_res2[idx], filehdr_out->e_res2[idx]);
880
881 H_PUT_32 (abfd, filehdr_in->pe.e_lfanew, filehdr_out->e_lfanew);
882
883 memcpy (filehdr_out->dos_message, filehdr_in->pe.dos_message,
884 sizeof (filehdr_out->dos_message));
885
886 /* Also put in the NT signature. */
887 H_PUT_32 (abfd, filehdr_in->pe.nt_signature, filehdr_out->nt_signature);
888
889 return FILHSZ;
890 }
891
892 unsigned int
893 _bfd_XX_only_swap_filehdr_out (bfd * abfd, void * in, void * out)
894 {
895 struct internal_filehdr *filehdr_in = (struct internal_filehdr *) in;
896 FILHDR *filehdr_out = (FILHDR *) out;
897
898 H_PUT_16 (abfd, filehdr_in->f_magic, filehdr_out->f_magic);
899 H_PUT_16 (abfd, filehdr_in->f_nscns, filehdr_out->f_nscns);
900 H_PUT_32 (abfd, filehdr_in->f_timdat, filehdr_out->f_timdat);
901 PUT_FILEHDR_SYMPTR (abfd, filehdr_in->f_symptr, filehdr_out->f_symptr);
902 H_PUT_32 (abfd, filehdr_in->f_nsyms, filehdr_out->f_nsyms);
903 H_PUT_16 (abfd, filehdr_in->f_opthdr, filehdr_out->f_opthdr);
904 H_PUT_16 (abfd, filehdr_in->f_flags, filehdr_out->f_flags);
905
906 return FILHSZ;
907 }
908
909 unsigned int
910 _bfd_XXi_swap_scnhdr_out (bfd * abfd, void * in, void * out)
911 {
912 struct internal_scnhdr *scnhdr_int = (struct internal_scnhdr *) in;
913 SCNHDR *scnhdr_ext = (SCNHDR *) out;
914 unsigned int ret = SCNHSZ;
915 bfd_vma ps;
916 bfd_vma ss;
917
918 memcpy (scnhdr_ext->s_name, scnhdr_int->s_name, sizeof (scnhdr_int->s_name));
919
920 ss = scnhdr_int->s_vaddr - pe_data (abfd)->pe_opthdr.ImageBase;
921 if (scnhdr_int->s_vaddr < pe_data (abfd)->pe_opthdr.ImageBase)
922 _bfd_error_handler (_("%pB:%.8s: section below image base"),
923 abfd, scnhdr_int->s_name);
924 /* Do not compare lower 32-bits for 64-bit vma. */
925 #if !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
926 else if(ss != (ss & 0xffffffff))
927 _bfd_error_handler (_("%pB:%.8s: RVA truncated"), abfd, scnhdr_int->s_name);
928 PUT_SCNHDR_VADDR (abfd, ss & 0xffffffff, scnhdr_ext->s_vaddr);
929 #else
930 PUT_SCNHDR_VADDR (abfd, ss, scnhdr_ext->s_vaddr);
931 #endif
932
933 /* NT wants the size data to be rounded up to the next
934 NT_FILE_ALIGNMENT, but zero if it has no content (as in .bss,
935 sometimes). */
936 if ((scnhdr_int->s_flags & IMAGE_SCN_CNT_UNINITIALIZED_DATA) != 0)
937 {
938 if (bfd_pei_p (abfd))
939 {
940 ps = scnhdr_int->s_size;
941 ss = 0;
942 }
943 else
944 {
945 ps = 0;
946 ss = scnhdr_int->s_size;
947 }
948 }
949 else
950 {
951 if (bfd_pei_p (abfd))
952 ps = scnhdr_int->s_paddr;
953 else
954 ps = 0;
955
956 ss = scnhdr_int->s_size;
957 }
958
959 PUT_SCNHDR_SIZE (abfd, ss,
960 scnhdr_ext->s_size);
961
962 /* s_paddr in PE is really the virtual size. */
963 PUT_SCNHDR_PADDR (abfd, ps, scnhdr_ext->s_paddr);
964
965 PUT_SCNHDR_SCNPTR (abfd, scnhdr_int->s_scnptr,
966 scnhdr_ext->s_scnptr);
967 PUT_SCNHDR_RELPTR (abfd, scnhdr_int->s_relptr,
968 scnhdr_ext->s_relptr);
969 PUT_SCNHDR_LNNOPTR (abfd, scnhdr_int->s_lnnoptr,
970 scnhdr_ext->s_lnnoptr);
971
972 {
973 /* Extra flags must be set when dealing with PE. All sections should also
974 have the IMAGE_SCN_MEM_READ (0x40000000) flag set. In addition, the
975 .text section must have IMAGE_SCN_MEM_EXECUTE (0x20000000) and the data
976 sections (.idata, .data, .bss, .CRT) must have IMAGE_SCN_MEM_WRITE set
977 (this is especially important when dealing with the .idata section since
978 the addresses for routines from .dlls must be overwritten). If .reloc
979 section data is ever generated, we must add IMAGE_SCN_MEM_DISCARDABLE
980 (0x02000000). Also, the resource data should also be read and
981 writable. */
982
983 /* FIXME: Alignment is also encoded in this field, at least on
984 ARM-WINCE. Although - how do we get the original alignment field
985 back ? */
986
987 typedef struct
988 {
989 char section_name[SCNNMLEN];
990 unsigned long must_have;
991 }
992 pe_required_section_flags;
993
994 pe_required_section_flags known_sections [] =
995 {
996 { ".arch", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE | IMAGE_SCN_ALIGN_8BYTES },
997 { ".bss", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_UNINITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
998 { ".data", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
999 { ".edata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
1000 { ".idata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
1001 { ".pdata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
1002 { ".rdata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
1003 { ".reloc", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_DISCARDABLE },
1004 { ".rsrc", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
1005 { ".text" , IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE },
1006 { ".tls", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_WRITE },
1007 { ".xdata", IMAGE_SCN_MEM_READ | IMAGE_SCN_CNT_INITIALIZED_DATA },
1008 };
1009
1010 pe_required_section_flags * p;
1011
1012 /* We have defaulted to adding the IMAGE_SCN_MEM_WRITE flag, but now
1013 we know exactly what this specific section wants so we remove it
1014 and then allow the must_have field to add it back in if necessary.
1015 However, we don't remove IMAGE_SCN_MEM_WRITE flag from .text if the
1016 default WP_TEXT file flag has been cleared. WP_TEXT may be cleared
1017 by ld --enable-auto-import (if auto-import is actually needed),
1018 by ld --omagic, or by obcopy --writable-text. */
1019
1020 for (p = known_sections;
1021 p < known_sections + ARRAY_SIZE (known_sections);
1022 p++)
1023 if (memcmp (scnhdr_int->s_name, p->section_name, SCNNMLEN) == 0)
1024 {
1025 if (memcmp (scnhdr_int->s_name, ".text", sizeof ".text")
1026 || (bfd_get_file_flags (abfd) & WP_TEXT))
1027 scnhdr_int->s_flags &= ~IMAGE_SCN_MEM_WRITE;
1028 scnhdr_int->s_flags |= p->must_have;
1029 break;
1030 }
1031
1032 H_PUT_32 (abfd, scnhdr_int->s_flags, scnhdr_ext->s_flags);
1033 }
1034
1035 if (coff_data (abfd)->link_info
1036 && ! bfd_link_relocatable (coff_data (abfd)->link_info)
1037 && ! bfd_link_pic (coff_data (abfd)->link_info)
1038 && memcmp (scnhdr_int->s_name, ".text", sizeof ".text") == 0)
1039 {
1040 /* By inference from looking at MS output, the 32 bit field
1041 which is the combination of the number_of_relocs and
1042 number_of_linenos is used for the line number count in
1043 executables. A 16-bit field won't do for cc1. The MS
1044 document says that the number of relocs is zero for
1045 executables, but the 17-th bit has been observed to be there.
1046 Overflow is not an issue: a 4G-line program will overflow a
1047 bunch of other fields long before this! */
1048 H_PUT_16 (abfd, (scnhdr_int->s_nlnno & 0xffff), scnhdr_ext->s_nlnno);
1049 H_PUT_16 (abfd, (scnhdr_int->s_nlnno >> 16), scnhdr_ext->s_nreloc);
1050 }
1051 else
1052 {
1053 if (scnhdr_int->s_nlnno <= 0xffff)
1054 H_PUT_16 (abfd, scnhdr_int->s_nlnno, scnhdr_ext->s_nlnno);
1055 else
1056 {
1057 /* xgettext:c-format */
1058 _bfd_error_handler (_("%pB: line number overflow: 0x%lx > 0xffff"),
1059 abfd, scnhdr_int->s_nlnno);
1060 bfd_set_error (bfd_error_file_truncated);
1061 H_PUT_16 (abfd, 0xffff, scnhdr_ext->s_nlnno);
1062 ret = 0;
1063 }
1064
1065 /* Although we could encode 0xffff relocs here, we do not, to be
1066 consistent with other parts of bfd. Also it lets us warn, as
1067 we should never see 0xffff here w/o having the overflow flag
1068 set. */
1069 if (scnhdr_int->s_nreloc < 0xffff)
1070 H_PUT_16 (abfd, scnhdr_int->s_nreloc, scnhdr_ext->s_nreloc);
1071 else
1072 {
1073 /* PE can deal with large #s of relocs, but not here. */
1074 H_PUT_16 (abfd, 0xffff, scnhdr_ext->s_nreloc);
1075 scnhdr_int->s_flags |= IMAGE_SCN_LNK_NRELOC_OVFL;
1076 H_PUT_32 (abfd, scnhdr_int->s_flags, scnhdr_ext->s_flags);
1077 }
1078 }
1079 return ret;
1080 }
1081
1082 void
1083 _bfd_XXi_swap_debugdir_in (bfd * abfd, void * ext1, void * in1)
1084 {
1085 struct external_IMAGE_DEBUG_DIRECTORY *ext = (struct external_IMAGE_DEBUG_DIRECTORY *) ext1;
1086 struct internal_IMAGE_DEBUG_DIRECTORY *in = (struct internal_IMAGE_DEBUG_DIRECTORY *) in1;
1087
1088 in->Characteristics = H_GET_32(abfd, ext->Characteristics);
1089 in->TimeDateStamp = H_GET_32(abfd, ext->TimeDateStamp);
1090 in->MajorVersion = H_GET_16(abfd, ext->MajorVersion);
1091 in->MinorVersion = H_GET_16(abfd, ext->MinorVersion);
1092 in->Type = H_GET_32(abfd, ext->Type);
1093 in->SizeOfData = H_GET_32(abfd, ext->SizeOfData);
1094 in->AddressOfRawData = H_GET_32(abfd, ext->AddressOfRawData);
1095 in->PointerToRawData = H_GET_32(abfd, ext->PointerToRawData);
1096 }
1097
1098 unsigned int
1099 _bfd_XXi_swap_debugdir_out (bfd * abfd, void * inp, void * extp)
1100 {
1101 struct external_IMAGE_DEBUG_DIRECTORY *ext = (struct external_IMAGE_DEBUG_DIRECTORY *) extp;
1102 struct internal_IMAGE_DEBUG_DIRECTORY *in = (struct internal_IMAGE_DEBUG_DIRECTORY *) inp;
1103
1104 H_PUT_32(abfd, in->Characteristics, ext->Characteristics);
1105 H_PUT_32(abfd, in->TimeDateStamp, ext->TimeDateStamp);
1106 H_PUT_16(abfd, in->MajorVersion, ext->MajorVersion);
1107 H_PUT_16(abfd, in->MinorVersion, ext->MinorVersion);
1108 H_PUT_32(abfd, in->Type, ext->Type);
1109 H_PUT_32(abfd, in->SizeOfData, ext->SizeOfData);
1110 H_PUT_32(abfd, in->AddressOfRawData, ext->AddressOfRawData);
1111 H_PUT_32(abfd, in->PointerToRawData, ext->PointerToRawData);
1112
1113 return sizeof (struct external_IMAGE_DEBUG_DIRECTORY);
1114 }
1115
1116 CODEVIEW_INFO *
1117 _bfd_XXi_slurp_codeview_record (bfd * abfd, file_ptr where, unsigned long length, CODEVIEW_INFO *cvinfo,
1118 char **pdb)
1119 {
1120 char buffer[256+1];
1121 bfd_size_type nread;
1122
1123 if (bfd_seek (abfd, where, SEEK_SET) != 0)
1124 return NULL;
1125
1126 if (length <= sizeof (CV_INFO_PDB70) && length <= sizeof (CV_INFO_PDB20))
1127 return NULL;
1128 if (length > 256)
1129 length = 256;
1130 nread = bfd_read (buffer, length, abfd);
1131 if (length != nread)
1132 return NULL;
1133
1134 /* Ensure null termination of filename. */
1135 memset (buffer + nread, 0, sizeof (buffer) - nread);
1136
1137 cvinfo->CVSignature = H_GET_32 (abfd, buffer);
1138 cvinfo->Age = 0;
1139
1140 if ((cvinfo->CVSignature == CVINFO_PDB70_CVSIGNATURE)
1141 && (length > sizeof (CV_INFO_PDB70)))
1142 {
1143 CV_INFO_PDB70 *cvinfo70 = (CV_INFO_PDB70 *)(buffer);
1144
1145 cvinfo->Age = H_GET_32(abfd, cvinfo70->Age);
1146
1147 /* A GUID consists of 4,2,2 byte values in little-endian order, followed
1148 by 8 single bytes. Byte swap them so we can conveniently treat the GUID
1149 as 16 bytes in big-endian order. */
1150 bfd_putb32 (bfd_getl32 (cvinfo70->Signature), cvinfo->Signature);
1151 bfd_putb16 (bfd_getl16 (&(cvinfo70->Signature[4])), &(cvinfo->Signature[4]));
1152 bfd_putb16 (bfd_getl16 (&(cvinfo70->Signature[6])), &(cvinfo->Signature[6]));
1153 memcpy (&(cvinfo->Signature[8]), &(cvinfo70->Signature[8]), 8);
1154
1155 cvinfo->SignatureLength = CV_INFO_SIGNATURE_LENGTH;
1156 /* cvinfo->PdbFileName = cvinfo70->PdbFileName; */
1157
1158 if (pdb)
1159 *pdb = xstrdup (cvinfo70->PdbFileName);
1160
1161 return cvinfo;
1162 }
1163 else if ((cvinfo->CVSignature == CVINFO_PDB20_CVSIGNATURE)
1164 && (length > sizeof (CV_INFO_PDB20)))
1165 {
1166 CV_INFO_PDB20 *cvinfo20 = (CV_INFO_PDB20 *)(buffer);
1167 cvinfo->Age = H_GET_32(abfd, cvinfo20->Age);
1168 memcpy (cvinfo->Signature, cvinfo20->Signature, 4);
1169 cvinfo->SignatureLength = 4;
1170 /* cvinfo->PdbFileName = cvinfo20->PdbFileName; */
1171
1172 if (pdb)
1173 *pdb = xstrdup (cvinfo20->PdbFileName);
1174
1175 return cvinfo;
1176 }
1177
1178 return NULL;
1179 }
1180
1181 unsigned int
1182 _bfd_XXi_write_codeview_record (bfd * abfd, file_ptr where, CODEVIEW_INFO *cvinfo,
1183 const char *pdb)
1184 {
1185 size_t pdb_len = pdb ? strlen (pdb) : 0;
1186 const bfd_size_type size = sizeof (CV_INFO_PDB70) + pdb_len + 1;
1187 bfd_size_type written;
1188 CV_INFO_PDB70 *cvinfo70;
1189 char * buffer;
1190
1191 if (bfd_seek (abfd, where, SEEK_SET) != 0)
1192 return 0;
1193
1194 buffer = bfd_malloc (size);
1195 if (buffer == NULL)
1196 return 0;
1197
1198 cvinfo70 = (CV_INFO_PDB70 *) buffer;
1199 H_PUT_32 (abfd, CVINFO_PDB70_CVSIGNATURE, cvinfo70->CvSignature);
1200
1201 /* Byte swap the GUID from 16 bytes in big-endian order to 4,2,2 byte values
1202 in little-endian order, followed by 8 single bytes. */
1203 bfd_putl32 (bfd_getb32 (cvinfo->Signature), cvinfo70->Signature);
1204 bfd_putl16 (bfd_getb16 (&(cvinfo->Signature[4])), &(cvinfo70->Signature[4]));
1205 bfd_putl16 (bfd_getb16 (&(cvinfo->Signature[6])), &(cvinfo70->Signature[6]));
1206 memcpy (&(cvinfo70->Signature[8]), &(cvinfo->Signature[8]), 8);
1207
1208 H_PUT_32 (abfd, cvinfo->Age, cvinfo70->Age);
1209
1210 if (pdb == NULL)
1211 cvinfo70->PdbFileName[0] = '\0';
1212 else
1213 memcpy (cvinfo70->PdbFileName, pdb, pdb_len + 1);
1214
1215 written = bfd_write (buffer, size, abfd);
1216
1217 free (buffer);
1218
1219 return written == size ? size : 0;
1220 }
1221
1222 static char * dir_names[IMAGE_NUMBEROF_DIRECTORY_ENTRIES] =
1223 {
1224 N_("Export Directory [.edata (or where ever we found it)]"),
1225 N_("Import Directory [parts of .idata]"),
1226 N_("Resource Directory [.rsrc]"),
1227 N_("Exception Directory [.pdata]"),
1228 N_("Security Directory"),
1229 N_("Base Relocation Directory [.reloc]"),
1230 N_("Debug Directory"),
1231 N_("Description Directory"),
1232 N_("Special Directory"),
1233 N_("Thread Storage Directory [.tls]"),
1234 N_("Load Configuration Directory"),
1235 N_("Bound Import Directory"),
1236 N_("Import Address Table Directory"),
1237 N_("Delay Import Directory"),
1238 N_("CLR Runtime Header"),
1239 N_("Reserved")
1240 };
1241
1242 static bool
1243 get_contents_sanity_check (bfd *abfd, asection *section,
1244 bfd_size_type dataoff, bfd_size_type datasize)
1245 {
1246 if ((section->flags & SEC_HAS_CONTENTS) == 0)
1247 return false;
1248 if (dataoff > section->size
1249 || datasize > section->size - dataoff)
1250 return false;
1251 ufile_ptr filesize = bfd_get_file_size (abfd);
1252 if (filesize != 0
1253 && ((ufile_ptr) section->filepos > filesize
1254 || dataoff > filesize - section->filepos
1255 || datasize > filesize - section->filepos - dataoff))
1256 return false;
1257 return true;
1258 }
1259
1260 static bool
1261 pe_print_idata (bfd * abfd, void * vfile)
1262 {
1263 FILE *file = (FILE *) vfile;
1264 bfd_byte *data;
1265 asection *section;
1266 bfd_signed_vma adj;
1267 bfd_size_type datasize = 0;
1268 bfd_size_type dataoff;
1269 bfd_size_type i;
1270 int onaline = 20;
1271
1272 pe_data_type *pe = pe_data (abfd);
1273 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1274
1275 bfd_vma addr;
1276
1277 addr = extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress;
1278
1279 if (addr == 0 && extra->DataDirectory[PE_IMPORT_TABLE].Size == 0)
1280 {
1281 /* Maybe the extra header isn't there. Look for the section. */
1282 section = bfd_get_section_by_name (abfd, ".idata");
1283 if (section == NULL || (section->flags & SEC_HAS_CONTENTS) == 0)
1284 return true;
1285
1286 addr = section->vma;
1287 datasize = section->size;
1288 if (datasize == 0)
1289 return true;
1290 }
1291 else
1292 {
1293 addr += extra->ImageBase;
1294 for (section = abfd->sections; section != NULL; section = section->next)
1295 {
1296 datasize = section->size;
1297 if (addr >= section->vma && addr < section->vma + datasize)
1298 break;
1299 }
1300
1301 if (section == NULL)
1302 {
1303 fprintf (file,
1304 _("\nThere is an import table, but the section containing it could not be found\n"));
1305 return true;
1306 }
1307 else if (!(section->flags & SEC_HAS_CONTENTS))
1308 {
1309 fprintf (file,
1310 _("\nThere is an import table in %s, but that section has no contents\n"),
1311 section->name);
1312 return true;
1313 }
1314 }
1315
1316 /* xgettext:c-format */
1317 fprintf (file, _("\nThere is an import table in %s at 0x%lx\n"),
1318 section->name, (unsigned long) addr);
1319
1320 dataoff = addr - section->vma;
1321
1322 fprintf (file,
1323 _("\nThe Import Tables (interpreted %s section contents)\n"),
1324 section->name);
1325 fprintf (file,
1326 _("\
1327 vma: Hint Time Forward DLL First\n\
1328 Table Stamp Chain Name Thunk\n"));
1329
1330 /* Read the whole section. Some of the fields might be before dataoff. */
1331 if (!bfd_malloc_and_get_section (abfd, section, &data))
1332 {
1333 free (data);
1334 return false;
1335 }
1336
1337 adj = section->vma - extra->ImageBase;
1338
1339 /* Print all image import descriptors. */
1340 for (i = dataoff; i + onaline <= datasize; i += onaline)
1341 {
1342 bfd_vma hint_addr;
1343 bfd_vma time_stamp;
1344 bfd_vma forward_chain;
1345 bfd_vma dll_name;
1346 bfd_vma first_thunk;
1347 int idx = 0;
1348 bfd_size_type j;
1349 char *dll;
1350
1351 /* Print (i + extra->DataDirectory[PE_IMPORT_TABLE].VirtualAddress). */
1352 fprintf (file, " %08lx\t", (unsigned long) (i + adj));
1353 hint_addr = bfd_get_32 (abfd, data + i);
1354 time_stamp = bfd_get_32 (abfd, data + i + 4);
1355 forward_chain = bfd_get_32 (abfd, data + i + 8);
1356 dll_name = bfd_get_32 (abfd, data + i + 12);
1357 first_thunk = bfd_get_32 (abfd, data + i + 16);
1358
1359 fprintf (file, "%08lx %08lx %08lx %08lx %08lx\n",
1360 (unsigned long) hint_addr,
1361 (unsigned long) time_stamp,
1362 (unsigned long) forward_chain,
1363 (unsigned long) dll_name,
1364 (unsigned long) first_thunk);
1365
1366 if (hint_addr == 0 && first_thunk == 0)
1367 break;
1368
1369 if (dll_name - adj >= section->size)
1370 break;
1371
1372 dll = (char *) data + dll_name - adj;
1373 /* PR 17512 file: 078-12277-0.004. */
1374 bfd_size_type maxlen = (char *)(data + datasize) - dll - 1;
1375 fprintf (file, _("\n\tDLL Name: %.*s\n"), (int) maxlen, dll);
1376
1377 /* PR 21546: When the Hint Address is zero,
1378 we try the First Thunk instead. */
1379 if (hint_addr == 0)
1380 hint_addr = first_thunk;
1381
1382 if (hint_addr != 0 && hint_addr - adj < datasize)
1383 {
1384 bfd_byte *ft_data;
1385 asection *ft_section;
1386 bfd_vma ft_addr;
1387 bfd_size_type ft_datasize;
1388 int ft_idx;
1389 int ft_allocated;
1390
1391 fprintf (file, _("\tvma: Hint/Ord Member-Name Bound-To\n"));
1392
1393 idx = hint_addr - adj;
1394
1395 ft_addr = first_thunk + extra->ImageBase;
1396 ft_idx = first_thunk - adj;
1397 ft_data = data + ft_idx;
1398 ft_datasize = datasize - ft_idx;
1399 ft_allocated = 0;
1400
1401 if (first_thunk != hint_addr)
1402 {
1403 /* Find the section which contains the first thunk. */
1404 for (ft_section = abfd->sections;
1405 ft_section != NULL;
1406 ft_section = ft_section->next)
1407 {
1408 if (ft_addr >= ft_section->vma
1409 && ft_addr < ft_section->vma + ft_section->size)
1410 break;
1411 }
1412
1413 if (ft_section == NULL)
1414 {
1415 fprintf (file,
1416 _("\nThere is a first thunk, but the section containing it could not be found\n"));
1417 continue;
1418 }
1419
1420 /* Now check to see if this section is the same as our current
1421 section. If it is not then we will have to load its data in. */
1422 if (ft_section != section)
1423 {
1424 ft_idx = first_thunk - (ft_section->vma - extra->ImageBase);
1425 ft_datasize = ft_section->size - ft_idx;
1426 if (!get_contents_sanity_check (abfd, ft_section,
1427 ft_idx, ft_datasize))
1428 continue;
1429 ft_data = (bfd_byte *) bfd_malloc (ft_datasize);
1430 if (ft_data == NULL)
1431 continue;
1432
1433 /* Read ft_datasize bytes starting at offset ft_idx. */
1434 if (!bfd_get_section_contents (abfd, ft_section, ft_data,
1435 (bfd_vma) ft_idx, ft_datasize))
1436 {
1437 free (ft_data);
1438 continue;
1439 }
1440 ft_allocated = 1;
1441 }
1442 }
1443
1444 /* Print HintName vector entries. */
1445 #ifdef COFF_WITH_pex64
1446 for (j = 0; idx + j + 8 <= datasize; j += 8)
1447 {
1448 bfd_size_type amt;
1449 unsigned long member = bfd_get_32 (abfd, data + idx + j);
1450 unsigned long member_high = bfd_get_32 (abfd, data + idx + j + 4);
1451
1452 if (!member && !member_high)
1453 break;
1454
1455 amt = member - adj;
1456
1457 if (HighBitSet (member_high))
1458 fprintf (file, "\t%lx%08lx\t %4lx%08lx <none>",
1459 member_high, member,
1460 WithoutHighBit (member_high), member);
1461 /* PR binutils/17512: Handle corrupt PE data. */
1462 else if (amt >= datasize || amt + 2 >= datasize)
1463 fprintf (file, _("\t<corrupt: 0x%04lx>"), member);
1464 else
1465 {
1466 int ordinal;
1467 char *member_name;
1468
1469 ordinal = bfd_get_16 (abfd, data + amt);
1470 member_name = (char *) data + amt + 2;
1471 fprintf (file, "\t%04lx\t %4d %.*s",member, ordinal,
1472 (int) (datasize - (amt + 2)), member_name);
1473 }
1474
1475 /* If the time stamp is not zero, the import address
1476 table holds actual addresses. */
1477 if (time_stamp != 0
1478 && first_thunk != 0
1479 && first_thunk != hint_addr
1480 && j + 4 <= ft_datasize)
1481 fprintf (file, "\t%04lx",
1482 (unsigned long) bfd_get_32 (abfd, ft_data + j));
1483 fprintf (file, "\n");
1484 }
1485 #else
1486 for (j = 0; idx + j + 4 <= datasize; j += 4)
1487 {
1488 bfd_size_type amt;
1489 unsigned long member = bfd_get_32 (abfd, data + idx + j);
1490
1491 /* Print single IMAGE_IMPORT_BY_NAME vector. */
1492 if (member == 0)
1493 break;
1494
1495 amt = member - adj;
1496
1497 if (HighBitSet (member))
1498 fprintf (file, "\t%04lx\t %4lu <none>",
1499 member, WithoutHighBit (member));
1500 /* PR binutils/17512: Handle corrupt PE data. */
1501 else if (amt >= datasize || amt + 2 >= datasize)
1502 fprintf (file, _("\t<corrupt: 0x%04lx>"), member);
1503 else
1504 {
1505 int ordinal;
1506 char *member_name;
1507
1508 ordinal = bfd_get_16 (abfd, data + amt);
1509 member_name = (char *) data + amt + 2;
1510 fprintf (file, "\t%04lx\t %4d %.*s",
1511 member, ordinal,
1512 (int) (datasize - (amt + 2)), member_name);
1513 }
1514
1515 /* If the time stamp is not zero, the import address
1516 table holds actual addresses. */
1517 if (time_stamp != 0
1518 && first_thunk != 0
1519 && first_thunk != hint_addr
1520 && j + 4 <= ft_datasize)
1521 fprintf (file, "\t%04lx",
1522 (unsigned long) bfd_get_32 (abfd, ft_data + j));
1523
1524 fprintf (file, "\n");
1525 }
1526 #endif
1527 if (ft_allocated)
1528 free (ft_data);
1529 }
1530
1531 fprintf (file, "\n");
1532 }
1533
1534 free (data);
1535
1536 return true;
1537 }
1538
1539 static bool
1540 pe_print_edata (bfd * abfd, void * vfile)
1541 {
1542 FILE *file = (FILE *) vfile;
1543 bfd_byte *data;
1544 asection *section;
1545 bfd_size_type datasize = 0;
1546 bfd_size_type dataoff;
1547 bfd_size_type i;
1548 bfd_vma adj;
1549 struct EDT_type
1550 {
1551 long export_flags; /* Reserved - should be zero. */
1552 long time_stamp;
1553 short major_ver;
1554 short minor_ver;
1555 bfd_vma name; /* RVA - relative to image base. */
1556 long base; /* Ordinal base. */
1557 unsigned long num_functions;/* Number in the export address table. */
1558 unsigned long num_names; /* Number in the name pointer table. */
1559 bfd_vma eat_addr; /* RVA to the export address table. */
1560 bfd_vma npt_addr; /* RVA to the Export Name Pointer Table. */
1561 bfd_vma ot_addr; /* RVA to the Ordinal Table. */
1562 } edt;
1563
1564 pe_data_type *pe = pe_data (abfd);
1565 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
1566
1567 bfd_vma addr;
1568
1569 addr = extra->DataDirectory[PE_EXPORT_TABLE].VirtualAddress;
1570
1571 if (addr == 0 && extra->DataDirectory[PE_EXPORT_TABLE].Size == 0)
1572 {
1573 /* Maybe the extra header isn't there. Look for the section. */
1574 section = bfd_get_section_by_name (abfd, ".edata");
1575 if (section == NULL)
1576 return true;
1577
1578 addr = section->vma;
1579 dataoff = 0;
1580 datasize = section->size;
1581 if (datasize == 0)
1582 return true;
1583 }
1584 else
1585 {
1586 addr += extra->ImageBase;
1587
1588 for (section = abfd->sections; section != NULL; section = section->next)
1589 if (addr >= section->vma && addr < section->vma + section->size)
1590 break;
1591
1592 if (section == NULL)
1593 {
1594 fprintf (file,
1595 _("\nThere is an export table, but the section containing it could not be found\n"));
1596 return true;
1597 }
1598
1599 dataoff = addr - section->vma;
1600 datasize = extra->DataDirectory[PE_EXPORT_TABLE].Size;
1601 }
1602
1603 /* PR 17512: Handle corrupt PE binaries. */
1604 if (datasize < 40)
1605 {
1606 fprintf (file,
1607 /* xgettext:c-format */
1608 _("\nThere is an export table in %s, but it is too small (%d)\n"),
1609 section->name, (int) datasize);
1610 return true;
1611 }
1612
1613 if (!get_contents_sanity_check (abfd, section, dataoff, datasize))
1614 {
1615 fprintf (file,
1616 _("\nThere is an export table in %s, but contents cannot be read\n"),
1617 section->name);
1618 return true;
1619 }
1620
1621 /* xgettext:c-format */
1622 fprintf (file, _("\nThere is an export table in %s at 0x%lx\n"),
1623 section->name, (unsigned long) addr);
1624
1625 data = (bfd_byte *) bfd_malloc (datasize);
1626 if (data == NULL)
1627 return false;
1628
1629 if (! bfd_get_section_contents (abfd, section, data,
1630 (file_ptr) dataoff, datasize))
1631 {
1632 free (data);
1633 return false;
1634 }
1635
1636 /* Go get Export Directory Table. */
1637 edt.export_flags = bfd_get_32 (abfd, data + 0);
1638 edt.time_stamp = bfd_get_32 (abfd, data + 4);
1639 edt.major_ver = bfd_get_16 (abfd, data + 8);
1640 edt.minor_ver = bfd_get_16 (abfd, data + 10);
1641 edt.name = bfd_get_32 (abfd, data + 12);
1642 edt.base = bfd_get_32 (abfd, data + 16);
1643 edt.num_functions = bfd_get_32 (abfd, data + 20);
1644 edt.num_names = bfd_get_32 (abfd, data + 24);
1645 edt.eat_addr = bfd_get_32 (abfd, data + 28);
1646 edt.npt_addr = bfd_get_32 (abfd, data + 32);
1647 edt.ot_addr = bfd_get_32 (abfd, data + 36);
1648
1649 adj = section->vma - extra->ImageBase + dataoff;
1650
1651 /* Dump the EDT first. */
1652 fprintf (file,
1653 _("\nThe Export Tables (interpreted %s section contents)\n\n"),
1654 section->name);
1655
1656 fprintf (file,
1657 _("Export Flags \t\t\t%lx\n"), (unsigned long) edt.export_flags);
1658
1659 fprintf (file,
1660 _("Time/Date stamp \t\t%lx\n"), (unsigned long) edt.time_stamp);
1661
1662 fprintf (file,
1663 /* xgettext:c-format */
1664 _("Major/Minor \t\t\t%d/%d\n"), edt.major_ver, edt.minor_ver);
1665
1666 fprintf (file,
1667 _("Name \t\t\t\t"));
1668 bfd_fprintf_vma (abfd, file, edt.name);
1669
1670 if ((edt.name >= adj) && (edt.name < adj + datasize))
1671 fprintf (file, " %.*s\n",
1672 (int) (datasize - (edt.name - adj)),
1673 data + edt.name - adj);
1674 else
1675 fprintf (file, "(outside .edata section)\n");
1676
1677 fprintf (file,
1678 _("Ordinal Base \t\t\t%ld\n"), edt.base);
1679
1680 fprintf (file,
1681 _("Number in:\n"));
1682
1683 fprintf (file,
1684 _("\tExport Address Table \t\t%08lx\n"),
1685 edt.num_functions);
1686
1687 fprintf (file,
1688 _("\t[Name Pointer/Ordinal] Table\t%08lx\n"), edt.num_names);
1689
1690 fprintf (file,
1691 _("Table Addresses\n"));
1692
1693 fprintf (file,
1694 _("\tExport Address Table \t\t"));
1695 bfd_fprintf_vma (abfd, file, edt.eat_addr);
1696 fprintf (file, "\n");
1697
1698 fprintf (file,
1699 _("\tName Pointer Table \t\t"));
1700 bfd_fprintf_vma (abfd, file, edt.npt_addr);
1701 fprintf (file, "\n");
1702
1703 fprintf (file,
1704 _("\tOrdinal Table \t\t\t"));
1705 bfd_fprintf_vma (abfd, file, edt.ot_addr);
1706 fprintf (file, "\n");
1707
1708 /* The next table to find is the Export Address Table. It's basically
1709 a list of pointers that either locate a function in this dll, or
1710 forward the call to another dll. Something like:
1711 typedef union
1712 {
1713 long export_rva;
1714 long forwarder_rva;
1715 } export_address_table_entry; */
1716
1717 fprintf (file,
1718 _("\nExport Address Table -- Ordinal Base %ld\n"),
1719 edt.base);
1720
1721 /* PR 17512: Handle corrupt PE binaries. */
1722 /* PR 17512 file: 140-165018-0.004. */
1723 if (edt.eat_addr - adj >= datasize
1724 /* PR 17512: file: 092b1829 */
1725 || (edt.num_functions + 1) * 4 < edt.num_functions
1726 || edt.eat_addr - adj + (edt.num_functions + 1) * 4 > datasize)
1727 fprintf (file, _("\tInvalid Export Address Table rva (0x%lx) or entry count (0x%lx)\n"),
1728 (long) edt.eat_addr,
1729 (long) edt.num_functions);
1730 else for (i = 0; i < edt.num_functions; ++i)
1731 {
1732 bfd_vma eat_member = bfd_get_32 (abfd,
1733 data + edt.eat_addr + (i * 4) - adj);
1734 if (eat_member == 0)
1735 continue;
1736
1737 if (eat_member - adj <= datasize)
1738 {
1739 /* This rva is to a name (forwarding function) in our section. */
1740 /* Should locate a function descriptor. */
1741 fprintf (file,
1742 "\t[%4ld] +base[%4ld] %04lx %s -- %.*s\n",
1743 (long) i,
1744 (long) (i + edt.base),
1745 (unsigned long) eat_member,
1746 _("Forwarder RVA"),
1747 (int)(datasize - (eat_member - adj)),
1748 data + eat_member - adj);
1749 }
1750 else
1751 {
1752 /* Should locate a function descriptor in the reldata section. */
1753 fprintf (file,
1754 "\t[%4ld] +base[%4ld] %04lx %s\n",
1755 (long) i,
1756 (long) (i + edt.base),
1757 (unsigned long) eat_member,
1758 _("Export RVA"));
1759 }
1760 }
1761
1762 /* The Export Name Pointer Table is paired with the Export Ordinal Table. */
1763 /* Dump them in parallel for clarity. */
1764 fprintf (file,
1765 _("\n[Ordinal/Name Pointer] Table\n"));
1766
1767 /* PR 17512: Handle corrupt PE binaries. */
1768 if (edt.npt_addr + (edt.num_names * 4) - adj >= datasize
1769 /* PR 17512: file: bb68816e. */
1770 || edt.num_names * 4 < edt.num_names
1771 || (data + edt.npt_addr - adj) < data)
1772 /* xgettext:c-format */
1773 fprintf (file, _("\tInvalid Name Pointer Table rva (0x%lx) or entry count (0x%lx)\n"),
1774 (long) edt.npt_addr,
1775 (long) edt.num_names);
1776 /* PR 17512: file: 140-147171-0.004. */
1777 else if (edt.ot_addr + (edt.num_names * 2) - adj >= datasize
1778 || data + edt.ot_addr - adj < data)
1779 /* xgettext:c-format */
1780 fprintf (file, _("\tInvalid Ordinal Table rva (0x%lx) or entry count (0x%lx)\n"),
1781 (long) edt.ot_addr,
1782 (long) edt.num_names);
1783 else for (i = 0; i < edt.num_names; ++i)
1784 {
1785 bfd_vma name_ptr;
1786 bfd_vma ord;
1787
1788 ord = bfd_get_16 (abfd, data + edt.ot_addr + (i * 2) - adj);
1789 name_ptr = bfd_get_32 (abfd, data + edt.npt_addr + (i * 4) - adj);
1790
1791 if ((name_ptr - adj) >= datasize)
1792 {
1793 /* xgettext:c-format */
1794 fprintf (file, _("\t[%4ld] <corrupt offset: %lx>\n"),
1795 (long) ord, (long) name_ptr);
1796 }
1797 else
1798 {
1799 char * name = (char *) data + name_ptr - adj;
1800
1801 fprintf (file, "\t[%4ld] %.*s\n", (long) ord,
1802 (int)((char *)(data + datasize) - name), name);
1803 }
1804 }
1805
1806 free (data);
1807
1808 return true;
1809 }
1810
1811 /* This really is architecture dependent. On IA-64, a .pdata entry
1812 consists of three dwords containing relative virtual addresses that
1813 specify the start and end address of the code range the entry
1814 covers and the address of the corresponding unwind info data.
1815
1816 On ARM and SH-4, a compressed PDATA structure is used :
1817 _IMAGE_CE_RUNTIME_FUNCTION_ENTRY, whereas MIPS is documented to use
1818 _IMAGE_ALPHA_RUNTIME_FUNCTION_ENTRY.
1819 See http://msdn2.microsoft.com/en-us/library/ms253988(VS.80).aspx .
1820
1821 This is the version for uncompressed data. */
1822
1823 static bool
1824 pe_print_pdata (bfd * abfd, void * vfile)
1825 {
1826 #if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
1827 # define PDATA_ROW_SIZE (3 * 8)
1828 #else
1829 # define PDATA_ROW_SIZE (5 * 4)
1830 #endif
1831 FILE *file = (FILE *) vfile;
1832 bfd_byte *data = 0;
1833 asection *section = bfd_get_section_by_name (abfd, ".pdata");
1834 bfd_size_type datasize = 0;
1835 bfd_size_type i;
1836 bfd_size_type start, stop;
1837 int onaline = PDATA_ROW_SIZE;
1838
1839 if (section == NULL
1840 || (section->flags & SEC_HAS_CONTENTS) == 0
1841 || coff_section_data (abfd, section) == NULL
1842 || pei_section_data (abfd, section) == NULL)
1843 return true;
1844
1845 stop = pei_section_data (abfd, section)->virt_size;
1846 if ((stop % onaline) != 0)
1847 fprintf (file,
1848 /* xgettext:c-format */
1849 _("warning, .pdata section size (%ld) is not a multiple of %d\n"),
1850 (long) stop, onaline);
1851
1852 fprintf (file,
1853 _("\nThe Function Table (interpreted .pdata section contents)\n"));
1854 #if defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
1855 fprintf (file,
1856 _(" vma:\t\t\tBegin Address End Address Unwind Info\n"));
1857 #else
1858 fprintf (file, _("\
1859 vma:\t\tBegin End EH EH PrologEnd Exception\n\
1860 \t\tAddress Address Handler Data Address Mask\n"));
1861 #endif
1862
1863 datasize = section->size;
1864 if (datasize == 0)
1865 return true;
1866
1867 /* PR 17512: file: 002-193900-0.004. */
1868 if (datasize < stop)
1869 {
1870 /* xgettext:c-format */
1871 fprintf (file, _("Virtual size of .pdata section (%ld) larger than real size (%ld)\n"),
1872 (long) stop, (long) datasize);
1873 return false;
1874 }
1875
1876 if (! bfd_malloc_and_get_section (abfd, section, &data))
1877 {
1878 free (data);
1879 return false;
1880 }
1881
1882 start = 0;
1883
1884 for (i = start; i < stop; i += onaline)
1885 {
1886 bfd_vma begin_addr;
1887 bfd_vma end_addr;
1888 bfd_vma eh_handler;
1889 bfd_vma eh_data;
1890 bfd_vma prolog_end_addr;
1891 #if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64)
1892 int em_data;
1893 #endif
1894
1895 if (i + PDATA_ROW_SIZE > stop)
1896 break;
1897
1898 begin_addr = GET_PDATA_ENTRY (abfd, data + i );
1899 end_addr = GET_PDATA_ENTRY (abfd, data + i + 4);
1900 eh_handler = GET_PDATA_ENTRY (abfd, data + i + 8);
1901 eh_data = GET_PDATA_ENTRY (abfd, data + i + 12);
1902 prolog_end_addr = GET_PDATA_ENTRY (abfd, data + i + 16);
1903
1904 if (begin_addr == 0 && end_addr == 0 && eh_handler == 0
1905 && eh_data == 0 && prolog_end_addr == 0)
1906 /* We are probably into the padding of the section now. */
1907 break;
1908
1909 #if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64)
1910 em_data = ((eh_handler & 0x1) << 2) | (prolog_end_addr & 0x3);
1911 #endif
1912 eh_handler &= ~(bfd_vma) 0x3;
1913 prolog_end_addr &= ~(bfd_vma) 0x3;
1914
1915 fputc (' ', file);
1916 bfd_fprintf_vma (abfd, file, i + section->vma); fputc ('\t', file);
1917 bfd_fprintf_vma (abfd, file, begin_addr); fputc (' ', file);
1918 bfd_fprintf_vma (abfd, file, end_addr); fputc (' ', file);
1919 bfd_fprintf_vma (abfd, file, eh_handler);
1920 #if !defined(COFF_WITH_pep) || defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64)
1921 fputc (' ', file);
1922 bfd_fprintf_vma (abfd, file, eh_data); fputc (' ', file);
1923 bfd_fprintf_vma (abfd, file, prolog_end_addr);
1924 fprintf (file, " %x", em_data);
1925 #endif
1926 fprintf (file, "\n");
1927 }
1928
1929 free (data);
1930
1931 return true;
1932 #undef PDATA_ROW_SIZE
1933 }
1934
1935 typedef struct sym_cache
1936 {
1937 int symcount;
1938 asymbol ** syms;
1939 } sym_cache;
1940
1941 static asymbol **
1942 slurp_symtab (bfd *abfd, sym_cache *psc)
1943 {
1944 asymbol ** sy = NULL;
1945 long storage;
1946
1947 if (!(bfd_get_file_flags (abfd) & HAS_SYMS))
1948 {
1949 psc->symcount = 0;
1950 return NULL;
1951 }
1952
1953 storage = bfd_get_symtab_upper_bound (abfd);
1954 if (storage < 0)
1955 return NULL;
1956 if (storage)
1957 {
1958 sy = (asymbol **) bfd_malloc (storage);
1959 if (sy == NULL)
1960 return NULL;
1961 }
1962
1963 psc->symcount = bfd_canonicalize_symtab (abfd, sy);
1964 if (psc->symcount < 0)
1965 return NULL;
1966 return sy;
1967 }
1968
1969 static const char *
1970 my_symbol_for_address (bfd *abfd, bfd_vma func, sym_cache *psc)
1971 {
1972 int i;
1973
1974 if (psc->syms == 0)
1975 psc->syms = slurp_symtab (abfd, psc);
1976
1977 for (i = 0; i < psc->symcount; i++)
1978 {
1979 if (psc->syms[i]->section->vma + psc->syms[i]->value == func)
1980 return psc->syms[i]->name;
1981 }
1982
1983 return NULL;
1984 }
1985
1986 static void
1987 cleanup_syms (sym_cache *psc)
1988 {
1989 psc->symcount = 0;
1990 free (psc->syms);
1991 psc->syms = NULL;
1992 }
1993
1994 /* This is the version for "compressed" pdata. */
1995
1996 bool
1997 _bfd_XX_print_ce_compressed_pdata (bfd * abfd, void * vfile)
1998 {
1999 # define PDATA_ROW_SIZE (2 * 4)
2000 FILE *file = (FILE *) vfile;
2001 bfd_byte *data = NULL;
2002 asection *section = bfd_get_section_by_name (abfd, ".pdata");
2003 bfd_size_type datasize = 0;
2004 bfd_size_type i;
2005 bfd_size_type start, stop;
2006 int onaline = PDATA_ROW_SIZE;
2007 struct sym_cache cache = {0, 0} ;
2008
2009 if (section == NULL
2010 || (section->flags & SEC_HAS_CONTENTS) == 0
2011 || coff_section_data (abfd, section) == NULL
2012 || pei_section_data (abfd, section) == NULL)
2013 return true;
2014
2015 stop = pei_section_data (abfd, section)->virt_size;
2016 if ((stop % onaline) != 0)
2017 fprintf (file,
2018 /* xgettext:c-format */
2019 _("warning, .pdata section size (%ld) is not a multiple of %d\n"),
2020 (long) stop, onaline);
2021
2022 fprintf (file,
2023 _("\nThe Function Table (interpreted .pdata section contents)\n"));
2024
2025 fprintf (file, _("\
2026 vma:\t\tBegin Prolog Function Flags Exception EH\n\
2027 \t\tAddress Length Length 32b exc Handler Data\n"));
2028
2029 datasize = section->size;
2030 if (datasize == 0)
2031 return true;
2032
2033 if (! bfd_malloc_and_get_section (abfd, section, &data))
2034 {
2035 free (data);
2036 return false;
2037 }
2038
2039 start = 0;
2040 if (stop > datasize)
2041 stop = datasize;
2042
2043 for (i = start; i < stop; i += onaline)
2044 {
2045 bfd_vma begin_addr;
2046 bfd_vma other_data;
2047 bfd_vma prolog_length, function_length;
2048 int flag32bit, exception_flag;
2049 asection *tsection;
2050
2051 if (i + PDATA_ROW_SIZE > stop)
2052 break;
2053
2054 begin_addr = GET_PDATA_ENTRY (abfd, data + i );
2055 other_data = GET_PDATA_ENTRY (abfd, data + i + 4);
2056
2057 if (begin_addr == 0 && other_data == 0)
2058 /* We are probably into the padding of the section now. */
2059 break;
2060
2061 prolog_length = (other_data & 0x000000FF);
2062 function_length = (other_data & 0x3FFFFF00) >> 8;
2063 flag32bit = (int)((other_data & 0x40000000) >> 30);
2064 exception_flag = (int)((other_data & 0x80000000) >> 31);
2065
2066 fputc (' ', file);
2067 bfd_fprintf_vma (abfd, file, i + section->vma); fputc ('\t', file);
2068 bfd_fprintf_vma (abfd, file, begin_addr); fputc (' ', file);
2069 bfd_fprintf_vma (abfd, file, prolog_length); fputc (' ', file);
2070 bfd_fprintf_vma (abfd, file, function_length); fputc (' ', file);
2071 fprintf (file, "%2d %2d ", flag32bit, exception_flag);
2072
2073 /* Get the exception handler's address and the data passed from the
2074 .text section. This is really the data that belongs with the .pdata
2075 but got "compressed" out for the ARM and SH4 architectures. */
2076 tsection = bfd_get_section_by_name (abfd, ".text");
2077 if (tsection && coff_section_data (abfd, tsection)
2078 && pei_section_data (abfd, tsection))
2079 {
2080 bfd_vma eh_off = (begin_addr - 8) - tsection->vma;
2081 bfd_byte *tdata;
2082
2083 tdata = (bfd_byte *) bfd_malloc (8);
2084 if (tdata)
2085 {
2086 if (bfd_get_section_contents (abfd, tsection, tdata, eh_off, 8))
2087 {
2088 bfd_vma eh, eh_data;
2089
2090 eh = bfd_get_32 (abfd, tdata);
2091 eh_data = bfd_get_32 (abfd, tdata + 4);
2092 fprintf (file, "%08x ", (unsigned int) eh);
2093 fprintf (file, "%08x", (unsigned int) eh_data);
2094 if (eh != 0)
2095 {
2096 const char *s = my_symbol_for_address (abfd, eh, &cache);
2097
2098 if (s)
2099 fprintf (file, " (%s) ", s);
2100 }
2101 }
2102 free (tdata);
2103 }
2104 }
2105
2106 fprintf (file, "\n");
2107 }
2108
2109 free (data);
2110
2111 cleanup_syms (& cache);
2112
2113 return true;
2114 #undef PDATA_ROW_SIZE
2115 }
2116
2117 \f
2118 #define IMAGE_REL_BASED_HIGHADJ 4
2119 static const char * const tbl[] =
2120 {
2121 "ABSOLUTE",
2122 "HIGH",
2123 "LOW",
2124 "HIGHLOW",
2125 "HIGHADJ",
2126 "MIPS_JMPADDR",
2127 "SECTION",
2128 "REL32",
2129 "RESERVED1",
2130 "MIPS_JMPADDR16",
2131 "DIR64",
2132 "HIGH3ADJ",
2133 "UNKNOWN", /* MUST be last. */
2134 };
2135
2136 static bool
2137 pe_print_reloc (bfd * abfd, void * vfile)
2138 {
2139 FILE *file = (FILE *) vfile;
2140 bfd_byte *data = 0;
2141 asection *section = bfd_get_section_by_name (abfd, ".reloc");
2142 bfd_byte *p, *end;
2143
2144 if (section == NULL
2145 || section->size == 0
2146 || (section->flags & SEC_HAS_CONTENTS) == 0)
2147 return true;
2148
2149 fprintf (file,
2150 _("\n\nPE File Base Relocations (interpreted .reloc section contents)\n"));
2151
2152 if (! bfd_malloc_and_get_section (abfd, section, &data))
2153 {
2154 free (data);
2155 return false;
2156 }
2157
2158 p = data;
2159 end = data + section->size;
2160 while (p + 8 <= end)
2161 {
2162 int j;
2163 bfd_vma virtual_address;
2164 unsigned long number, size;
2165 bfd_byte *chunk_end;
2166
2167 /* The .reloc section is a sequence of blocks, with a header consisting
2168 of two 32 bit quantities, followed by a number of 16 bit entries. */
2169 virtual_address = bfd_get_32 (abfd, p);
2170 size = bfd_get_32 (abfd, p + 4);
2171 p += 8;
2172 number = (size - 8) / 2;
2173
2174 if (size == 0)
2175 break;
2176
2177 fprintf (file,
2178 /* xgettext:c-format */
2179 _("\nVirtual Address: %08lx Chunk size %ld (0x%lx) Number of fixups %ld\n"),
2180 (unsigned long) virtual_address, size, size, number);
2181
2182 chunk_end = p - 8 + size;
2183 if (chunk_end > end)
2184 chunk_end = end;
2185 j = 0;
2186 while (p + 2 <= chunk_end)
2187 {
2188 unsigned short e = bfd_get_16 (abfd, p);
2189 unsigned int t = (e & 0xF000) >> 12;
2190 int off = e & 0x0FFF;
2191
2192 if (t >= sizeof (tbl) / sizeof (tbl[0]))
2193 t = (sizeof (tbl) / sizeof (tbl[0])) - 1;
2194
2195 fprintf (file,
2196 /* xgettext:c-format */
2197 _("\treloc %4d offset %4x [%4lx] %s"),
2198 j, off, (unsigned long) (off + virtual_address), tbl[t]);
2199
2200 p += 2;
2201 j++;
2202
2203 /* HIGHADJ takes an argument, - the next record *is* the
2204 low 16 bits of addend. */
2205 if (t == IMAGE_REL_BASED_HIGHADJ && p + 2 <= chunk_end)
2206 {
2207 fprintf (file, " (%4x)", (unsigned int) bfd_get_16 (abfd, p));
2208 p += 2;
2209 j++;
2210 }
2211
2212 fprintf (file, "\n");
2213 }
2214 }
2215
2216 free (data);
2217
2218 return true;
2219 }
2220 \f
2221 /* A data structure describing the regions of a .rsrc section.
2222 Some fields are filled in as the section is parsed. */
2223
2224 typedef struct rsrc_regions
2225 {
2226 bfd_byte * section_start;
2227 bfd_byte * section_end;
2228 bfd_byte * strings_start;
2229 bfd_byte * resource_start;
2230 } rsrc_regions;
2231
2232 static bfd_byte *
2233 rsrc_print_resource_directory (FILE * , bfd *, unsigned int, bfd_byte *,
2234 rsrc_regions *, bfd_vma);
2235
2236 /* Print the resource entry at DATA, with the text indented by INDENT.
2237 Recusively calls rsrc_print_resource_directory to print the contents
2238 of directory entries.
2239 Returns the address of the end of the data associated with the entry
2240 or section_end + 1 upon failure. */
2241
2242 static bfd_byte *
2243 rsrc_print_resource_entries (FILE *file,
2244 bfd *abfd,
2245 unsigned int indent,
2246 bool is_name,
2247 bfd_byte *data,
2248 rsrc_regions *regions,
2249 bfd_vma rva_bias)
2250 {
2251 unsigned long entry, addr, size;
2252 bfd_byte * leaf;
2253
2254 if (data + 8 >= regions->section_end)
2255 return regions->section_end + 1;
2256
2257 /* xgettext:c-format */
2258 fprintf (file, _("%03x %*.s Entry: "), (int)(data - regions->section_start), indent, " ");
2259
2260 entry = (unsigned long) bfd_get_32 (abfd, data);
2261 if (is_name)
2262 {
2263 bfd_byte * name;
2264
2265 /* Note - the documentation says that this field is an RVA value
2266 but windres appears to produce a section relative offset with
2267 the top bit set. Support both styles for now. */
2268 if (HighBitSet (entry))
2269 name = regions->section_start + WithoutHighBit (entry);
2270 else
2271 name = regions->section_start + entry - rva_bias;
2272
2273 if (name + 2 < regions->section_end && name > regions->section_start)
2274 {
2275 unsigned int len;
2276
2277 if (regions->strings_start == NULL)
2278 regions->strings_start = name;
2279
2280 len = bfd_get_16 (abfd, name);
2281
2282 fprintf (file, _("name: [val: %08lx len %d]: "), entry, len);
2283
2284 if (name + 2 + len * 2 < regions->section_end)
2285 {
2286 /* This strange loop is to cope with multibyte characters. */
2287 while (len --)
2288 {
2289 char c;
2290
2291 name += 2;
2292 c = * name;
2293 /* Avoid printing control characters. */
2294 if (c > 0 && c < 32)
2295 fprintf (file, "^%c", c + 64);
2296 else
2297 fprintf (file, "%.1s", name);
2298 }
2299 }
2300 else
2301 {
2302 fprintf (file, _("<corrupt string length: %#x>\n"), len);
2303 /* PR binutils/17512: Do not try to continue decoding a
2304 corrupted resource section. It is likely to end up with
2305 reams of extraneous output. FIXME: We could probably
2306 continue if we disable the printing of strings... */
2307 return regions->section_end + 1;
2308 }
2309 }
2310 else
2311 {
2312 fprintf (file, _("<corrupt string offset: %#lx>\n"), entry);
2313 return regions->section_end + 1;
2314 }
2315 }
2316 else
2317 fprintf (file, _("ID: %#08lx"), entry);
2318
2319 entry = (long) bfd_get_32 (abfd, data + 4);
2320 fprintf (file, _(", Value: %#08lx\n"), entry);
2321
2322 if (HighBitSet (entry))
2323 {
2324 data = regions->section_start + WithoutHighBit (entry);
2325 if (data <= regions->section_start || data > regions->section_end)
2326 return regions->section_end + 1;
2327
2328 /* FIXME: PR binutils/17512: A corrupt file could contain a loop
2329 in the resource table. We need some way to detect this. */
2330 return rsrc_print_resource_directory (file, abfd, indent + 1, data,
2331 regions, rva_bias);
2332 }
2333
2334 leaf = regions->section_start + entry;
2335
2336 if (leaf + 16 >= regions->section_end
2337 /* PR 17512: file: 055dff7e. */
2338 || leaf < regions->section_start)
2339 return regions->section_end + 1;
2340
2341 /* xgettext:c-format */
2342 fprintf (file, _("%03x %*.s Leaf: Addr: %#08lx, Size: %#08lx, Codepage: %d\n"),
2343 (int) (entry), indent, " ",
2344 addr = (long) bfd_get_32 (abfd, leaf),
2345 size = (long) bfd_get_32 (abfd, leaf + 4),
2346 (int) bfd_get_32 (abfd, leaf + 8));
2347
2348 /* Check that the reserved entry is 0. */
2349 if (bfd_get_32 (abfd, leaf + 12) != 0
2350 /* And that the data address/size is valid too. */
2351 || (regions->section_start + (addr - rva_bias) + size > regions->section_end))
2352 return regions->section_end + 1;
2353
2354 if (regions->resource_start == NULL)
2355 regions->resource_start = regions->section_start + (addr - rva_bias);
2356
2357 return regions->section_start + (addr - rva_bias) + size;
2358 }
2359
2360 #define max(a,b) ((a) > (b) ? (a) : (b))
2361 #define min(a,b) ((a) < (b) ? (a) : (b))
2362
2363 static bfd_byte *
2364 rsrc_print_resource_directory (FILE * file,
2365 bfd * abfd,
2366 unsigned int indent,
2367 bfd_byte * data,
2368 rsrc_regions * regions,
2369 bfd_vma rva_bias)
2370 {
2371 unsigned int num_names, num_ids;
2372 bfd_byte * highest_data = data;
2373
2374 if (data + 16 >= regions->section_end)
2375 return regions->section_end + 1;
2376
2377 fprintf (file, "%03x %*.s ", (int)(data - regions->section_start), indent, " ");
2378 switch (indent)
2379 {
2380 case 0: fprintf (file, "Type"); break;
2381 case 2: fprintf (file, "Name"); break;
2382 case 4: fprintf (file, "Language"); break;
2383 default:
2384 fprintf (file, _("<unknown directory type: %d>\n"), indent);
2385 /* FIXME: For now we end the printing here. If in the
2386 future more directory types are added to the RSRC spec
2387 then we will need to change this. */
2388 return regions->section_end + 1;
2389 }
2390
2391 /* xgettext:c-format */
2392 fprintf (file, _(" Table: Char: %d, Time: %08lx, Ver: %d/%d, Num Names: %d, IDs: %d\n"),
2393 (int) bfd_get_32 (abfd, data),
2394 (long) bfd_get_32 (abfd, data + 4),
2395 (int) bfd_get_16 (abfd, data + 8),
2396 (int) bfd_get_16 (abfd, data + 10),
2397 num_names = (int) bfd_get_16 (abfd, data + 12),
2398 num_ids = (int) bfd_get_16 (abfd, data + 14));
2399 data += 16;
2400
2401 while (num_names --)
2402 {
2403 bfd_byte * entry_end;
2404
2405 entry_end = rsrc_print_resource_entries (file, abfd, indent + 1, true,
2406 data, regions, rva_bias);
2407 data += 8;
2408 highest_data = max (highest_data, entry_end);
2409 if (entry_end >= regions->section_end)
2410 return entry_end;
2411 }
2412
2413 while (num_ids --)
2414 {
2415 bfd_byte * entry_end;
2416
2417 entry_end = rsrc_print_resource_entries (file, abfd, indent + 1, false,
2418 data, regions, rva_bias);
2419 data += 8;
2420 highest_data = max (highest_data, entry_end);
2421 if (entry_end >= regions->section_end)
2422 return entry_end;
2423 }
2424
2425 return max (highest_data, data);
2426 }
2427
2428 /* Display the contents of a .rsrc section. We do not try to
2429 reproduce the resources, windres does that. Instead we dump
2430 the tables in a human readable format. */
2431
2432 static bool
2433 rsrc_print_section (bfd * abfd, void * vfile)
2434 {
2435 bfd_vma rva_bias;
2436 pe_data_type * pe;
2437 FILE * file = (FILE *) vfile;
2438 bfd_size_type datasize;
2439 asection * section;
2440 bfd_byte * data;
2441 rsrc_regions regions;
2442
2443 pe = pe_data (abfd);
2444 if (pe == NULL)
2445 return true;
2446
2447 section = bfd_get_section_by_name (abfd, ".rsrc");
2448 if (section == NULL)
2449 return true;
2450 if (!(section->flags & SEC_HAS_CONTENTS))
2451 return true;
2452
2453 datasize = section->size;
2454 if (datasize == 0)
2455 return true;
2456
2457 rva_bias = section->vma - pe->pe_opthdr.ImageBase;
2458
2459 if (! bfd_malloc_and_get_section (abfd, section, & data))
2460 {
2461 free (data);
2462 return false;
2463 }
2464
2465 regions.section_start = data;
2466 regions.section_end = data + datasize;
2467 regions.strings_start = NULL;
2468 regions.resource_start = NULL;
2469
2470 fflush (file);
2471 fprintf (file, "\nThe .rsrc Resource Directory section:\n");
2472
2473 while (data < regions.section_end)
2474 {
2475 bfd_byte * p = data;
2476
2477 data = rsrc_print_resource_directory (file, abfd, 0, data, & regions, rva_bias);
2478
2479 if (data == regions.section_end + 1)
2480 fprintf (file, _("Corrupt .rsrc section detected!\n"));
2481 else
2482 {
2483 /* Align data before continuing. */
2484 int align = (1 << section->alignment_power) - 1;
2485
2486 data = (bfd_byte *) (((ptrdiff_t) (data + align)) & ~ align);
2487 rva_bias += data - p;
2488
2489 /* For reasons that are unclear .rsrc sections are sometimes created
2490 aligned to a 1^3 boundary even when their alignment is set at
2491 1^2. Catch that case here before we issue a spurious warning
2492 message. */
2493 if (data == (regions.section_end - 4))
2494 data = regions.section_end;
2495 else if (data < regions.section_end)
2496 {
2497 /* If the extra data is all zeros then do not complain.
2498 This is just padding so that the section meets the
2499 page size requirements. */
2500 while (++ data < regions.section_end)
2501 if (*data != 0)
2502 break;
2503 if (data < regions.section_end)
2504 fprintf (file, _("\nWARNING: Extra data in .rsrc section - it will be ignored by Windows:\n"));
2505 }
2506 }
2507 }
2508
2509 if (regions.strings_start != NULL)
2510 fprintf (file, _(" String table starts at offset: %#03x\n"),
2511 (int) (regions.strings_start - regions.section_start));
2512 if (regions.resource_start != NULL)
2513 fprintf (file, _(" Resources start at offset: %#03x\n"),
2514 (int) (regions.resource_start - regions.section_start));
2515
2516 free (regions.section_start);
2517 return true;
2518 }
2519
2520 #define IMAGE_NUMBEROF_DEBUG_TYPES 17
2521
2522 static char * debug_type_names[IMAGE_NUMBEROF_DEBUG_TYPES] =
2523 {
2524 "Unknown",
2525 "COFF",
2526 "CodeView",
2527 "FPO",
2528 "Misc",
2529 "Exception",
2530 "Fixup",
2531 "OMAP-to-SRC",
2532 "OMAP-from-SRC",
2533 "Borland",
2534 "Reserved",
2535 "CLSID",
2536 "Feature",
2537 "CoffGrp",
2538 "ILTCG",
2539 "MPX",
2540 "Repro",
2541 };
2542
2543 static bool
2544 pe_print_debugdata (bfd * abfd, void * vfile)
2545 {
2546 FILE *file = (FILE *) vfile;
2547 pe_data_type *pe = pe_data (abfd);
2548 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
2549 asection *section;
2550 bfd_byte *data = 0;
2551 bfd_size_type dataoff;
2552 unsigned int i, j;
2553
2554 bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
2555 bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
2556
2557 if (size == 0)
2558 return true;
2559
2560 addr += extra->ImageBase;
2561 for (section = abfd->sections; section != NULL; section = section->next)
2562 {
2563 if ((addr >= section->vma) && (addr < (section->vma + section->size)))
2564 break;
2565 }
2566
2567 if (section == NULL)
2568 {
2569 fprintf (file,
2570 _("\nThere is a debug directory, but the section containing it could not be found\n"));
2571 return true;
2572 }
2573 else if (!(section->flags & SEC_HAS_CONTENTS))
2574 {
2575 fprintf (file,
2576 _("\nThere is a debug directory in %s, but that section has no contents\n"),
2577 section->name);
2578 return true;
2579 }
2580 else if (section->size < size)
2581 {
2582 fprintf (file,
2583 _("\nError: section %s contains the debug data starting address but it is too small\n"),
2584 section->name);
2585 return false;
2586 }
2587
2588 fprintf (file, _("\nThere is a debug directory in %s at 0x%lx\n\n"),
2589 section->name, (unsigned long) addr);
2590
2591 dataoff = addr - section->vma;
2592
2593 if (size > (section->size - dataoff))
2594 {
2595 fprintf (file, _("The debug data size field in the data directory is too big for the section"));
2596 return false;
2597 }
2598
2599 fprintf (file,
2600 _("Type Size Rva Offset\n"));
2601
2602 /* Read the whole section. */
2603 if (!bfd_malloc_and_get_section (abfd, section, &data))
2604 {
2605 free (data);
2606 return false;
2607 }
2608
2609 for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
2610 {
2611 const char *type_name;
2612 struct external_IMAGE_DEBUG_DIRECTORY *ext
2613 = &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i];
2614 struct internal_IMAGE_DEBUG_DIRECTORY idd;
2615
2616 _bfd_XXi_swap_debugdir_in (abfd, ext, &idd);
2617
2618 if ((idd.Type) >= IMAGE_NUMBEROF_DEBUG_TYPES)
2619 type_name = debug_type_names[0];
2620 else
2621 type_name = debug_type_names[idd.Type];
2622
2623 fprintf (file, " %2ld %14s %08lx %08lx %08lx\n",
2624 idd.Type, type_name, idd.SizeOfData,
2625 idd.AddressOfRawData, idd.PointerToRawData);
2626
2627 if (idd.Type == PE_IMAGE_DEBUG_TYPE_CODEVIEW)
2628 {
2629 char signature[CV_INFO_SIGNATURE_LENGTH * 2 + 1];
2630 /* PR 17512: file: 065-29434-0.001:0.1
2631 We need to use a 32-bit aligned buffer
2632 to safely read in a codeview record. */
2633 char buffer[256 + 1] ATTRIBUTE_ALIGNED_ALIGNOF (CODEVIEW_INFO);
2634 char *pdb;
2635
2636 CODEVIEW_INFO *cvinfo = (CODEVIEW_INFO *) buffer;
2637
2638 /* The debug entry doesn't have to have to be in a section,
2639 in which case AddressOfRawData is 0, so always use PointerToRawData. */
2640 if (!_bfd_XXi_slurp_codeview_record (abfd, (file_ptr) idd.PointerToRawData,
2641 idd.SizeOfData, cvinfo, &pdb))
2642 continue;
2643
2644 for (j = 0; j < cvinfo->SignatureLength; j++)
2645 sprintf (&signature[j*2], "%02x", cvinfo->Signature[j] & 0xff);
2646
2647 /* xgettext:c-format */
2648 fprintf (file, _("(format %c%c%c%c signature %s age %ld pdb %s)\n"),
2649 buffer[0], buffer[1], buffer[2], buffer[3],
2650 signature, cvinfo->Age, pdb[0] ? pdb : "(none)");
2651
2652 free (pdb);
2653 }
2654 }
2655
2656 free(data);
2657
2658 if (size % sizeof (struct external_IMAGE_DEBUG_DIRECTORY) != 0)
2659 fprintf (file,
2660 _("The debug directory size is not a multiple of the debug directory entry size\n"));
2661
2662 return true;
2663 }
2664
2665 static bool
2666 pe_is_repro (bfd * abfd)
2667 {
2668 pe_data_type *pe = pe_data (abfd);
2669 struct internal_extra_pe_aouthdr *extra = &pe->pe_opthdr;
2670 asection *section;
2671 bfd_byte *data = 0;
2672 bfd_size_type dataoff;
2673 unsigned int i;
2674 bool res = false;
2675
2676 bfd_vma addr = extra->DataDirectory[PE_DEBUG_DATA].VirtualAddress;
2677 bfd_size_type size = extra->DataDirectory[PE_DEBUG_DATA].Size;
2678
2679 if (size == 0)
2680 return false;
2681
2682 addr += extra->ImageBase;
2683 for (section = abfd->sections; section != NULL; section = section->next)
2684 {
2685 if ((addr >= section->vma) && (addr < (section->vma + section->size)))
2686 break;
2687 }
2688
2689 if ((section == NULL)
2690 || (!(section->flags & SEC_HAS_CONTENTS))
2691 || (section->size < size))
2692 {
2693 return false;
2694 }
2695
2696 dataoff = addr - section->vma;
2697
2698 if (size > (section->size - dataoff))
2699 {
2700 return false;
2701 }
2702
2703 if (!bfd_malloc_and_get_section (abfd, section, &data))
2704 {
2705 free (data);
2706 return false;
2707 }
2708
2709 for (i = 0; i < size / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
2710 {
2711 struct external_IMAGE_DEBUG_DIRECTORY *ext
2712 = &((struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff))[i];
2713 struct internal_IMAGE_DEBUG_DIRECTORY idd;
2714
2715 _bfd_XXi_swap_debugdir_in (abfd, ext, &idd);
2716
2717 if (idd.Type == PE_IMAGE_DEBUG_TYPE_REPRO)
2718 {
2719 res = true;
2720 break;
2721 }
2722 }
2723
2724 free(data);
2725
2726 return res;
2727 }
2728
2729 /* Print out the program headers. */
2730
2731 bool
2732 _bfd_XX_print_private_bfd_data_common (bfd * abfd, void * vfile)
2733 {
2734 FILE *file = (FILE *) vfile;
2735 int j;
2736 pe_data_type *pe = pe_data (abfd);
2737 struct internal_extra_pe_aouthdr *i = &pe->pe_opthdr;
2738 const char *subsystem_name = NULL;
2739 const char *name;
2740
2741 /* The MS dumpbin program reportedly ands with 0xff0f before
2742 printing the characteristics field. Not sure why. No reason to
2743 emulate it here. */
2744 fprintf (file, _("\nCharacteristics 0x%x\n"), pe->real_flags);
2745 #undef PF
2746 #define PF(x, y) if (pe->real_flags & x) { fprintf (file, "\t%s\n", y); }
2747 PF (IMAGE_FILE_RELOCS_STRIPPED, "relocations stripped");
2748 PF (IMAGE_FILE_EXECUTABLE_IMAGE, "executable");
2749 PF (IMAGE_FILE_LINE_NUMS_STRIPPED, "line numbers stripped");
2750 PF (IMAGE_FILE_LOCAL_SYMS_STRIPPED, "symbols stripped");
2751 PF (IMAGE_FILE_LARGE_ADDRESS_AWARE, "large address aware");
2752 PF (IMAGE_FILE_BYTES_REVERSED_LO, "little endian");
2753 PF (IMAGE_FILE_32BIT_MACHINE, "32 bit words");
2754 PF (IMAGE_FILE_DEBUG_STRIPPED, "debugging information removed");
2755 PF (IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP, "copy to swap file if on removable media");
2756 PF (IMAGE_FILE_NET_RUN_FROM_SWAP, "copy to swap file if on network media");
2757 PF (IMAGE_FILE_SYSTEM, "system file");
2758 PF (IMAGE_FILE_DLL, "DLL");
2759 PF (IMAGE_FILE_UP_SYSTEM_ONLY, "run only on uniprocessor machine");
2760 PF (IMAGE_FILE_BYTES_REVERSED_HI, "big endian");
2761 #undef PF
2762
2763 /*
2764 If a PE_IMAGE_DEBUG_TYPE_REPRO entry is present in the debug directory, the
2765 timestamp is to be interpreted as the hash of a reproducible build.
2766 */
2767 if (pe_is_repro (abfd))
2768 {
2769 fprintf (file, "\nTime/Date\t\t%08lx", pe->coff.timestamp);
2770 fprintf (file, "\t(This is a reproducible build file hash, not a timestamp)\n");
2771 }
2772 else
2773 {
2774 /* ctime implies '\n'. */
2775 time_t t = pe->coff.timestamp;
2776 fprintf (file, "\nTime/Date\t\t%s", ctime (&t));
2777 }
2778
2779 #ifndef IMAGE_NT_OPTIONAL_HDR_MAGIC
2780 # define IMAGE_NT_OPTIONAL_HDR_MAGIC 0x10b
2781 #endif
2782 #ifndef IMAGE_NT_OPTIONAL_HDR64_MAGIC
2783 # define IMAGE_NT_OPTIONAL_HDR64_MAGIC 0x20b
2784 #endif
2785 #ifndef IMAGE_NT_OPTIONAL_HDRROM_MAGIC
2786 # define IMAGE_NT_OPTIONAL_HDRROM_MAGIC 0x107
2787 #endif
2788
2789 switch (i->Magic)
2790 {
2791 case IMAGE_NT_OPTIONAL_HDR_MAGIC:
2792 name = "PE32";
2793 break;
2794 case IMAGE_NT_OPTIONAL_HDR64_MAGIC:
2795 name = "PE32+";
2796 break;
2797 case IMAGE_NT_OPTIONAL_HDRROM_MAGIC:
2798 name = "ROM";
2799 break;
2800 default:
2801 name = NULL;
2802 break;
2803 }
2804 fprintf (file, "Magic\t\t\t%04x", i->Magic);
2805 if (name)
2806 fprintf (file, "\t(%s)",name);
2807 fprintf (file, "\nMajorLinkerVersion\t%d\n", i->MajorLinkerVersion);
2808 fprintf (file, "MinorLinkerVersion\t%d\n", i->MinorLinkerVersion);
2809 fprintf (file, "SizeOfCode\t\t");
2810 bfd_fprintf_vma (abfd, file, i->SizeOfCode);
2811 fprintf (file, "\nSizeOfInitializedData\t");
2812 bfd_fprintf_vma (abfd, file, i->SizeOfInitializedData);
2813 fprintf (file, "\nSizeOfUninitializedData\t");
2814 bfd_fprintf_vma (abfd, file, i->SizeOfUninitializedData);
2815 fprintf (file, "\nAddressOfEntryPoint\t");
2816 bfd_fprintf_vma (abfd, file, i->AddressOfEntryPoint);
2817 fprintf (file, "\nBaseOfCode\t\t");
2818 bfd_fprintf_vma (abfd, file, i->BaseOfCode);
2819 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
2820 /* PE32+ does not have BaseOfData member! */
2821 fprintf (file, "\nBaseOfData\t\t");
2822 bfd_fprintf_vma (abfd, file, i->BaseOfData);
2823 #endif
2824
2825 fprintf (file, "\nImageBase\t\t");
2826 bfd_fprintf_vma (abfd, file, i->ImageBase);
2827 fprintf (file, "\nSectionAlignment\t%08x\n", i->SectionAlignment);
2828 fprintf (file, "FileAlignment\t\t%08x\n", i->FileAlignment);
2829 fprintf (file, "MajorOSystemVersion\t%d\n", i->MajorOperatingSystemVersion);
2830 fprintf (file, "MinorOSystemVersion\t%d\n", i->MinorOperatingSystemVersion);
2831 fprintf (file, "MajorImageVersion\t%d\n", i->MajorImageVersion);
2832 fprintf (file, "MinorImageVersion\t%d\n", i->MinorImageVersion);
2833 fprintf (file, "MajorSubsystemVersion\t%d\n", i->MajorSubsystemVersion);
2834 fprintf (file, "MinorSubsystemVersion\t%d\n", i->MinorSubsystemVersion);
2835 fprintf (file, "Win32Version\t\t%08x\n", i->Reserved1);
2836 fprintf (file, "SizeOfImage\t\t%08x\n", i->SizeOfImage);
2837 fprintf (file, "SizeOfHeaders\t\t%08x\n", i->SizeOfHeaders);
2838 fprintf (file, "CheckSum\t\t%08x\n", i->CheckSum);
2839
2840 switch (i->Subsystem)
2841 {
2842 case IMAGE_SUBSYSTEM_UNKNOWN:
2843 subsystem_name = "unspecified";
2844 break;
2845 case IMAGE_SUBSYSTEM_NATIVE:
2846 subsystem_name = "NT native";
2847 break;
2848 case IMAGE_SUBSYSTEM_WINDOWS_GUI:
2849 subsystem_name = "Windows GUI";
2850 break;
2851 case IMAGE_SUBSYSTEM_WINDOWS_CUI:
2852 subsystem_name = "Windows CUI";
2853 break;
2854 case IMAGE_SUBSYSTEM_POSIX_CUI:
2855 subsystem_name = "POSIX CUI";
2856 break;
2857 case IMAGE_SUBSYSTEM_WINDOWS_CE_GUI:
2858 subsystem_name = "Wince CUI";
2859 break;
2860 /* These are from UEFI Platform Initialization Specification 1.1. */
2861 case IMAGE_SUBSYSTEM_EFI_APPLICATION:
2862 subsystem_name = "EFI application";
2863 break;
2864 case IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER:
2865 subsystem_name = "EFI boot service driver";
2866 break;
2867 case IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER:
2868 subsystem_name = "EFI runtime driver";
2869 break;
2870 case IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER:
2871 subsystem_name = "SAL runtime driver";
2872 break;
2873 /* This is from revision 8.0 of the MS PE/COFF spec */
2874 case IMAGE_SUBSYSTEM_XBOX:
2875 subsystem_name = "XBOX";
2876 break;
2877 /* Added default case for clarity - subsystem_name is NULL anyway. */
2878 default:
2879 subsystem_name = NULL;
2880 }
2881
2882 fprintf (file, "Subsystem\t\t%08x", i->Subsystem);
2883 if (subsystem_name)
2884 fprintf (file, "\t(%s)", subsystem_name);
2885 fprintf (file, "\nDllCharacteristics\t%08x\n", i->DllCharacteristics);
2886 if (i->DllCharacteristics)
2887 {
2888 unsigned short dllch = i->DllCharacteristics;
2889 const char *indent = "\t\t\t\t\t";
2890
2891 if (dllch & IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA)
2892 fprintf (file, "%sHIGH_ENTROPY_VA\n", indent);
2893 if (dllch & IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE)
2894 fprintf (file, "%sDYNAMIC_BASE\n", indent);
2895 if (dllch & IMAGE_DLL_CHARACTERISTICS_FORCE_INTEGRITY)
2896 fprintf (file, "%sFORCE_INTEGRITY\n", indent);
2897 if (dllch & IMAGE_DLL_CHARACTERISTICS_NX_COMPAT)
2898 fprintf (file, "%sNX_COMPAT\n", indent);
2899 if (dllch & IMAGE_DLLCHARACTERISTICS_NO_ISOLATION)
2900 fprintf (file, "%sNO_ISOLATION\n", indent);
2901 if (dllch & IMAGE_DLLCHARACTERISTICS_NO_SEH)
2902 fprintf (file, "%sNO_SEH\n", indent);
2903 if (dllch & IMAGE_DLLCHARACTERISTICS_NO_BIND)
2904 fprintf (file, "%sNO_BIND\n", indent);
2905 if (dllch & IMAGE_DLLCHARACTERISTICS_APPCONTAINER)
2906 fprintf (file, "%sAPPCONTAINER\n", indent);
2907 if (dllch & IMAGE_DLLCHARACTERISTICS_WDM_DRIVER)
2908 fprintf (file, "%sWDM_DRIVER\n", indent);
2909 if (dllch & IMAGE_DLLCHARACTERISTICS_GUARD_CF)
2910 fprintf (file, "%sGUARD_CF\n", indent);
2911 if (dllch & IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE)
2912 fprintf (file, "%sTERMINAL_SERVICE_AWARE\n", indent);
2913 }
2914 fprintf (file, "SizeOfStackReserve\t");
2915 bfd_fprintf_vma (abfd, file, i->SizeOfStackReserve);
2916 fprintf (file, "\nSizeOfStackCommit\t");
2917 bfd_fprintf_vma (abfd, file, i->SizeOfStackCommit);
2918 fprintf (file, "\nSizeOfHeapReserve\t");
2919 bfd_fprintf_vma (abfd, file, i->SizeOfHeapReserve);
2920 fprintf (file, "\nSizeOfHeapCommit\t");
2921 bfd_fprintf_vma (abfd, file, i->SizeOfHeapCommit);
2922 fprintf (file, "\nLoaderFlags\t\t%08lx\n", (unsigned long) i->LoaderFlags);
2923 fprintf (file, "NumberOfRvaAndSizes\t%08lx\n",
2924 (unsigned long) i->NumberOfRvaAndSizes);
2925
2926 fprintf (file, "\nThe Data Directory\n");
2927 for (j = 0; j < IMAGE_NUMBEROF_DIRECTORY_ENTRIES; j++)
2928 {
2929 fprintf (file, "Entry %1x ", j);
2930 bfd_fprintf_vma (abfd, file, i->DataDirectory[j].VirtualAddress);
2931 fprintf (file, " %08lx ", (unsigned long) i->DataDirectory[j].Size);
2932 fprintf (file, "%s\n", dir_names[j]);
2933 }
2934
2935 pe_print_idata (abfd, vfile);
2936 pe_print_edata (abfd, vfile);
2937 if (bfd_coff_have_print_pdata (abfd))
2938 bfd_coff_print_pdata (abfd, vfile);
2939 else
2940 pe_print_pdata (abfd, vfile);
2941 pe_print_reloc (abfd, vfile);
2942 pe_print_debugdata (abfd, file);
2943
2944 rsrc_print_section (abfd, vfile);
2945
2946 return true;
2947 }
2948
2949 static bool
2950 is_vma_in_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sect, void *obj)
2951 {
2952 bfd_vma addr = * (bfd_vma *) obj;
2953 return (addr >= sect->vma) && (addr < (sect->vma + sect->size));
2954 }
2955
2956 static asection *
2957 find_section_by_vma (bfd *abfd, bfd_vma addr)
2958 {
2959 return bfd_sections_find_if (abfd, is_vma_in_section, (void *) & addr);
2960 }
2961
2962 /* Copy any private info we understand from the input bfd
2963 to the output bfd. */
2964
2965 bool
2966 _bfd_XX_bfd_copy_private_bfd_data_common (bfd * ibfd, bfd * obfd)
2967 {
2968 pe_data_type *ipe, *ope;
2969 bfd_size_type size;
2970
2971 /* One day we may try to grok other private data. */
2972 if (ibfd->xvec->flavour != bfd_target_coff_flavour
2973 || obfd->xvec->flavour != bfd_target_coff_flavour)
2974 return true;
2975
2976 ipe = pe_data (ibfd);
2977 ope = pe_data (obfd);
2978
2979 /* pe_opthdr is copied in copy_object. */
2980 ope->dll = ipe->dll;
2981
2982 /* Don't copy input subsystem if output is different from input. */
2983 if (obfd->xvec != ibfd->xvec)
2984 ope->pe_opthdr.Subsystem = IMAGE_SUBSYSTEM_UNKNOWN;
2985
2986 /* For strip: if we removed .reloc, we'll make a real mess of things
2987 if we don't remove this entry as well. */
2988 if (! pe_data (obfd)->has_reloc_section)
2989 {
2990 pe_data (obfd)->pe_opthdr.DataDirectory[PE_BASE_RELOCATION_TABLE].VirtualAddress = 0;
2991 pe_data (obfd)->pe_opthdr.DataDirectory[PE_BASE_RELOCATION_TABLE].Size = 0;
2992 }
2993
2994 /* For PIE, if there is .reloc, we won't add IMAGE_FILE_RELOCS_STRIPPED.
2995 But there is no .reloc, we make sure that IMAGE_FILE_RELOCS_STRIPPED
2996 won't be added. */
2997 if (! pe_data (ibfd)->has_reloc_section
2998 && ! (pe_data (ibfd)->real_flags & IMAGE_FILE_RELOCS_STRIPPED))
2999 pe_data (obfd)->dont_strip_reloc = 1;
3000
3001 memcpy (ope->dos_message, ipe->dos_message, sizeof (ope->dos_message));
3002
3003 /* The file offsets contained in the debug directory need rewriting. */
3004 size = ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size;
3005 if (size != 0)
3006 {
3007 bfd_vma addr = ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].VirtualAddress
3008 + ope->pe_opthdr.ImageBase;
3009 /* In particular a .buildid section may overlap (in VA space) with
3010 whatever section comes ahead of it (largely because of section->size
3011 representing s_size, not virt_size). Therefore don't look for the
3012 section containing the first byte, but for that covering the last
3013 one. */
3014 bfd_vma last = addr + size - 1;
3015 asection *section = find_section_by_vma (obfd, last);
3016
3017 if (section != NULL)
3018 {
3019 bfd_byte *data;
3020 bfd_vma dataoff = addr - section->vma;
3021
3022 /* PR 17512: file: 0f15796a. */
3023 if (addr < section->vma
3024 || section->size < dataoff
3025 || section->size - dataoff < size)
3026 {
3027 /* xgettext:c-format */
3028 _bfd_error_handler
3029 (_("%pB: Data Directory (%lx bytes at %" PRIx64 ") "
3030 "extends across section boundary at %" PRIx64),
3031 obfd, ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size,
3032 (uint64_t) addr, (uint64_t) section->vma);
3033 return false;
3034 }
3035
3036 if ((section->flags & SEC_HAS_CONTENTS) != 0
3037 && bfd_malloc_and_get_section (obfd, section, &data))
3038 {
3039 unsigned int i;
3040 struct external_IMAGE_DEBUG_DIRECTORY *dd =
3041 (struct external_IMAGE_DEBUG_DIRECTORY *)(data + dataoff);
3042
3043 for (i = 0; i < ope->pe_opthdr.DataDirectory[PE_DEBUG_DATA].Size
3044 / sizeof (struct external_IMAGE_DEBUG_DIRECTORY); i++)
3045 {
3046 asection *ddsection;
3047 struct external_IMAGE_DEBUG_DIRECTORY *edd = &(dd[i]);
3048 struct internal_IMAGE_DEBUG_DIRECTORY idd;
3049 bfd_vma idd_vma;
3050
3051 _bfd_XXi_swap_debugdir_in (obfd, edd, &idd);
3052
3053 /* RVA 0 means only offset is valid, not handled yet. */
3054 if (idd.AddressOfRawData == 0)
3055 continue;
3056
3057 idd_vma = idd.AddressOfRawData + ope->pe_opthdr.ImageBase;
3058 ddsection = find_section_by_vma (obfd, idd_vma);
3059 if (!ddsection)
3060 continue; /* Not in a section! */
3061
3062 idd.PointerToRawData
3063 = ddsection->filepos + idd_vma - ddsection->vma;
3064 _bfd_XXi_swap_debugdir_out (obfd, &idd, edd);
3065 }
3066
3067 if (!bfd_set_section_contents (obfd, section, data, 0,
3068 section->size))
3069 {
3070 _bfd_error_handler (_("failed to update file offsets"
3071 " in debug directory"));
3072 free (data);
3073 return false;
3074 }
3075 free (data);
3076 }
3077 else
3078 {
3079 _bfd_error_handler (_("%pB: failed to read "
3080 "debug data section"), obfd);
3081 return false;
3082 }
3083 }
3084 }
3085
3086 return true;
3087 }
3088
3089 /* Copy private section data. */
3090
3091 bool
3092 _bfd_XX_bfd_copy_private_section_data (bfd *ibfd,
3093 asection *isec,
3094 bfd *obfd,
3095 asection *osec)
3096 {
3097 if (bfd_get_flavour (ibfd) != bfd_target_coff_flavour
3098 || bfd_get_flavour (obfd) != bfd_target_coff_flavour)
3099 return true;
3100
3101 if (coff_section_data (ibfd, isec) != NULL
3102 && pei_section_data (ibfd, isec) != NULL)
3103 {
3104 if (coff_section_data (obfd, osec) == NULL)
3105 {
3106 size_t amt = sizeof (struct coff_section_tdata);
3107 osec->used_by_bfd = bfd_zalloc (obfd, amt);
3108 if (osec->used_by_bfd == NULL)
3109 return false;
3110 }
3111
3112 if (pei_section_data (obfd, osec) == NULL)
3113 {
3114 size_t amt = sizeof (struct pei_section_tdata);
3115 coff_section_data (obfd, osec)->tdata = bfd_zalloc (obfd, amt);
3116 if (coff_section_data (obfd, osec)->tdata == NULL)
3117 return false;
3118 }
3119
3120 pei_section_data (obfd, osec)->virt_size =
3121 pei_section_data (ibfd, isec)->virt_size;
3122 pei_section_data (obfd, osec)->pe_flags =
3123 pei_section_data (ibfd, isec)->pe_flags;
3124 }
3125
3126 return true;
3127 }
3128
3129 void
3130 _bfd_XX_get_symbol_info (bfd * abfd, asymbol *symbol, symbol_info *ret)
3131 {
3132 coff_get_symbol_info (abfd, symbol, ret);
3133 }
3134
3135 #if !defined(COFF_WITH_pep) && (defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64))
3136 static int
3137 sort_x64_pdata (const void *l, const void *r)
3138 {
3139 const char *lp = (const char *) l;
3140 const char *rp = (const char *) r;
3141 bfd_vma vl, vr;
3142 vl = bfd_getl32 (lp); vr = bfd_getl32 (rp);
3143 if (vl != vr)
3144 return (vl < vr ? -1 : 1);
3145 /* We compare just begin address. */
3146 return 0;
3147 }
3148 #endif
3149 \f
3150 /* Functions to process a .rsrc section. */
3151
3152 static unsigned int sizeof_leaves;
3153 static unsigned int sizeof_strings;
3154 static unsigned int sizeof_tables_and_entries;
3155
3156 static bfd_byte *
3157 rsrc_count_directory (bfd *, bfd_byte *, bfd_byte *, bfd_byte *, bfd_vma);
3158
3159 static bfd_byte *
3160 rsrc_count_entries (bfd *abfd,
3161 bool is_name,
3162 bfd_byte *datastart,
3163 bfd_byte *data,
3164 bfd_byte *dataend,
3165 bfd_vma rva_bias)
3166 {
3167 unsigned long entry, addr, size;
3168
3169 if (data + 8 >= dataend)
3170 return dataend + 1;
3171
3172 if (is_name)
3173 {
3174 bfd_byte * name;
3175
3176 entry = (long) bfd_get_32 (abfd, data);
3177
3178 if (HighBitSet (entry))
3179 name = datastart + WithoutHighBit (entry);
3180 else
3181 name = datastart + entry - rva_bias;
3182
3183 if (name + 2 >= dataend || name < datastart)
3184 return dataend + 1;
3185
3186 unsigned int len = bfd_get_16 (abfd, name);
3187 if (len == 0 || len > 256)
3188 return dataend + 1;
3189 }
3190
3191 entry = (long) bfd_get_32 (abfd, data + 4);
3192
3193 if (HighBitSet (entry))
3194 {
3195 data = datastart + WithoutHighBit (entry);
3196
3197 if (data <= datastart || data >= dataend)
3198 return dataend + 1;
3199
3200 return rsrc_count_directory (abfd, datastart, data, dataend, rva_bias);
3201 }
3202
3203 if (datastart + entry + 16 >= dataend)
3204 return dataend + 1;
3205
3206 addr = (long) bfd_get_32 (abfd, datastart + entry);
3207 size = (long) bfd_get_32 (abfd, datastart + entry + 4);
3208
3209 return datastart + addr - rva_bias + size;
3210 }
3211
3212 static bfd_byte *
3213 rsrc_count_directory (bfd * abfd,
3214 bfd_byte * datastart,
3215 bfd_byte * data,
3216 bfd_byte * dataend,
3217 bfd_vma rva_bias)
3218 {
3219 unsigned int num_entries, num_ids;
3220 bfd_byte * highest_data = data;
3221
3222 if (data + 16 >= dataend)
3223 return dataend + 1;
3224
3225 num_entries = (int) bfd_get_16 (abfd, data + 12);
3226 num_ids = (int) bfd_get_16 (abfd, data + 14);
3227
3228 num_entries += num_ids;
3229
3230 data += 16;
3231
3232 while (num_entries --)
3233 {
3234 bfd_byte * entry_end;
3235
3236 entry_end = rsrc_count_entries (abfd, num_entries >= num_ids,
3237 datastart, data, dataend, rva_bias);
3238 data += 8;
3239 highest_data = max (highest_data, entry_end);
3240 if (entry_end >= dataend)
3241 break;
3242 }
3243
3244 return max (highest_data, data);
3245 }
3246
3247 typedef struct rsrc_dir_chain
3248 {
3249 unsigned int num_entries;
3250 struct rsrc_entry * first_entry;
3251 struct rsrc_entry * last_entry;
3252 } rsrc_dir_chain;
3253
3254 typedef struct rsrc_directory
3255 {
3256 unsigned int characteristics;
3257 unsigned int time;
3258 unsigned int major;
3259 unsigned int minor;
3260
3261 rsrc_dir_chain names;
3262 rsrc_dir_chain ids;
3263
3264 struct rsrc_entry * entry;
3265 } rsrc_directory;
3266
3267 typedef struct rsrc_string
3268 {
3269 unsigned int len;
3270 bfd_byte * string;
3271 } rsrc_string;
3272
3273 typedef struct rsrc_leaf
3274 {
3275 unsigned int size;
3276 unsigned int codepage;
3277 bfd_byte * data;
3278 } rsrc_leaf;
3279
3280 typedef struct rsrc_entry
3281 {
3282 bool is_name;
3283 union
3284 {
3285 unsigned int id;
3286 struct rsrc_string name;
3287 } name_id;
3288
3289 bool is_dir;
3290 union
3291 {
3292 struct rsrc_directory * directory;
3293 struct rsrc_leaf * leaf;
3294 } value;
3295
3296 struct rsrc_entry * next_entry;
3297 struct rsrc_directory * parent;
3298 } rsrc_entry;
3299
3300 static bfd_byte *
3301 rsrc_parse_directory (bfd *, rsrc_directory *, bfd_byte *,
3302 bfd_byte *, bfd_byte *, bfd_vma, rsrc_entry *);
3303
3304 static bfd_byte *
3305 rsrc_parse_entry (bfd *abfd,
3306 bool is_name,
3307 rsrc_entry *entry,
3308 bfd_byte *datastart,
3309 bfd_byte * data,
3310 bfd_byte *dataend,
3311 bfd_vma rva_bias,
3312 rsrc_directory *parent)
3313 {
3314 unsigned long val, addr, size;
3315
3316 val = bfd_get_32 (abfd, data);
3317
3318 entry->parent = parent;
3319 entry->is_name = is_name;
3320
3321 if (is_name)
3322 {
3323 bfd_byte * address;
3324
3325 if (HighBitSet (val))
3326 {
3327 val = WithoutHighBit (val);
3328
3329 address = datastart + val;
3330 }
3331 else
3332 {
3333 address = datastart + val - rva_bias;
3334 }
3335
3336 if (address + 3 > dataend)
3337 return dataend;
3338
3339 entry->name_id.name.len = bfd_get_16 (abfd, address);
3340 entry->name_id.name.string = address + 2;
3341 }
3342 else
3343 entry->name_id.id = val;
3344
3345 val = bfd_get_32 (abfd, data + 4);
3346
3347 if (HighBitSet (val))
3348 {
3349 entry->is_dir = true;
3350 entry->value.directory = bfd_malloc (sizeof (*entry->value.directory));
3351 if (entry->value.directory == NULL)
3352 return dataend;
3353
3354 return rsrc_parse_directory (abfd, entry->value.directory,
3355 datastart,
3356 datastart + WithoutHighBit (val),
3357 dataend, rva_bias, entry);
3358 }
3359
3360 entry->is_dir = false;
3361 entry->value.leaf = bfd_malloc (sizeof (*entry->value.leaf));
3362 if (entry->value.leaf == NULL)
3363 return dataend;
3364
3365 data = datastart + val;
3366 if (data < datastart || data + 12 > dataend)
3367 return dataend;
3368
3369 addr = bfd_get_32 (abfd, data);
3370 size = entry->value.leaf->size = bfd_get_32 (abfd, data + 4);
3371 entry->value.leaf->codepage = bfd_get_32 (abfd, data + 8);
3372 /* FIXME: We assume that the reserved field (data + 12) is OK. */
3373
3374 if (size > dataend - datastart - (addr - rva_bias))
3375 return dataend;
3376 entry->value.leaf->data = bfd_malloc (size);
3377 if (entry->value.leaf->data == NULL)
3378 return dataend;
3379
3380 memcpy (entry->value.leaf->data, datastart + addr - rva_bias, size);
3381 return datastart + (addr - rva_bias) + size;
3382 }
3383
3384 static bfd_byte *
3385 rsrc_parse_entries (bfd *abfd,
3386 rsrc_dir_chain *chain,
3387 bool is_name,
3388 bfd_byte *highest_data,
3389 bfd_byte *datastart,
3390 bfd_byte *data,
3391 bfd_byte *dataend,
3392 bfd_vma rva_bias,
3393 rsrc_directory *parent)
3394 {
3395 unsigned int i;
3396 rsrc_entry * entry;
3397
3398 if (chain->num_entries == 0)
3399 {
3400 chain->first_entry = chain->last_entry = NULL;
3401 return highest_data;
3402 }
3403
3404 entry = bfd_malloc (sizeof (*entry));
3405 if (entry == NULL)
3406 return dataend;
3407
3408 chain->first_entry = entry;
3409
3410 for (i = chain->num_entries; i--;)
3411 {
3412 bfd_byte * entry_end;
3413
3414 entry_end = rsrc_parse_entry (abfd, is_name, entry, datastart,
3415 data, dataend, rva_bias, parent);
3416 data += 8;
3417 highest_data = max (entry_end, highest_data);
3418 if (entry_end > dataend)
3419 return dataend;
3420
3421 if (i)
3422 {
3423 entry->next_entry = bfd_malloc (sizeof (*entry));
3424 entry = entry->next_entry;
3425 if (entry == NULL)
3426 return dataend;
3427 }
3428 else
3429 entry->next_entry = NULL;
3430 }
3431
3432 chain->last_entry = entry;
3433
3434 return highest_data;
3435 }
3436
3437 static bfd_byte *
3438 rsrc_parse_directory (bfd * abfd,
3439 rsrc_directory * table,
3440 bfd_byte * datastart,
3441 bfd_byte * data,
3442 bfd_byte * dataend,
3443 bfd_vma rva_bias,
3444 rsrc_entry * entry)
3445 {
3446 bfd_byte * highest_data = data;
3447
3448 if (table == NULL)
3449 return dataend;
3450
3451 table->characteristics = bfd_get_32 (abfd, data);
3452 table->time = bfd_get_32 (abfd, data + 4);
3453 table->major = bfd_get_16 (abfd, data + 8);
3454 table->minor = bfd_get_16 (abfd, data + 10);
3455 table->names.num_entries = bfd_get_16 (abfd, data + 12);
3456 table->ids.num_entries = bfd_get_16 (abfd, data + 14);
3457 table->entry = entry;
3458
3459 data += 16;
3460
3461 highest_data = rsrc_parse_entries (abfd, & table->names, true, data,
3462 datastart, data, dataend, rva_bias, table);
3463 data += table->names.num_entries * 8;
3464
3465 highest_data = rsrc_parse_entries (abfd, & table->ids, false, highest_data,
3466 datastart, data, dataend, rva_bias, table);
3467 data += table->ids.num_entries * 8;
3468
3469 return max (highest_data, data);
3470 }
3471
3472 typedef struct rsrc_write_data
3473 {
3474 bfd * abfd;
3475 bfd_byte * datastart;
3476 bfd_byte * next_table;
3477 bfd_byte * next_leaf;
3478 bfd_byte * next_string;
3479 bfd_byte * next_data;
3480 bfd_vma rva_bias;
3481 } rsrc_write_data;
3482
3483 static void
3484 rsrc_write_string (rsrc_write_data * data,
3485 rsrc_string * string)
3486 {
3487 bfd_put_16 (data->abfd, string->len, data->next_string);
3488 memcpy (data->next_string + 2, string->string, string->len * 2);
3489 data->next_string += (string->len + 1) * 2;
3490 }
3491
3492 static inline unsigned int
3493 rsrc_compute_rva (rsrc_write_data * data,
3494 bfd_byte * addr)
3495 {
3496 return (addr - data->datastart) + data->rva_bias;
3497 }
3498
3499 static void
3500 rsrc_write_leaf (rsrc_write_data * data,
3501 rsrc_leaf * leaf)
3502 {
3503 bfd_put_32 (data->abfd, rsrc_compute_rva (data, data->next_data),
3504 data->next_leaf);
3505 bfd_put_32 (data->abfd, leaf->size, data->next_leaf + 4);
3506 bfd_put_32 (data->abfd, leaf->codepage, data->next_leaf + 8);
3507 bfd_put_32 (data->abfd, 0 /*reserved*/, data->next_leaf + 12);
3508 data->next_leaf += 16;
3509
3510 memcpy (data->next_data, leaf->data, leaf->size);
3511 /* An undocumented feature of Windows resources is that each unit
3512 of raw data is 8-byte aligned... */
3513 data->next_data += ((leaf->size + 7) & ~7);
3514 }
3515
3516 static void rsrc_write_directory (rsrc_write_data *, rsrc_directory *);
3517
3518 static void
3519 rsrc_write_entry (rsrc_write_data * data,
3520 bfd_byte * where,
3521 rsrc_entry * entry)
3522 {
3523 if (entry->is_name)
3524 {
3525 bfd_put_32 (data->abfd,
3526 SetHighBit (data->next_string - data->datastart),
3527 where);
3528 rsrc_write_string (data, & entry->name_id.name);
3529 }
3530 else
3531 bfd_put_32 (data->abfd, entry->name_id.id, where);
3532
3533 if (entry->is_dir)
3534 {
3535 bfd_put_32 (data->abfd,
3536 SetHighBit (data->next_table - data->datastart),
3537 where + 4);
3538 rsrc_write_directory (data, entry->value.directory);
3539 }
3540 else
3541 {
3542 bfd_put_32 (data->abfd, data->next_leaf - data->datastart, where + 4);
3543 rsrc_write_leaf (data, entry->value.leaf);
3544 }
3545 }
3546
3547 static void
3548 rsrc_compute_region_sizes (rsrc_directory * dir)
3549 {
3550 struct rsrc_entry * entry;
3551
3552 if (dir == NULL)
3553 return;
3554
3555 sizeof_tables_and_entries += 16;
3556
3557 for (entry = dir->names.first_entry; entry != NULL; entry = entry->next_entry)
3558 {
3559 sizeof_tables_and_entries += 8;
3560
3561 sizeof_strings += (entry->name_id.name.len + 1) * 2;
3562
3563 if (entry->is_dir)
3564 rsrc_compute_region_sizes (entry->value.directory);
3565 else
3566 sizeof_leaves += 16;
3567 }
3568
3569 for (entry = dir->ids.first_entry; entry != NULL; entry = entry->next_entry)
3570 {
3571 sizeof_tables_and_entries += 8;
3572
3573 if (entry->is_dir)
3574 rsrc_compute_region_sizes (entry->value.directory);
3575 else
3576 sizeof_leaves += 16;
3577 }
3578 }
3579
3580 static void
3581 rsrc_write_directory (rsrc_write_data * data,
3582 rsrc_directory * dir)
3583 {
3584 rsrc_entry * entry;
3585 unsigned int i;
3586 bfd_byte * next_entry;
3587 bfd_byte * nt;
3588
3589 bfd_put_32 (data->abfd, dir->characteristics, data->next_table);
3590 bfd_put_32 (data->abfd, 0 /*dir->time*/, data->next_table + 4);
3591 bfd_put_16 (data->abfd, dir->major, data->next_table + 8);
3592 bfd_put_16 (data->abfd, dir->minor, data->next_table + 10);
3593 bfd_put_16 (data->abfd, dir->names.num_entries, data->next_table + 12);
3594 bfd_put_16 (data->abfd, dir->ids.num_entries, data->next_table + 14);
3595
3596 /* Compute where the entries and the next table will be placed. */
3597 next_entry = data->next_table + 16;
3598 data->next_table = next_entry + (dir->names.num_entries * 8)
3599 + (dir->ids.num_entries * 8);
3600 nt = data->next_table;
3601
3602 /* Write the entries. */
3603 for (i = dir->names.num_entries, entry = dir->names.first_entry;
3604 i > 0 && entry != NULL;
3605 i--, entry = entry->next_entry)
3606 {
3607 BFD_ASSERT (entry->is_name);
3608 rsrc_write_entry (data, next_entry, entry);
3609 next_entry += 8;
3610 }
3611 BFD_ASSERT (i == 0);
3612 BFD_ASSERT (entry == NULL);
3613
3614 for (i = dir->ids.num_entries, entry = dir->ids.first_entry;
3615 i > 0 && entry != NULL;
3616 i--, entry = entry->next_entry)
3617 {
3618 BFD_ASSERT (! entry->is_name);
3619 rsrc_write_entry (data, next_entry, entry);
3620 next_entry += 8;
3621 }
3622 BFD_ASSERT (i == 0);
3623 BFD_ASSERT (entry == NULL);
3624 BFD_ASSERT (nt == next_entry);
3625 }
3626
3627 #if ! defined __CYGWIN__ && ! defined __MINGW32__
3628 /* Return the length (number of units) of the first character in S,
3629 putting its 'ucs4_t' representation in *PUC. */
3630
3631 static unsigned int
3632 u16_mbtouc (wint_t * puc, const unsigned short * s, unsigned int n)
3633 {
3634 unsigned short c = * s;
3635
3636 if (c < 0xd800 || c >= 0xe000)
3637 {
3638 *puc = c;
3639 return 1;
3640 }
3641
3642 if (c < 0xdc00)
3643 {
3644 if (n >= 2)
3645 {
3646 if (s[1] >= 0xdc00 && s[1] < 0xe000)
3647 {
3648 *puc = 0x10000 + ((c - 0xd800) << 10) + (s[1] - 0xdc00);
3649 return 2;
3650 }
3651 }
3652 else
3653 {
3654 /* Incomplete multibyte character. */
3655 *puc = 0xfffd;
3656 return n;
3657 }
3658 }
3659
3660 /* Invalid multibyte character. */
3661 *puc = 0xfffd;
3662 return 1;
3663 }
3664 #endif /* not Cygwin/Mingw */
3665
3666 /* Perform a comparison of two entries. */
3667 static signed int
3668 rsrc_cmp (bool is_name, rsrc_entry * a, rsrc_entry * b)
3669 {
3670 signed int res;
3671 bfd_byte * astring;
3672 unsigned int alen;
3673 bfd_byte * bstring;
3674 unsigned int blen;
3675
3676 if (! is_name)
3677 return a->name_id.id - b->name_id.id;
3678
3679 /* We have to perform a case insenstive, unicode string comparison... */
3680 astring = a->name_id.name.string;
3681 alen = a->name_id.name.len;
3682 bstring = b->name_id.name.string;
3683 blen = b->name_id.name.len;
3684
3685 #if defined __CYGWIN__ || defined __MINGW32__
3686 /* Under Windows hosts (both Cygwin and Mingw types),
3687 unicode == UTF-16 == wchar_t. The case insensitive string comparison
3688 function however goes by different names in the two environments... */
3689
3690 #undef rscpcmp
3691 #ifdef __CYGWIN__
3692 #define rscpcmp wcsncasecmp
3693 #endif
3694 #ifdef __MINGW32__
3695 #define rscpcmp wcsnicmp
3696 #endif
3697
3698 res = rscpcmp ((const wchar_t *) astring, (const wchar_t *) bstring,
3699 min (alen, blen));
3700
3701 #else
3702 {
3703 unsigned int i;
3704
3705 res = 0;
3706 for (i = min (alen, blen); i--; astring += 2, bstring += 2)
3707 {
3708 wint_t awc;
3709 wint_t bwc;
3710
3711 /* Convert UTF-16 unicode characters into wchar_t characters
3712 so that we can then perform a case insensitive comparison. */
3713 unsigned int Alen = u16_mbtouc (& awc, (const unsigned short *) astring, 2);
3714 unsigned int Blen = u16_mbtouc (& bwc, (const unsigned short *) bstring, 2);
3715
3716 if (Alen != Blen)
3717 return Alen - Blen;
3718
3719 awc = towlower (awc);
3720 bwc = towlower (bwc);
3721
3722 res = awc - bwc;
3723 if (res)
3724 break;
3725 }
3726 }
3727 #endif
3728
3729 if (res == 0)
3730 res = alen - blen;
3731
3732 return res;
3733 }
3734
3735 static void
3736 rsrc_print_name (char * buffer, rsrc_string string)
3737 {
3738 unsigned int i;
3739 bfd_byte * name = string.string;
3740
3741 for (i = string.len; i--; name += 2)
3742 sprintf (buffer + strlen (buffer), "%.1s", name);
3743 }
3744
3745 static const char *
3746 rsrc_resource_name (rsrc_entry *entry, rsrc_directory *dir, char *buffer)
3747 {
3748 bool is_string = false;
3749
3750 buffer[0] = 0;
3751
3752 if (dir != NULL && dir->entry != NULL && dir->entry->parent != NULL
3753 && dir->entry->parent->entry != NULL)
3754 {
3755 strcpy (buffer, "type: ");
3756 if (dir->entry->parent->entry->is_name)
3757 rsrc_print_name (buffer + strlen (buffer),
3758 dir->entry->parent->entry->name_id.name);
3759 else
3760 {
3761 unsigned int id = dir->entry->parent->entry->name_id.id;
3762
3763 sprintf (buffer + strlen (buffer), "%x", id);
3764 switch (id)
3765 {
3766 case 1: strcat (buffer, " (CURSOR)"); break;
3767 case 2: strcat (buffer, " (BITMAP)"); break;
3768 case 3: strcat (buffer, " (ICON)"); break;
3769 case 4: strcat (buffer, " (MENU)"); break;
3770 case 5: strcat (buffer, " (DIALOG)"); break;
3771 case 6: strcat (buffer, " (STRING)"); is_string = true; break;
3772 case 7: strcat (buffer, " (FONTDIR)"); break;
3773 case 8: strcat (buffer, " (FONT)"); break;
3774 case 9: strcat (buffer, " (ACCELERATOR)"); break;
3775 case 10: strcat (buffer, " (RCDATA)"); break;
3776 case 11: strcat (buffer, " (MESSAGETABLE)"); break;
3777 case 12: strcat (buffer, " (GROUP_CURSOR)"); break;
3778 case 14: strcat (buffer, " (GROUP_ICON)"); break;
3779 case 16: strcat (buffer, " (VERSION)"); break;
3780 case 17: strcat (buffer, " (DLGINCLUDE)"); break;
3781 case 19: strcat (buffer, " (PLUGPLAY)"); break;
3782 case 20: strcat (buffer, " (VXD)"); break;
3783 case 21: strcat (buffer, " (ANICURSOR)"); break;
3784 case 22: strcat (buffer, " (ANIICON)"); break;
3785 case 23: strcat (buffer, " (HTML)"); break;
3786 case 24: strcat (buffer, " (MANIFEST)"); break;
3787 case 240: strcat (buffer, " (DLGINIT)"); break;
3788 case 241: strcat (buffer, " (TOOLBAR)"); break;
3789 }
3790 }
3791 }
3792
3793 if (dir != NULL && dir->entry != NULL)
3794 {
3795 strcat (buffer, " name: ");
3796 if (dir->entry->is_name)
3797 rsrc_print_name (buffer + strlen (buffer), dir->entry->name_id.name);
3798 else
3799 {
3800 unsigned int id = dir->entry->name_id.id;
3801
3802 sprintf (buffer + strlen (buffer), "%x", id);
3803
3804 if (is_string)
3805 sprintf (buffer + strlen (buffer), " (resource id range: %d - %d)",
3806 (id - 1) << 4, (id << 4) - 1);
3807 }
3808 }
3809
3810 if (entry != NULL)
3811 {
3812 strcat (buffer, " lang: ");
3813
3814 if (entry->is_name)
3815 rsrc_print_name (buffer + strlen (buffer), entry->name_id.name);
3816 else
3817 sprintf (buffer + strlen (buffer), "%x", entry->name_id.id);
3818 }
3819
3820 return buffer;
3821 }
3822
3823 /* *sigh* Windows resource strings are special. Only the top 28-bits of
3824 their ID is stored in the NAME entry. The bottom four bits are used as
3825 an index into unicode string table that makes up the data of the leaf.
3826 So identical type-name-lang string resources may not actually be
3827 identical at all.
3828
3829 This function is called when we have detected two string resources with
3830 match top-28-bit IDs. We have to scan the string tables inside the leaves
3831 and discover if there are any real collisions. If there are then we report
3832 them and return FALSE. Otherwise we copy any strings from B into A and
3833 then return TRUE. */
3834
3835 static bool
3836 rsrc_merge_string_entries (rsrc_entry * a ATTRIBUTE_UNUSED,
3837 rsrc_entry * b ATTRIBUTE_UNUSED)
3838 {
3839 unsigned int copy_needed = 0;
3840 unsigned int i;
3841 bfd_byte * astring;
3842 bfd_byte * bstring;
3843 bfd_byte * new_data;
3844 bfd_byte * nstring;
3845
3846 /* Step one: Find out what we have to do. */
3847 BFD_ASSERT (! a->is_dir);
3848 astring = a->value.leaf->data;
3849
3850 BFD_ASSERT (! b->is_dir);
3851 bstring = b->value.leaf->data;
3852
3853 for (i = 0; i < 16; i++)
3854 {
3855 unsigned int alen = astring[0] + (astring[1] << 8);
3856 unsigned int blen = bstring[0] + (bstring[1] << 8);
3857
3858 if (alen == 0)
3859 {
3860 copy_needed += blen * 2;
3861 }
3862 else if (blen == 0)
3863 ;
3864 else if (alen != blen)
3865 /* FIXME: Should we continue the loop in order to report other duplicates ? */
3866 break;
3867 /* alen == blen != 0. We might have two identical strings. If so we
3868 can ignore the second one. There is no need for wchar_t vs UTF-16
3869 theatrics here - we are only interested in (case sensitive) equality. */
3870 else if (memcmp (astring + 2, bstring + 2, alen * 2) != 0)
3871 break;
3872
3873 astring += (alen + 1) * 2;
3874 bstring += (blen + 1) * 2;
3875 }
3876
3877 if (i != 16)
3878 {
3879 if (a->parent != NULL
3880 && a->parent->entry != NULL
3881 && !a->parent->entry->is_name)
3882 _bfd_error_handler (_(".rsrc merge failure: duplicate string resource: %d"),
3883 ((a->parent->entry->name_id.id - 1) << 4) + i);
3884 return false;
3885 }
3886
3887 if (copy_needed == 0)
3888 return true;
3889
3890 /* If we reach here then A and B must both have non-colliding strings.
3891 (We never get string resources with fully empty string tables).
3892 We need to allocate an extra COPY_NEEDED bytes in A and then bring
3893 in B's strings. */
3894 new_data = bfd_malloc (a->value.leaf->size + copy_needed);
3895 if (new_data == NULL)
3896 return false;
3897
3898 nstring = new_data;
3899 astring = a->value.leaf->data;
3900 bstring = b->value.leaf->data;
3901
3902 for (i = 0; i < 16; i++)
3903 {
3904 unsigned int alen = astring[0] + (astring[1] << 8);
3905 unsigned int blen = bstring[0] + (bstring[1] << 8);
3906
3907 if (alen != 0)
3908 {
3909 memcpy (nstring, astring, (alen + 1) * 2);
3910 nstring += (alen + 1) * 2;
3911 }
3912 else if (blen != 0)
3913 {
3914 memcpy (nstring, bstring, (blen + 1) * 2);
3915 nstring += (blen + 1) * 2;
3916 }
3917 else
3918 {
3919 * nstring++ = 0;
3920 * nstring++ = 0;
3921 }
3922
3923 astring += (alen + 1) * 2;
3924 bstring += (blen + 1) * 2;
3925 }
3926
3927 BFD_ASSERT (nstring - new_data == (signed) (a->value.leaf->size + copy_needed));
3928
3929 free (a->value.leaf->data);
3930 a->value.leaf->data = new_data;
3931 a->value.leaf->size += copy_needed;
3932
3933 return true;
3934 }
3935
3936 static void rsrc_merge (rsrc_entry *, rsrc_entry *);
3937
3938 /* Sort the entries in given part of the directory.
3939 We use an old fashioned bubble sort because we are dealing
3940 with lists and we want to handle matches specially. */
3941
3942 static void
3943 rsrc_sort_entries (rsrc_dir_chain *chain,
3944 bool is_name,
3945 rsrc_directory *dir)
3946 {
3947 rsrc_entry * entry;
3948 rsrc_entry * next;
3949 rsrc_entry ** points_to_entry;
3950 bool swapped;
3951
3952 if (chain->num_entries < 2)
3953 return;
3954
3955 do
3956 {
3957 swapped = false;
3958 points_to_entry = & chain->first_entry;
3959 entry = * points_to_entry;
3960 next = entry->next_entry;
3961
3962 do
3963 {
3964 signed int cmp = rsrc_cmp (is_name, entry, next);
3965
3966 if (cmp > 0)
3967 {
3968 entry->next_entry = next->next_entry;
3969 next->next_entry = entry;
3970 * points_to_entry = next;
3971 points_to_entry = & next->next_entry;
3972 next = entry->next_entry;
3973 swapped = true;
3974 }
3975 else if (cmp == 0)
3976 {
3977 if (entry->is_dir && next->is_dir)
3978 {
3979 /* When we encounter identical directory entries we have to
3980 merge them together. The exception to this rule is for
3981 resource manifests - there can only be one of these,
3982 even if they differ in language. Zero-language manifests
3983 are assumed to be default manifests (provided by the
3984 Cygwin/MinGW build system) and these can be silently dropped,
3985 unless that would reduce the number of manifests to zero.
3986 There should only ever be one non-zero lang manifest -
3987 if there are more it is an error. A non-zero lang
3988 manifest takes precedence over a default manifest. */
3989 if (!entry->is_name
3990 && entry->name_id.id == 1
3991 && dir != NULL
3992 && dir->entry != NULL
3993 && !dir->entry->is_name
3994 && dir->entry->name_id.id == 0x18)
3995 {
3996 if (next->value.directory->names.num_entries == 0
3997 && next->value.directory->ids.num_entries == 1
3998 && !next->value.directory->ids.first_entry->is_name
3999 && next->value.directory->ids.first_entry->name_id.id == 0)
4000 /* Fall through so that NEXT is dropped. */
4001 ;
4002 else if (entry->value.directory->names.num_entries == 0
4003 && entry->value.directory->ids.num_entries == 1
4004 && !entry->value.directory->ids.first_entry->is_name
4005 && entry->value.directory->ids.first_entry->name_id.id == 0)
4006 {
4007 /* Swap ENTRY and NEXT. Then fall through so that the old ENTRY is dropped. */
4008 entry->next_entry = next->next_entry;
4009 next->next_entry = entry;
4010 * points_to_entry = next;
4011 points_to_entry = & next->next_entry;
4012 next = entry->next_entry;
4013 swapped = true;
4014 }
4015 else
4016 {
4017 _bfd_error_handler (_(".rsrc merge failure: multiple non-default manifests"));
4018 bfd_set_error (bfd_error_file_truncated);
4019 return;
4020 }
4021
4022 /* Unhook NEXT from the chain. */
4023 /* FIXME: memory loss here. */
4024 entry->next_entry = next->next_entry;
4025 chain->num_entries --;
4026 if (chain->num_entries < 2)
4027 return;
4028 next = next->next_entry;
4029 }
4030 else
4031 rsrc_merge (entry, next);
4032 }
4033 else if (entry->is_dir != next->is_dir)
4034 {
4035 _bfd_error_handler (_(".rsrc merge failure: a directory matches a leaf"));
4036 bfd_set_error (bfd_error_file_truncated);
4037 return;
4038 }
4039 else
4040 {
4041 /* Otherwise with identical leaves we issue an error
4042 message - because there should never be duplicates.
4043 The exception is Type 18/Name 1/Lang 0 which is the
4044 defaul manifest - this can just be dropped. */
4045 if (!entry->is_name
4046 && entry->name_id.id == 0
4047 && dir != NULL
4048 && dir->entry != NULL
4049 && !dir->entry->is_name
4050 && dir->entry->name_id.id == 1
4051 && dir->entry->parent != NULL
4052 && dir->entry->parent->entry != NULL
4053 && !dir->entry->parent->entry->is_name
4054 && dir->entry->parent->entry->name_id.id == 0x18 /* RT_MANIFEST */)
4055 ;
4056 else if (dir != NULL
4057 && dir->entry != NULL
4058 && dir->entry->parent != NULL
4059 && dir->entry->parent->entry != NULL
4060 && !dir->entry->parent->entry->is_name
4061 && dir->entry->parent->entry->name_id.id == 0x6 /* RT_STRING */)
4062 {
4063 /* Strings need special handling. */
4064 if (! rsrc_merge_string_entries (entry, next))
4065 {
4066 /* _bfd_error_handler should have been called inside merge_strings. */
4067 bfd_set_error (bfd_error_file_truncated);
4068 return;
4069 }
4070 }
4071 else
4072 {
4073 if (dir == NULL
4074 || dir->entry == NULL
4075 || dir->entry->parent == NULL
4076 || dir->entry->parent->entry == NULL)
4077 _bfd_error_handler (_(".rsrc merge failure: duplicate leaf"));
4078 else
4079 {
4080 char buff[256];
4081
4082 _bfd_error_handler (_(".rsrc merge failure: duplicate leaf: %s"),
4083 rsrc_resource_name (entry, dir, buff));
4084 }
4085 bfd_set_error (bfd_error_file_truncated);
4086 return;
4087 }
4088 }
4089
4090 /* Unhook NEXT from the chain. */
4091 entry->next_entry = next->next_entry;
4092 chain->num_entries --;
4093 if (chain->num_entries < 2)
4094 return;
4095 next = next->next_entry;
4096 }
4097 else
4098 {
4099 points_to_entry = & entry->next_entry;
4100 entry = next;
4101 next = next->next_entry;
4102 }
4103 }
4104 while (next);
4105
4106 chain->last_entry = entry;
4107 }
4108 while (swapped);
4109 }
4110
4111 /* Attach B's chain onto A. */
4112 static void
4113 rsrc_attach_chain (rsrc_dir_chain * achain, rsrc_dir_chain * bchain)
4114 {
4115 if (bchain->num_entries == 0)
4116 return;
4117
4118 achain->num_entries += bchain->num_entries;
4119
4120 if (achain->first_entry == NULL)
4121 {
4122 achain->first_entry = bchain->first_entry;
4123 achain->last_entry = bchain->last_entry;
4124 }
4125 else
4126 {
4127 achain->last_entry->next_entry = bchain->first_entry;
4128 achain->last_entry = bchain->last_entry;
4129 }
4130
4131 bchain->num_entries = 0;
4132 bchain->first_entry = bchain->last_entry = NULL;
4133 }
4134
4135 static void
4136 rsrc_merge (struct rsrc_entry * a, struct rsrc_entry * b)
4137 {
4138 rsrc_directory * adir;
4139 rsrc_directory * bdir;
4140
4141 BFD_ASSERT (a->is_dir);
4142 BFD_ASSERT (b->is_dir);
4143
4144 adir = a->value.directory;
4145 bdir = b->value.directory;
4146
4147 if (adir->characteristics != bdir->characteristics)
4148 {
4149 _bfd_error_handler (_(".rsrc merge failure: dirs with differing characteristics"));
4150 bfd_set_error (bfd_error_file_truncated);
4151 return;
4152 }
4153
4154 if (adir->major != bdir->major || adir->minor != bdir->minor)
4155 {
4156 _bfd_error_handler (_(".rsrc merge failure: differing directory versions"));
4157 bfd_set_error (bfd_error_file_truncated);
4158 return;
4159 }
4160
4161 /* Attach B's name chain to A. */
4162 rsrc_attach_chain (& adir->names, & bdir->names);
4163
4164 /* Attach B's ID chain to A. */
4165 rsrc_attach_chain (& adir->ids, & bdir->ids);
4166
4167 /* Now sort A's entries. */
4168 rsrc_sort_entries (& adir->names, true, adir);
4169 rsrc_sort_entries (& adir->ids, false, adir);
4170 }
4171
4172 /* Check the .rsrc section. If it contains multiple concatenated
4173 resources then we must merge them properly. Otherwise Windows
4174 will ignore all but the first set. */
4175
4176 static void
4177 rsrc_process_section (bfd * abfd,
4178 struct coff_final_link_info * pfinfo)
4179 {
4180 rsrc_directory new_table;
4181 bfd_size_type size;
4182 asection * sec;
4183 pe_data_type * pe;
4184 bfd_vma rva_bias;
4185 bfd_byte * data;
4186 bfd_byte * datastart;
4187 bfd_byte * dataend;
4188 bfd_byte * new_data;
4189 unsigned int num_resource_sets;
4190 rsrc_directory * type_tables;
4191 rsrc_write_data write_data;
4192 unsigned int indx;
4193 bfd * input;
4194 unsigned int num_input_rsrc = 0;
4195 unsigned int max_num_input_rsrc = 4;
4196 ptrdiff_t * rsrc_sizes = NULL;
4197
4198 new_table.names.num_entries = 0;
4199 new_table.ids.num_entries = 0;
4200
4201 sec = bfd_get_section_by_name (abfd, ".rsrc");
4202 if (sec == NULL || (size = sec->rawsize) == 0)
4203 return;
4204
4205 pe = pe_data (abfd);
4206 if (pe == NULL)
4207 return;
4208
4209 rva_bias = sec->vma - pe->pe_opthdr.ImageBase;
4210
4211 if (! bfd_malloc_and_get_section (abfd, sec, &datastart))
4212 goto end;
4213
4214 /* Step zero: Scan the input bfds looking for .rsrc sections and record
4215 their lengths. Note - we rely upon the fact that the linker script
4216 does *not* sort the input .rsrc sections, so that the order in the
4217 linkinfo list matches the order in the output .rsrc section.
4218
4219 We need to know the lengths because each input .rsrc section has padding
4220 at the end of a variable amount. (It does not appear to be based upon
4221 the section alignment or the file alignment). We need to skip any
4222 padding bytes when parsing the input .rsrc sections. */
4223 data = datastart;
4224 rsrc_sizes = bfd_malloc (max_num_input_rsrc * sizeof (*rsrc_sizes));
4225 if (rsrc_sizes == NULL)
4226 goto end;
4227
4228 for (input = pfinfo->info->input_bfds;
4229 input != NULL;
4230 input = input->link.next)
4231 {
4232 asection * rsrc_sec = bfd_get_section_by_name (input, ".rsrc");
4233
4234 /* PR 18372 - skip discarded .rsrc sections. */
4235 if (rsrc_sec != NULL && !discarded_section (rsrc_sec))
4236 {
4237 if (num_input_rsrc == max_num_input_rsrc)
4238 {
4239 max_num_input_rsrc += 10;
4240 rsrc_sizes = bfd_realloc (rsrc_sizes, max_num_input_rsrc
4241 * sizeof (*rsrc_sizes));
4242 if (rsrc_sizes == NULL)
4243 goto end;
4244 }
4245
4246 BFD_ASSERT (rsrc_sec->size > 0);
4247 rsrc_sizes [num_input_rsrc ++] = rsrc_sec->size;
4248 }
4249 }
4250
4251 if (num_input_rsrc < 2)
4252 goto end;
4253
4254 /* Step one: Walk the section, computing the size of the tables,
4255 leaves and data and decide if we need to do anything. */
4256 dataend = data + size;
4257 num_resource_sets = 0;
4258
4259 while (data < dataend)
4260 {
4261 bfd_byte * p = data;
4262
4263 data = rsrc_count_directory (abfd, data, data, dataend, rva_bias);
4264
4265 if (data > dataend)
4266 {
4267 /* Corrupted .rsrc section - cannot merge. */
4268 _bfd_error_handler (_("%pB: .rsrc merge failure: corrupt .rsrc section"),
4269 abfd);
4270 bfd_set_error (bfd_error_file_truncated);
4271 goto end;
4272 }
4273
4274 if ((data - p) > rsrc_sizes [num_resource_sets])
4275 {
4276 _bfd_error_handler (_("%pB: .rsrc merge failure: unexpected .rsrc size"),
4277 abfd);
4278 bfd_set_error (bfd_error_file_truncated);
4279 goto end;
4280 }
4281 /* FIXME: Should we add a check for "data - p" being much smaller
4282 than rsrc_sizes[num_resource_sets] ? */
4283
4284 data = p + rsrc_sizes[num_resource_sets];
4285 rva_bias += data - p;
4286 ++ num_resource_sets;
4287 }
4288 BFD_ASSERT (num_resource_sets == num_input_rsrc);
4289
4290 /* Step two: Walk the data again, building trees of the resources. */
4291 data = datastart;
4292 rva_bias = sec->vma - pe->pe_opthdr.ImageBase;
4293
4294 type_tables = bfd_malloc (num_resource_sets * sizeof (*type_tables));
4295 if (type_tables == NULL)
4296 goto end;
4297
4298 indx = 0;
4299 while (data < dataend)
4300 {
4301 bfd_byte * p = data;
4302
4303 (void) rsrc_parse_directory (abfd, type_tables + indx, data, data,
4304 dataend, rva_bias, NULL);
4305 data = p + rsrc_sizes[indx];
4306 rva_bias += data - p;
4307 ++ indx;
4308 }
4309 BFD_ASSERT (indx == num_resource_sets);
4310
4311 /* Step three: Merge the top level tables (there can be only one).
4312
4313 We must ensure that the merged entries are in ascending order.
4314
4315 We also thread the top level table entries from the old tree onto
4316 the new table, so that they can be pulled off later. */
4317
4318 /* FIXME: Should we verify that all type tables are the same ? */
4319 new_table.characteristics = type_tables[0].characteristics;
4320 new_table.time = type_tables[0].time;
4321 new_table.major = type_tables[0].major;
4322 new_table.minor = type_tables[0].minor;
4323
4324 /* Chain the NAME entries onto the table. */
4325 new_table.names.first_entry = NULL;
4326 new_table.names.last_entry = NULL;
4327
4328 for (indx = 0; indx < num_resource_sets; indx++)
4329 rsrc_attach_chain (& new_table.names, & type_tables[indx].names);
4330
4331 rsrc_sort_entries (& new_table.names, true, & new_table);
4332
4333 /* Chain the ID entries onto the table. */
4334 new_table.ids.first_entry = NULL;
4335 new_table.ids.last_entry = NULL;
4336
4337 for (indx = 0; indx < num_resource_sets; indx++)
4338 rsrc_attach_chain (& new_table.ids, & type_tables[indx].ids);
4339
4340 rsrc_sort_entries (& new_table.ids, false, & new_table);
4341
4342 /* Step four: Create new contents for the .rsrc section. */
4343 /* Step four point one: Compute the size of each region of the .rsrc section.
4344 We do this now, rather than earlier, as the merging above may have dropped
4345 some entries. */
4346 sizeof_leaves = sizeof_strings = sizeof_tables_and_entries = 0;
4347 rsrc_compute_region_sizes (& new_table);
4348 /* We increment sizeof_strings to make sure that resource data
4349 starts on an 8-byte boundary. FIXME: Is this correct ? */
4350 sizeof_strings = (sizeof_strings + 7) & ~ 7;
4351
4352 new_data = bfd_zalloc (abfd, size);
4353 if (new_data == NULL)
4354 goto end;
4355
4356 write_data.abfd = abfd;
4357 write_data.datastart = new_data;
4358 write_data.next_table = new_data;
4359 write_data.next_leaf = new_data + sizeof_tables_and_entries;
4360 write_data.next_string = write_data.next_leaf + sizeof_leaves;
4361 write_data.next_data = write_data.next_string + sizeof_strings;
4362 write_data.rva_bias = sec->vma - pe->pe_opthdr.ImageBase;
4363
4364 rsrc_write_directory (& write_data, & new_table);
4365
4366 /* Step five: Replace the old contents with the new.
4367 We don't recompute the size as it's too late here to shrink section.
4368 See PR ld/20193 for more details. */
4369 bfd_set_section_contents (pfinfo->output_bfd, sec, new_data, 0, size);
4370 sec->size = sec->rawsize = size;
4371
4372 end:
4373 /* Step six: Free all the memory that we have used. */
4374 /* FIXME: Free the resource tree, if we have one. */
4375 free (datastart);
4376 free (rsrc_sizes);
4377 }
4378
4379 /* Handle the .idata section and other things that need symbol table
4380 access. */
4381
4382 bool
4383 _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
4384 {
4385 struct coff_link_hash_entry *h1;
4386 struct bfd_link_info *info = pfinfo->info;
4387 bool result = true;
4388
4389 /* There are a few fields that need to be filled in now while we
4390 have symbol table access.
4391
4392 The .idata subsections aren't directly available as sections, but
4393 they are in the symbol table, so get them from there. */
4394
4395 /* The import directory. This is the address of .idata$2, with size
4396 of .idata$2 + .idata$3. */
4397 h1 = coff_link_hash_lookup (coff_hash_table (info),
4398 ".idata$2", false, false, true);
4399 if (h1 != NULL)
4400 {
4401 /* PR ld/2729: We cannot rely upon all the output sections having been
4402 created properly, so check before referencing them. Issue a warning
4403 message for any sections tht could not be found. */
4404 if ((h1->root.type == bfd_link_hash_defined
4405 || h1->root.type == bfd_link_hash_defweak)
4406 && h1->root.u.def.section != NULL
4407 && h1->root.u.def.section->output_section != NULL)
4408 pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].VirtualAddress =
4409 (h1->root.u.def.value
4410 + h1->root.u.def.section->output_section->vma
4411 + h1->root.u.def.section->output_offset);
4412 else
4413 {
4414 _bfd_error_handler
4415 (_("%pB: unable to fill in DataDictionary[1] because .idata$2 is missing"),
4416 abfd);
4417 result = false;
4418 }
4419
4420 h1 = coff_link_hash_lookup (coff_hash_table (info),
4421 ".idata$4", false, false, true);
4422 if (h1 != NULL
4423 && (h1->root.type == bfd_link_hash_defined
4424 || h1->root.type == bfd_link_hash_defweak)
4425 && h1->root.u.def.section != NULL
4426 && h1->root.u.def.section->output_section != NULL)
4427 pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].Size =
4428 ((h1->root.u.def.value
4429 + h1->root.u.def.section->output_section->vma
4430 + h1->root.u.def.section->output_offset)
4431 - pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_TABLE].VirtualAddress);
4432 else
4433 {
4434 _bfd_error_handler
4435 (_("%pB: unable to fill in DataDictionary[1] because .idata$4 is missing"),
4436 abfd);
4437 result = false;
4438 }
4439
4440 /* The import address table. This is the size/address of
4441 .idata$5. */
4442 h1 = coff_link_hash_lookup (coff_hash_table (info),
4443 ".idata$5", false, false, true);
4444 if (h1 != NULL
4445 && (h1->root.type == bfd_link_hash_defined
4446 || h1->root.type == bfd_link_hash_defweak)
4447 && h1->root.u.def.section != NULL
4448 && h1->root.u.def.section->output_section != NULL)
4449 pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress =
4450 (h1->root.u.def.value
4451 + h1->root.u.def.section->output_section->vma
4452 + h1->root.u.def.section->output_offset);
4453 else
4454 {
4455 _bfd_error_handler
4456 (_("%pB: unable to fill in DataDictionary[12] because .idata$5 is missing"),
4457 abfd);
4458 result = false;
4459 }
4460
4461 h1 = coff_link_hash_lookup (coff_hash_table (info),
4462 ".idata$6", false, false, true);
4463 if (h1 != NULL
4464 && (h1->root.type == bfd_link_hash_defined
4465 || h1->root.type == bfd_link_hash_defweak)
4466 && h1->root.u.def.section != NULL
4467 && h1->root.u.def.section->output_section != NULL)
4468 pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size =
4469 ((h1->root.u.def.value
4470 + h1->root.u.def.section->output_section->vma
4471 + h1->root.u.def.section->output_offset)
4472 - pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress);
4473 else
4474 {
4475 _bfd_error_handler
4476 (_("%pB: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE (12)] because .idata$6 is missing"),
4477 abfd);
4478 result = false;
4479 }
4480 }
4481 else
4482 {
4483 h1 = coff_link_hash_lookup (coff_hash_table (info),
4484 "__IAT_start__", false, false, true);
4485 if (h1 != NULL
4486 && (h1->root.type == bfd_link_hash_defined
4487 || h1->root.type == bfd_link_hash_defweak)
4488 && h1->root.u.def.section != NULL
4489 && h1->root.u.def.section->output_section != NULL)
4490 {
4491 bfd_vma iat_va;
4492
4493 iat_va =
4494 (h1->root.u.def.value
4495 + h1->root.u.def.section->output_section->vma
4496 + h1->root.u.def.section->output_offset);
4497
4498 h1 = coff_link_hash_lookup (coff_hash_table (info),
4499 "__IAT_end__", false, false, true);
4500 if (h1 != NULL
4501 && (h1->root.type == bfd_link_hash_defined
4502 || h1->root.type == bfd_link_hash_defweak)
4503 && h1->root.u.def.section != NULL
4504 && h1->root.u.def.section->output_section != NULL)
4505 {
4506 pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size =
4507 ((h1->root.u.def.value
4508 + h1->root.u.def.section->output_section->vma
4509 + h1->root.u.def.section->output_offset)
4510 - iat_va);
4511 if (pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size != 0)
4512 pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress =
4513 iat_va - pe_data (abfd)->pe_opthdr.ImageBase;
4514 }
4515 else
4516 {
4517 _bfd_error_handler
4518 (_("%pB: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE(12)]"
4519 " because .idata$6 is missing"), abfd);
4520 result = false;
4521 }
4522 }
4523 }
4524
4525 h1 = coff_link_hash_lookup (coff_hash_table (info),
4526 (bfd_get_symbol_leading_char (abfd) != 0
4527 ? "__tls_used" : "_tls_used"),
4528 false, false, true);
4529 if (h1 != NULL)
4530 {
4531 if ((h1->root.type == bfd_link_hash_defined
4532 || h1->root.type == bfd_link_hash_defweak)
4533 && h1->root.u.def.section != NULL
4534 && h1->root.u.def.section->output_section != NULL)
4535 pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].VirtualAddress =
4536 (h1->root.u.def.value
4537 + h1->root.u.def.section->output_section->vma
4538 + h1->root.u.def.section->output_offset
4539 - pe_data (abfd)->pe_opthdr.ImageBase);
4540 else
4541 {
4542 _bfd_error_handler
4543 (_("%pB: unable to fill in DataDictionary[9] because __tls_used is missing"),
4544 abfd);
4545 result = false;
4546 }
4547 /* According to PECOFF sepcifications by Microsoft version 8.2
4548 the TLS data directory consists of 4 pointers, followed
4549 by two 4-byte integer. This implies that the total size
4550 is different for 32-bit and 64-bit executables. */
4551 #if !defined(COFF_WITH_pep) && !defined(COFF_WITH_pex64) && !defined(COFF_WITH_peAArch64) && !defined(COFF_WITH_peLoongArch64)
4552 pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].Size = 0x18;
4553 #else
4554 pe_data (abfd)->pe_opthdr.DataDirectory[PE_TLS_TABLE].Size = 0x28;
4555 #endif
4556 }
4557
4558 /* If there is a .pdata section and we have linked pdata finally, we
4559 need to sort the entries ascending. */
4560 #if !defined(COFF_WITH_pep) && (defined(COFF_WITH_pex64) || defined(COFF_WITH_peAArch64) || defined(COFF_WITH_peLoongArch64))
4561 {
4562 asection *sec = bfd_get_section_by_name (abfd, ".pdata");
4563
4564 if (sec)
4565 {
4566 bfd_size_type x = sec->rawsize;
4567 bfd_byte *tmp_data;
4568
4569 if (bfd_malloc_and_get_section (abfd, sec, &tmp_data))
4570 {
4571 qsort (tmp_data,
4572 (size_t) (x / 12),
4573 12, sort_x64_pdata);
4574 bfd_set_section_contents (pfinfo->output_bfd, sec,
4575 tmp_data, 0, x);
4576 free (tmp_data);
4577 }
4578 else
4579 result = false;
4580 }
4581 }
4582 #endif
4583
4584 rsrc_process_section (abfd, pfinfo);
4585
4586 /* If we couldn't find idata$2, we either have an excessively
4587 trivial program or are in DEEP trouble; we have to assume trivial
4588 program.... */
4589 return result;
4590 }