Index: src/bfd/coff-x86_64.c =================================================================== --- src.orig/bfd/coff-x86_64.c 2009-03-11 11:13:15.000000000 +0100 +++ src/bfd/coff-x86_64.c 2009-04-03 14:14:02.852970200 +0200 @@ -711,9 +711,8 @@ #endif /* TARGET_UNDERSCORE */ -#ifndef bfd_pe_print_pdata -#define bfd_pe_print_pdata NULL -#endif +#undef bfd_pe_print_pdata +#define bfd_pe_print_pdata _bfd_pep_print_x64_pdata #include "coffcode.h" Index: src/bfd/libpei.h =================================================================== --- src.orig/bfd/libpei.h 2009-03-11 11:16:22.000000000 +0100 +++ src/bfd/libpei.h 2009-04-03 14:14:02.852970200 +0200 @@ -393,4 +393,5 @@ bfd_boolean _bfd_pe64_print_ce_compressed_pdata (bfd *, void *); bfd_boolean _bfd_pex64_print_ce_compressed_pdata (bfd *, void *); bfd_boolean _bfd_pep_print_ce_compressed_pdata (bfd *, void *); +bfd_boolean _bfd_pep_print_x64_pdata (bfd *, void *); Index: src/bfd/peXXigen.c =================================================================== --- src.orig/bfd/peXXigen.c 2009-03-11 11:14:46.000000000 +0100 +++ src/bfd/peXXigen.c 2009-04-03 14:18:52.323572800 +0200 @@ -1894,6 +1894,86 @@ 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[] =