2009-04-05 Kai Tietz <kai.tietz@onevision.com>

* 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.
This commit is contained in:
Kai Tietz 2009-04-05 18:12:21 +00:00
parent bab7ee3b35
commit c7c7219d3a
4 changed files with 90 additions and 3 deletions

View File

@ -1,3 +1,10 @@
2009-04-05 Kai Tietz <kai.tietz@onevision.com>
* 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.
2009-04-02 Sterling Augustine <sterling@jaw.hq.tensilica.com>
* elf32-xtensa.c (relax_property_section): Always set r_offset

View File

@ -711,9 +711,8 @@ coff_amd64_is_local_label_name (bfd *abfd, const char *name)
#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"

View File

@ -393,4 +393,5 @@ bfd_boolean _bfd_pe_print_ce_compressed_pdata (bfd *, void *);
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 *);

View File

@ -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[] =