aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bfd/ChangeLog7
-rw-r--r--bfd/peXXigen.c22
2 files changed, 20 insertions, 9 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index 5c7d2f9..0728b7f 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,10 @@
+2005-07-29 Pavel Kankovsky <peak@argo.troja.mff.cuni.cz>
+
+ * peXXigen.c (pe_print_edata): Compute the size of the export
+ table from the size field in the DataDictionary and not the size
+ of the section. Some linkers embed the export table inside a
+ larger section.
+
2005-07-29 Alan Modra <amodra@bigpond.net.au>
* elf-bfd.h (struct elf_backend_data): Add action_discarded.
diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c
index 1be0846..652e45c 100644
--- a/bfd/peXXigen.c
+++ b/bfd/peXXigen.c
@@ -1346,6 +1346,7 @@ pe_print_edata (bfd * abfd, void * vfile)
return TRUE;
addr = section->vma;
+ dataoff = 0;
datasize = section->size;
if (datasize == 0)
return TRUE;
@@ -1355,12 +1356,8 @@ pe_print_edata (bfd * abfd, void * vfile)
addr += extra->ImageBase;
for (section = abfd->sections; section != NULL; section = section->next)
- {
- datasize = section->size;
-
- if (addr >= section->vma && addr < section->vma + datasize)
- break;
- }
+ if (addr >= section->vma && addr < section->vma + section->size)
+ break;
if (section == NULL)
{
@@ -1368,14 +1365,21 @@ pe_print_edata (bfd * abfd, void * vfile)
_("\nThere is an export table, but the section containing it could not be found\n"));
return TRUE;
}
+
+ dataoff = addr - section->vma;
+ datasize = extra->DataDirectory[0].Size;
+ if (datasize > section->size - dataoff)
+ {
+ fprintf (file,
+ _("\nThere is an export table in %s, but it does not fit into that section\n"),
+ section->name);
+ return TRUE;
+ }
}
fprintf (file, _("\nThere is an export table in %s at 0x%lx\n"),
section->name, (unsigned long) addr);
- dataoff = addr - section->vma;
- datasize -= dataoff;
-
data = bfd_malloc (datasize);
if (data == NULL)
return FALSE;