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