From f51e82052dd189ceeebbd2b89390a2ad6ed5cd23 Mon Sep 17 00:00:00 2001 From: Kai Tietz Date: Sun, 5 Apr 2009 18:12:21 +0000 Subject: 2009-04-05 Kai Tietz * coff-x86_64.c (bfd_pe_print_pdata): Define as _bfd_pep_print_x64_pdata. * libpei.h (_bfd_pep_print_x64_pdata): Add prototype. * peXXigen.c (_bfd_pep_print_x64_pdata): New. --- bfd/peXXigen.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) (limited to 'bfd/peXXigen.c') diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c index 6cdcf34306..a95af9cd86 100644 --- a/bfd/peXXigen.c +++ b/bfd/peXXigen.c @@ -1894,6 +1894,86 @@ _bfd_XX_print_ce_compressed_pdata (bfd * abfd, void * vfile) return TRUE; #undef PDATA_ROW_SIZE } + +/* The PE+ x64 variant. */ +bfd_boolean +_bfd_pep_print_x64_pdata (bfd *abfd, void *vfile) +{ +# define PDATA_ROW_SIZE (3 * 4) + FILE *file = (FILE *) vfile; + bfd_byte *data = NULL; + asection *section = bfd_get_section_by_name (abfd, ".pdata"); + bfd_size_type datasize = 0; + bfd_size_type i; + bfd_size_type start, stop; + int onaline = PDATA_ROW_SIZE; + struct sym_cache sym_cache = {0, 0}; + + if (section == NULL + || coff_section_data (abfd, section) == NULL + || pei_section_data (abfd, section) == NULL) + return TRUE; + + stop = pei_section_data (abfd, section)->virt_size; + if ((stop % onaline) != 0) + fprintf (file, + _("warning: .pdata section size (%ld) is not a multiple of %d\n"), + (long) stop, onaline); + + fprintf (file, + _("\nThe Function Table (interpreted .pdata section contents)\n")); + + fprintf (file, _("vma:\t\t\tBeginAddress\t EndAddress\t UnwindData\n")); + + datasize = section->size; + if (datasize == 0) + return TRUE; + + if (!bfd_malloc_and_get_section (abfd, section, &data)) + { + if (data != NULL) + free (data); + return FALSE; + } + + start = 0; + + for (i = start; i < stop; i += onaline) + { + bfd_vma begin_addr; + bfd_vma end_addr; + bfd_vma unwind_data_addr; + + if (i + PDATA_ROW_SIZE > stop) + break; + + begin_addr = bfd_get_32 (abfd, data + i); + end_addr = bfd_get_32 (abfd, data + i + 4); + unwind_data_addr = bfd_get_32 (abfd, data + i + 8); + + if (begin_addr == 0 && end_addr == 0 && unwind_data_addr == 0) + /* We are probably into the padding of the section now. */ + break; + + fputc (' ', file); + fprintf_vma (file, i + section->vma); + fprintf (file, ":\t"); + fprintf_vma (file, begin_addr); + fputc (' ', file); + fprintf_vma (file, end_addr); + fputc (' ', file); + fprintf_vma (file, unwind_data_addr); + + fprintf (file, "\n"); + } + + free (data); + + cleanup_syms (&sym_cache); + + return TRUE; +#undef PDATA_ROW_SIZE +} #define IMAGE_REL_BASED_HIGHADJ 4 static const char * const tbl[] = -- cgit v1.2.1