(Ada) Fix resolving of homonym components in tagged types
[binutils-gdb.git] / bfd / pei-x86_64.c
blob3a0248de2165079d819540a0da8add428325f08a
1 /* BFD back-end for Intel 386 PE IMAGE COFF files.
2 Copyright (C) 2006-2018 Free Software Foundation, Inc.
4 This file is part of BFD, the Binary File Descriptor library.
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 3 of the License, or
9 (at your option) any later version.
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
19 MA 02110-1301, USA.
21 Written by Kai Tietz, OneVision Software GmbH&CoKg. */
23 #include "sysdep.h"
24 #include "bfd.h"
26 #define TARGET_SYM x86_64_pei_vec
27 #define TARGET_NAME "pei-x86-64"
28 #define COFF_IMAGE_WITH_PE
29 #define COFF_WITH_PE
30 #define COFF_WITH_pex64
31 #define PCRELOFFSET TRUE
32 #if defined (USE_MINGW64_LEADING_UNDERSCORES)
33 #define TARGET_UNDERSCORE '_'
34 #else
35 #define TARGET_UNDERSCORE 0
36 #endif
37 /* Long section names not allowed in executable images, only object files. */
38 #define COFF_LONG_SECTION_NAMES 0
39 #define COFF_SUPPORT_GNU_LINKONCE
40 #define COFF_LONG_FILENAMES
41 #define PDATA_ROW_SIZE (3 * 4)
43 #define COFF_SECTION_ALIGNMENT_ENTRIES \
44 { COFF_SECTION_NAME_EXACT_MATCH (".bss"), \
45 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
46 { COFF_SECTION_NAME_PARTIAL_MATCH (".data"), \
47 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
48 { COFF_SECTION_NAME_PARTIAL_MATCH (".rdata"), \
49 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
50 { COFF_SECTION_NAME_PARTIAL_MATCH (".text"), \
51 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 4 }, \
52 { COFF_SECTION_NAME_PARTIAL_MATCH (".idata"), \
53 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
54 { COFF_SECTION_NAME_EXACT_MATCH (".pdata"), \
55 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 2 }, \
56 { COFF_SECTION_NAME_PARTIAL_MATCH (".debug"), \
57 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }, \
58 { COFF_SECTION_NAME_PARTIAL_MATCH (".gnu.linkonce.wi."), \
59 COFF_ALIGNMENT_FIELD_EMPTY, COFF_ALIGNMENT_FIELD_EMPTY, 0 }
61 /* Note we have to make sure not to include headers twice.
62 Not all headers are wrapped in #ifdef guards, so we define
63 PEI_HEADERS to prevent double including in coff-x86_64.c */
64 #define PEI_HEADERS
65 #include "sysdep.h"
66 #include "bfd.h"
67 #include "libbfd.h"
68 #include "coff/x86_64.h"
69 #include "coff/internal.h"
70 #include "coff/pe.h"
71 #include "libcoff.h"
72 #include "libpei.h"
73 #include "libiberty.h"
75 #undef AOUTSZ
76 #define AOUTSZ PEPAOUTSZ
77 #define PEAOUTHDR PEPAOUTHDR
79 /* Name of registers according to SEH conventions. */
81 static const char * const pex_regs[16] = {
82 "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
83 "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
86 /* Swap in a runtime function. */
88 static void
89 pex64_get_runtime_function (bfd *abfd, struct pex64_runtime_function *rf,
90 const void *data)
92 const struct external_pex64_runtime_function *ex_rf =
93 (const struct external_pex64_runtime_function *) data;
94 rf->rva_BeginAddress = bfd_get_32 (abfd, ex_rf->rva_BeginAddress);
95 rf->rva_EndAddress = bfd_get_32 (abfd, ex_rf->rva_EndAddress);
96 rf->rva_UnwindData = bfd_get_32 (abfd, ex_rf->rva_UnwindData);
99 /* Swap in unwind info header. */
101 static bfd_boolean
102 pex64_get_unwind_info (bfd *abfd, struct pex64_unwind_info *ui,
103 void *data, void *data_end)
105 struct external_pex64_unwind_info *ex_ui =
106 (struct external_pex64_unwind_info *) data;
107 bfd_byte *ex_dta = (bfd_byte *) data;
108 bfd_byte *ex_dta_end = (bfd_byte *) data_end;
110 memset (ui, 0, sizeof (struct pex64_unwind_info));
112 if (ex_dta >= ex_dta_end || ex_dta + 4 >= ex_dta_end)
113 return FALSE;
115 ui->Version = PEX64_UWI_VERSION (ex_ui->Version_Flags);
116 ui->Flags = PEX64_UWI_FLAGS (ex_ui->Version_Flags);
117 ui->SizeOfPrologue = (bfd_vma) ex_ui->SizeOfPrologue;
118 ui->CountOfCodes = (bfd_vma) ex_ui->CountOfCodes;
119 ui->FrameRegister = PEX64_UWI_FRAMEREG (ex_ui->FrameRegisterOffset);
120 ui->FrameOffset = PEX64_UWI_FRAMEOFF (ex_ui->FrameRegisterOffset);
121 ui->sizeofUnwindCodes = PEX64_UWI_SIZEOF_UWCODE_ARRAY (ui->CountOfCodes);
122 ui->SizeOfBlock = ui->sizeofUnwindCodes + 4;
123 ui->rawUnwindCodes = ex_dta + 4;
124 ui->rawUnwindCodesEnd = ex_dta_end;
126 ex_dta += ui->SizeOfBlock;
127 if (ex_dta >= ex_dta_end)
128 return FALSE;
130 switch (ui->Flags)
132 case UNW_FLAG_CHAININFO:
133 if (ex_dta + 12 >= ex_dta_end)
134 return FALSE;
135 ui->rva_BeginAddress = bfd_get_32 (abfd, ex_dta + 0);
136 ui->rva_EndAddress = bfd_get_32 (abfd, ex_dta + 4);
137 ui->rva_UnwindData = bfd_get_32 (abfd, ex_dta + 8);
138 ui->SizeOfBlock += 12;
139 return TRUE;
140 case UNW_FLAG_EHANDLER:
141 case UNW_FLAG_UHANDLER:
142 case UNW_FLAG_FHANDLER:
143 if (ex_dta + 4 >= ex_dta_end)
144 return FALSE;
145 ui->rva_ExceptionHandler = bfd_get_32 (abfd, ex_dta);
146 ui->SizeOfBlock += 4;
147 return TRUE;
148 default:
149 return TRUE;
153 /* Display unwind codes. */
155 static void
156 pex64_xdata_print_uwd_codes (FILE *file, bfd *abfd,
157 struct pex64_unwind_info *ui,
158 struct pex64_runtime_function *rf)
160 unsigned int i;
161 unsigned int tmp; /* At least 32 bits. */
162 int save_allowed;
164 if (ui->CountOfCodes == 0 || ui->rawUnwindCodes == NULL)
165 return;
167 /* According to UNWIND_CODE documentation:
168 If an FP reg is used, the any unwind code taking an offset must only be
169 used after the FP reg is established in the prolog.
170 But there are counter examples of that in system dlls... */
171 save_allowed = TRUE;
173 i = 0;
175 if (ui->rawUnwindCodes + 1 >= ui->rawUnwindCodesEnd)
177 fprintf (file, _("warning: corrupt unwind data\n"));
178 return;
181 if (ui->Version == 2
182 && PEX64_UNWCODE_CODE (ui->rawUnwindCodes[1]) == UWOP_EPILOG)
184 /* Display epilog opcode (whose docoding is not fully documented).
185 Looks to be designed to speed-up unwinding, as there is no need
186 to decode instruction flow if outside an epilog. */
187 unsigned int func_size = rf->rva_EndAddress - rf->rva_BeginAddress;
189 if (ui->rawUnwindCodes + 1 + (ui->CountOfCodes * 2) >= ui->rawUnwindCodesEnd)
191 fprintf (file, _("warning: corrupt unwind data\n"));
192 return;
195 fprintf (file, "\tv2 epilog (length: %02x) at pc+:",
196 ui->rawUnwindCodes[0]);
198 if (PEX64_UNWCODE_INFO (ui->rawUnwindCodes[1]))
199 fprintf (file, " 0x%x", func_size - ui->rawUnwindCodes[0]);
201 i++;
202 for (; i < ui->CountOfCodes; i++)
204 const bfd_byte *dta = ui->rawUnwindCodes + 2 * i;
205 unsigned int off;
207 if (PEX64_UNWCODE_CODE (dta[1]) != UWOP_EPILOG)
208 break;
209 off = dta[0] | (PEX64_UNWCODE_INFO (dta[1]) << 8);
210 if (off == 0)
211 fprintf (file, " [pad]");
212 else
213 fprintf (file, " 0x%x", func_size - off);
215 fputc ('\n', file);
218 if (ui->rawUnwindCodes + 2 + (ui->CountOfCodes * 2) >= ui->rawUnwindCodesEnd)
220 fprintf (file, _("warning: corrupt unwind data\n"));
221 return;
224 for (; i < ui->CountOfCodes; i++)
226 const bfd_byte *dta = ui->rawUnwindCodes + 2 * i;
227 unsigned int info = PEX64_UNWCODE_INFO (dta[1]);
228 int unexpected = FALSE;
230 fprintf (file, "\t pc+0x%02x: ", (unsigned int) dta[0]);
231 switch (PEX64_UNWCODE_CODE (dta[1]))
233 case UWOP_PUSH_NONVOL:
234 fprintf (file, "push %s", pex_regs[info]);
235 break;
236 case UWOP_ALLOC_LARGE:
237 if (info == 0)
239 tmp = bfd_get_16 (abfd, &dta[2]) * 8;
240 i++;
242 else
244 tmp = bfd_get_32 (abfd, &dta[2]);
245 i += 2;
247 fprintf (file, "alloc large area: rsp = rsp - 0x%x", tmp);
248 break;
249 case UWOP_ALLOC_SMALL:
250 fprintf (file, "alloc small area: rsp = rsp - 0x%x", (info + 1) * 8);
251 break;
252 case UWOP_SET_FPREG:
253 /* According to the documentation, info field is unused. */
254 fprintf (file, "FPReg: %s = rsp + 0x%x (info = 0x%x)",
255 pex_regs[ui->FrameRegister],
256 (unsigned int) ui->FrameOffset * 16, info);
257 unexpected = ui->FrameRegister == 0;
258 save_allowed = FALSE;
259 break;
260 case UWOP_SAVE_NONVOL:
261 tmp = bfd_get_16 (abfd, &dta[2]) * 8;
262 i++;
263 fprintf (file, "save %s at rsp + 0x%x", pex_regs[info], tmp);
264 unexpected = !save_allowed;
265 break;
266 case UWOP_SAVE_NONVOL_FAR:
267 tmp = bfd_get_32 (abfd, &dta[2]);
268 i += 2;
269 fprintf (file, "save %s at rsp + 0x%x", pex_regs[info], tmp);
270 unexpected = !save_allowed;
271 break;
272 case UWOP_SAVE_XMM:
273 if (ui->Version == 1)
275 tmp = bfd_get_16 (abfd, &dta[2]) * 8;
276 i++;
277 fprintf (file, "save mm%u at rsp + 0x%x", info, tmp);
278 unexpected = !save_allowed;
280 else if (ui->Version == 2)
282 fprintf (file, "epilog %02x %01x", dta[0], info);
283 unexpected = TRUE;
285 break;
286 case UWOP_SAVE_XMM_FAR:
287 tmp = bfd_get_32 (abfd, &dta[2]) * 8;
288 i += 2;
289 fprintf (file, "save mm%u at rsp + 0x%x", info, tmp);
290 unexpected = !save_allowed;
291 break;
292 case UWOP_SAVE_XMM128:
293 tmp = bfd_get_16 (abfd, &dta[2]) * 16;
294 i++;
295 fprintf (file, "save xmm%u at rsp + 0x%x", info, tmp);
296 unexpected = !save_allowed;
297 break;
298 case UWOP_SAVE_XMM128_FAR:
299 tmp = bfd_get_32 (abfd, &dta[2]) * 16;
300 i += 2;
301 fprintf (file, "save xmm%u at rsp + 0x%x", info, tmp);
302 unexpected = !save_allowed;
303 break;
304 case UWOP_PUSH_MACHFRAME:
305 fprintf (file, "interrupt entry (SS, old RSP, EFLAGS, CS, RIP");
306 if (info == 0)
307 fprintf (file, ")");
308 else if (info == 1)
309 fprintf (file, ",ErrorCode)");
310 else
311 fprintf (file, ", unknown(%u))", info);
312 break;
313 default:
314 /* PR 17512: file: 2245-7442-0.004. */
315 fprintf (file, _("Unknown: %x"), PEX64_UNWCODE_CODE (dta[1]));
316 break;
318 if (unexpected)
319 fprintf (file, " [Unexpected!]");
320 fputc ('\n', file);
324 /* Check wether section SEC_NAME contains the xdata at address ADDR. */
326 static asection *
327 pex64_get_section_by_rva (bfd *abfd, bfd_vma addr, const char *sec_name)
329 asection *section = bfd_get_section_by_name (abfd, sec_name);
330 bfd_vma vsize;
331 bfd_size_type datasize = 0;
333 if (section == NULL
334 || coff_section_data (abfd, section) == NULL
335 || pei_section_data (abfd, section) == NULL)
336 return NULL;
337 vsize = section->vma - pe_data (abfd)->pe_opthdr.ImageBase;
338 datasize = section->size;
339 if (!datasize || vsize > addr || (vsize + datasize) < addr)
340 return NULL;
341 return section;
344 /* Dump xdata at for function RF to FILE. The argument XDATA_SECTION
345 designate the bfd section containing the xdata, XDATA is its content,
346 and ENDX the size if known (or NULL). */
348 static void
349 pex64_dump_xdata (FILE *file, bfd *abfd,
350 asection *xdata_section, bfd_byte *xdata, bfd_vma *endx,
351 struct pex64_runtime_function *rf)
353 bfd_vma vaddr;
354 bfd_vma end_addr;
355 bfd_vma addr = rf->rva_UnwindData;
356 bfd_size_type sec_size = xdata_section->rawsize > 0 ? xdata_section->rawsize : xdata_section->size;
357 struct pex64_unwind_info ui;
359 vaddr = xdata_section->vma - pe_data (abfd)->pe_opthdr.ImageBase;
360 addr -= vaddr;
362 /* PR 17512: file: 2245-7442-0.004. */
363 if (addr >= sec_size)
365 fprintf (file, _("warning: xdata section corrupt\n"));
366 return;
369 if (endx)
371 end_addr = endx[0] - vaddr;
372 /* PR 17512: file: 2245-7442-0.004. */
373 if (end_addr > sec_size)
375 fprintf (file, _("warning: xdata section corrupt\n"));
376 end_addr = sec_size;
379 else
380 end_addr = sec_size;
382 if (! pex64_get_unwind_info (abfd, &ui, xdata + addr, xdata + end_addr))
384 fprintf (file, _("warning: xdata section corrupt\n"));
385 return;
388 if (ui.Version != 1 && ui.Version != 2)
390 unsigned int i;
391 fprintf (file, "\tVersion %u (unknown).\n",
392 (unsigned int) ui.Version);
393 for (i = 0; addr < end_addr; addr += 1, i++)
395 if ((i & 15) == 0)
396 fprintf (file, "\t %03x:", i);
397 fprintf (file, " %02x", xdata[addr]);
398 if ((i & 15) == 15)
399 fprintf (file, "\n");
401 if ((i & 15) != 0)
402 fprintf (file, "\n");
403 return;
406 fprintf (file, "\tVersion: %d, Flags: ", ui.Version);
407 switch (ui.Flags)
409 case UNW_FLAG_NHANDLER:
410 fprintf (file, "none");
411 break;
412 case UNW_FLAG_EHANDLER:
413 fprintf (file, "UNW_FLAG_EHANDLER");
414 break;
415 case UNW_FLAG_UHANDLER:
416 fprintf (file, "UNW_FLAG_UHANDLER");
417 break;
418 case UNW_FLAG_FHANDLER:
419 fprintf
420 (file, "UNW_FLAG_EHANDLER | UNW_FLAG_UHANDLER");
421 break;
422 case UNW_FLAG_CHAININFO:
423 fprintf (file, "UNW_FLAG_CHAININFO");
424 break;
425 default:
426 fprintf (file, "unknown flags value 0x%x", (unsigned int) ui.Flags);
427 break;
429 fputc ('\n', file);
430 fprintf (file, "\tNbr codes: %u, ", (unsigned int) ui.CountOfCodes);
431 fprintf (file, "Prologue size: 0x%02x, Frame offset: 0x%x, ",
432 (unsigned int) ui.SizeOfPrologue, (unsigned int) ui.FrameOffset);
433 fprintf (file, "Frame reg: %s\n",
434 ui.FrameRegister == 0 ? "none"
435 : pex_regs[(unsigned int) ui.FrameRegister]);
437 /* PR 17512: file: 2245-7442-0.004. */
438 if (ui.CountOfCodes * 2 + ui.rawUnwindCodes > xdata + xdata_section->size)
439 fprintf (file, _("Too many unwind codes (%ld)\n"), (long) ui.CountOfCodes);
440 else
441 pex64_xdata_print_uwd_codes (file, abfd, &ui, rf);
443 switch (ui.Flags)
445 case UNW_FLAG_EHANDLER:
446 case UNW_FLAG_UHANDLER:
447 case UNW_FLAG_FHANDLER:
448 fprintf (file, "\tHandler: ");
449 fprintf_vma (file, (ui.rva_ExceptionHandler
450 + pe_data (abfd)->pe_opthdr.ImageBase));
451 fprintf (file, ".\n");
452 break;
453 case UNW_FLAG_CHAININFO:
454 fprintf (file, "\tChain: start: ");
455 fprintf_vma (file, ui.rva_BeginAddress);
456 fprintf (file, ", end: ");
457 fprintf_vma (file, ui.rva_EndAddress);
458 fprintf (file, "\n\t unwind data: ");
459 fprintf_vma (file, ui.rva_UnwindData);
460 fprintf (file, ".\n");
461 break;
464 /* Now we need end of this xdata block. */
465 addr += ui.SizeOfBlock;
466 if (addr < end_addr)
468 unsigned int i;
469 fprintf (file,"\tUser data:\n");
470 for (i = 0; addr < end_addr; addr += 1, i++)
472 if ((i & 15) == 0)
473 fprintf (file, "\t %03x:", i);
474 fprintf (file, " %02x", xdata[addr]);
475 if ((i & 15) == 15)
476 fprintf (file, "\n");
478 if ((i & 15) != 0)
479 fprintf (file, "\n");
483 /* Helper function to sort xdata. The entries of xdata are sorted to know
484 the size of each entry. */
486 static int
487 sort_xdata_arr (const void *l, const void *r)
489 const bfd_vma *lp = (const bfd_vma *) l;
490 const bfd_vma *rp = (const bfd_vma *) r;
492 if (*lp == *rp)
493 return 0;
494 return (*lp < *rp ? -1 : 1);
497 /* Display unwind tables for x86-64. */
499 static bfd_boolean
500 pex64_bfd_print_pdata_section (bfd *abfd, void *vfile, asection *pdata_section)
502 FILE *file = (FILE *) vfile;
503 bfd_byte *pdata = NULL;
504 bfd_byte *xdata = NULL;
505 asection *xdata_section = NULL;
506 bfd_vma xdata_base;
507 bfd_size_type i;
508 bfd_size_type datasize;
509 bfd_size_type stop;
510 bfd_vma prev_beginaddress = (bfd_vma) -1;
511 bfd_vma prev_unwinddata_rva = (bfd_vma) -1;
512 bfd_vma imagebase;
513 int onaline = PDATA_ROW_SIZE;
514 int seen_error = 0;
515 bfd_vma *xdata_arr = NULL;
516 int xdata_arr_cnt;
517 bfd_boolean virt_size_is_zero = FALSE;
519 /* Sanity checks. */
520 if (pdata_section == NULL
521 || coff_section_data (abfd, pdata_section) == NULL
522 || pei_section_data (abfd, pdata_section) == NULL)
523 return TRUE;
525 stop = pei_section_data (abfd, pdata_section)->virt_size;
526 if ((stop % onaline) != 0)
527 fprintf (file,
528 /* xgettext:c-format */
529 _("Warning: %s section size (%ld) is not a multiple of %d\n"),
530 pdata_section->name, (long) stop, onaline);
532 datasize = pdata_section->size;
533 if (datasize == 0)
535 if (stop)
536 fprintf (file, _("Warning: %s section size is zero\n"),
537 pdata_section->name);
538 return TRUE;
541 /* virt_size might be zero for objects. */
542 if (stop == 0 && strcmp (abfd->xvec->name, "pe-x86-64") == 0)
544 stop = (datasize / onaline) * onaline;
545 virt_size_is_zero = TRUE;
547 else if (datasize < stop)
549 fprintf (file,
550 /* xgettext:c-format */
551 _("Warning: %s section size (%ld) is smaller than virtual size (%ld)\n"),
552 pdata_section->name, (unsigned long) datasize,
553 (unsigned long) stop);
554 /* Be sure not to read passed datasize. */
555 stop = datasize / onaline;
558 /* Display functions table. */
559 fprintf (file,
560 _("\nThe Function Table (interpreted %s section contents)\n"),
561 pdata_section->name);
563 fprintf (file, _("vma:\t\t\tBeginAddress\t EndAddress\t UnwindData\n"));
565 if (!bfd_malloc_and_get_section (abfd, pdata_section, &pdata))
566 goto done;
568 /* Table of xdata entries. */
569 xdata_arr = (bfd_vma *) xmalloc (sizeof (bfd_vma) * ((stop / onaline) + 1));
570 xdata_arr_cnt = 0;
572 if (strcmp (abfd->xvec->name, "pei-x86-64") == 0)
573 imagebase = pe_data (abfd)->pe_opthdr.ImageBase;
574 else
575 imagebase = 0;
577 for (i = 0; i < stop; i += onaline)
579 struct pex64_runtime_function rf;
581 if (i + PDATA_ROW_SIZE > stop)
582 break;
584 pex64_get_runtime_function (abfd, &rf, &pdata[i]);
586 if (rf.rva_BeginAddress == 0 && rf.rva_EndAddress == 0
587 && rf.rva_UnwindData == 0)
588 /* We are probably into the padding of the section now. */
589 break;
590 fputc (' ', file);
591 fprintf_vma (file, i + pdata_section->vma);
592 fprintf (file, ":\t");
593 fprintf_vma (file, imagebase + rf.rva_BeginAddress);
594 fprintf (file, " ");
595 fprintf_vma (file, imagebase + rf.rva_EndAddress);
596 fprintf (file, " ");
597 fprintf_vma (file, imagebase + rf.rva_UnwindData);
598 fprintf (file, "\n");
599 if (i != 0 && rf.rva_BeginAddress <= prev_beginaddress)
601 seen_error = 1;
602 fprintf (file, " has %s begin address as predecessor\n",
603 (rf.rva_BeginAddress < prev_beginaddress ? "smaller" : "same"));
605 prev_beginaddress = rf.rva_BeginAddress;
606 /* Now we check for negative addresses. */
607 if ((prev_beginaddress & 0x80000000) != 0)
609 seen_error = 1;
610 fprintf (file, " has negative begin address\n");
612 if ((rf.rva_EndAddress & 0x80000000) != 0)
614 seen_error = 1;
615 fprintf (file, " has negative end address\n");
617 if ((rf.rva_UnwindData & 0x80000000) != 0)
619 seen_error = 1;
620 fprintf (file, " has negative unwind address\n");
622 else if ((rf.rva_UnwindData && !PEX64_IS_RUNTIME_FUNCTION_CHAINED (&rf))
623 || virt_size_is_zero)
624 xdata_arr[xdata_arr_cnt++] = rf.rva_UnwindData;
627 if (seen_error)
628 goto done;
630 /* Add end of list marker. */
631 xdata_arr[xdata_arr_cnt++] = ~((bfd_vma) 0);
633 /* Sort start RVAs of xdata. */
634 if (xdata_arr_cnt > 1)
635 qsort (xdata_arr, (size_t) xdata_arr_cnt, sizeof (bfd_vma),
636 sort_xdata_arr);
638 /* Find the section containing the unwind data (.xdata). */
639 xdata_base = xdata_arr[0];
640 /* For sections with long names, first look for the same
641 section name, replacing .pdata by .xdata prefix. */
642 if (strcmp (pdata_section->name, ".pdata") != 0)
644 size_t len = strlen (pdata_section->name);
645 char *xdata_name = xmalloc (len + 1);
647 xdata_name = memcpy (xdata_name, pdata_section->name, len + 1);
648 /* Transform .pdata prefix into .xdata prefix. */
649 if (len > 1)
650 xdata_name [1] = 'x';
651 xdata_section = pex64_get_section_by_rva (abfd, xdata_base,
652 xdata_name);
653 free (xdata_name);
655 /* Second, try the .xdata section itself. */
656 if (!xdata_section)
657 xdata_section = pex64_get_section_by_rva (abfd, xdata_base, ".xdata");
658 /* Otherwise, if xdata_base is non zero, search also inside
659 other standard sections. */
660 if (!xdata_section && xdata_base)
661 xdata_section = pex64_get_section_by_rva (abfd, xdata_base, ".rdata");
662 if (!xdata_section && xdata_base)
663 xdata_section = pex64_get_section_by_rva (abfd, xdata_base, ".data");
664 if (!xdata_section && xdata_base)
665 xdata_section = pex64_get_section_by_rva (abfd, xdata_base, ".pdata");
666 if (!xdata_section && xdata_base)
667 xdata_section = pex64_get_section_by_rva (abfd, xdata_base, ".text");
668 /* Transfer xdata section into xdata array. */
669 if (!xdata_section
670 || !bfd_malloc_and_get_section (abfd, xdata_section, &xdata))
671 goto done;
673 /* Avoid "also used "... ouput for single unwind info
674 in object file. */
675 prev_unwinddata_rva = (bfd_vma) -1;
677 /* Do dump of pdata related xdata. */
678 for (i = 0; i < stop; i += onaline)
680 struct pex64_runtime_function rf;
682 if (i + PDATA_ROW_SIZE > stop)
683 break;
685 pex64_get_runtime_function (abfd, &rf, &pdata[i]);
687 if (rf.rva_BeginAddress == 0 && rf.rva_EndAddress == 0
688 && rf.rva_UnwindData == 0)
689 /* We are probably into the padding of the section now. */
690 break;
691 if (i == 0)
692 fprintf (file, _("\nDump of %s\n"), xdata_section->name);
694 fputc (' ', file);
695 fprintf_vma (file, rf.rva_UnwindData + imagebase);
697 if (prev_unwinddata_rva == rf.rva_UnwindData)
699 /* Do not dump again the xdata for the same entry. */
700 fprintf (file, " also used for function at ");
701 fprintf_vma (file, rf.rva_BeginAddress + imagebase);
702 fputc ('\n', file);
703 continue;
705 else
706 prev_unwinddata_rva = rf.rva_UnwindData;
708 fprintf (file, " (rva: %08x): ",
709 (unsigned int) rf.rva_UnwindData);
710 fprintf_vma (file, rf.rva_BeginAddress + imagebase);
711 fprintf (file, " - ");
712 fprintf_vma (file, rf.rva_EndAddress + imagebase);
713 fputc ('\n', file);
715 if (rf.rva_UnwindData != 0 || virt_size_is_zero)
717 if (PEX64_IS_RUNTIME_FUNCTION_CHAINED (&rf))
719 bfd_vma altent = PEX64_GET_UNWINDDATA_UNIFIED_RVA (&rf);
720 bfd_vma pdata_vma = bfd_get_section_vma (abfd, pdata_section);
721 struct pex64_runtime_function arf;
723 fprintf (file, "\t shares information with ");
724 altent += imagebase;
726 if (altent >= pdata_vma
727 && (altent + PDATA_ROW_SIZE <= pdata_vma
728 + pei_section_data (abfd, pdata_section)->virt_size))
730 pex64_get_runtime_function
731 (abfd, &arf, &pdata[altent - pdata_vma]);
732 fprintf (file, "pdata element at 0x");
733 fprintf_vma (file, arf.rva_UnwindData);
735 else
736 fprintf (file, "unknown pdata element");
737 fprintf (file, ".\n");
739 else
741 bfd_vma *p;
743 /* Search for the current entry in the sorted array. */
744 p = (bfd_vma *)
745 bsearch (&rf.rva_UnwindData, xdata_arr,
746 (size_t) xdata_arr_cnt, sizeof (bfd_vma),
747 sort_xdata_arr);
749 /* Advance to the next pointer into the xdata section. We may
750 have shared xdata entries, which will result in a string of
751 identical pointers in the array; advance past all of them. */
752 while (p[0] <= rf.rva_UnwindData)
753 ++p;
755 if (p[0] == ~((bfd_vma) 0))
756 p = NULL;
758 pex64_dump_xdata (file, abfd, xdata_section, xdata, p, &rf);
763 done:
764 free (pdata);
765 free (xdata_arr);
766 free (xdata);
768 return TRUE;
771 /* Static counter of number of found pdata sections. */
772 static bfd_boolean pdata_count;
774 /* Functionn prototype. */
775 bfd_boolean pex64_bfd_print_pdata (bfd *, void *);
777 /* Helper function for bfd_map_over_section. */
778 static void
779 pex64_print_all_pdata_sections (bfd *abfd, asection *pdata, void *obj)
781 if (CONST_STRNEQ (pdata->name, ".pdata"))
783 if (pex64_bfd_print_pdata_section (abfd, obj, pdata))
784 pdata_count++;
788 bfd_boolean
789 pex64_bfd_print_pdata (bfd *abfd, void *vfile)
791 asection *pdata_section = bfd_get_section_by_name (abfd, ".pdata");
793 if (pdata_section)
794 return pex64_bfd_print_pdata_section (abfd, vfile, pdata_section);
796 pdata_count = 0;
797 bfd_map_over_sections (abfd, pex64_print_all_pdata_sections, vfile);
798 return (pdata_count > 0);
801 #define bfd_pe_print_pdata pex64_bfd_print_pdata
802 #define bfd_coff_std_swap_table bfd_coff_pei_swap_table
804 #include "coff-x86_64.c"