diff options
Diffstat (limited to 'bfd/peXXigen.c')
-rw-r--r-- | bfd/peXXigen.c | 57 |
1 files changed, 54 insertions, 3 deletions
diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c index 04b7419..22f2e3f 100644 --- a/bfd/peXXigen.c +++ b/bfd/peXXigen.c @@ -1219,10 +1219,58 @@ pe_print_idata (abfd, vfile) if (hint_addr != first_thunk && time_stamp == 0) { + bfd_byte *ft_data; + asection *ft_section; + bfd_vma ft_addr; + bfd_size_type ft_datasize; + int ft_idx; int differ = 0; - int idx2; + int ft_allocated = 0; - idx2 = first_thunk - adj; + ft_addr = first_thunk + extra->ImageBase; + + /* Find the section which contains the first thunk. */ + for (ft_section = abfd->sections; + ft_section != NULL; + ft_section = ft_section->next) + { + ft_datasize = bfd_section_size (abfd, ft_section); + if (ft_addr >= ft_section->vma + && ft_addr < ft_section->vma + ft_datasize) + break; + } + + if (ft_section == NULL) + { + fprintf (file, + _("\nThere is a first thunk, but the section containing it could not be found\n")); + continue; + } + + /* Now check to see if this section is the same as our current + section. If it is not then we will have to load its data in. */ + if (ft_section == section) + { + ft_data = data; + ft_idx = first_thunk - adj; + } + else + { + ft_idx = first_thunk - (ft_section->vma - extra->ImageBase); + ft_data = (bfd_byte *) bfd_malloc (datasize); + if (ft_data == NULL) + continue; + + /* Read datasize bfd_bytes starting at offset ft_idx. */ + if (! bfd_get_section_contents (abfd, ft_section, (PTR) ft_data, (bfd_vma) ft_idx, datasize)) + { + free (ft_data); + continue; + } + + ft_idx = 0; + ft_allocated = 1; + } for (j = 0; j < datasize; j += 4) { @@ -1233,7 +1281,7 @@ pe_print_idata (abfd, vfile) if (hint_addr != 0) hint_member = bfd_get_32 (abfd, data + idx + j); - iat_member = bfd_get_32 (abfd, data + idx2 + j); + iat_member = bfd_get_32 (abfd, ft_data + ft_idx + j); if (hint_addr == 0 && iat_member == 0) break; @@ -1269,6 +1317,9 @@ pe_print_idata (abfd, vfile) if (differ == 0) fprintf (file, _("\tThe Import Address Table is identical\n")); + + if (ft_allocated) + free (ft_data); } fprintf (file, "\n"); |