OSDN Git Service

* peXXigen.c (pe_print_edata): Compute the size of the export table from the
authornickc <nickc>
Fri, 29 Jul 2005 14:06:56 +0000 (14:06 +0000)
committernickc <nickc>
Fri, 29 Jul 2005 14:06:56 +0000 (14:06 +0000)
  size field in the DataDictionary and not the size of the section.  Some
  linkers embed the export table inside a larger section.

bfd/ChangeLog
bfd/peXXigen.c

index 5c7d2f9..0728b7f 100644 (file)
@@ -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.
index 1be0846..652e45c 100644 (file)
@@ -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;