2010-09-22 Kai Tietz <kai.tietz@onevision.com>
authorKai Tietz <kai.tietz@onevision.com>
Wed, 22 Sep 2010 08:01:56 +0000 (08:01 +0000)
committerKai Tietz <kai.tietz@onevision.com>
Wed, 22 Sep 2010 08:01:56 +0000 (08:01 +0000)
        * peXXigen.c (_bfd_XXi_final_link_postscript):
        Add handling for setting IAT directory entry.

bfd/ChangeLog
bfd/peXXigen.c

index 469fa17a6de479e16c02bb5d84cb6d0bd0b8f4d9..c2cd439f05fe6de60b6bdd6fe890578f72d902d1 100644 (file)
@@ -1,3 +1,8 @@
+2010-09-22  Kai Tietz  <kai.tietz@onevision.com>
+
+       * peXXigen.c (_bfd_XXi_final_link_postscript):
+       Add handling for setting IAT directory entry.
+
 2010-09-20  Richard Henderson  <rth@redhat.com>
 
        * elf64-alpha.c (elf64_alpha_howto_table): Use bfd_elf_generic_reloc.
index 8f351bacb32780d266c691be834fffc100b0af61..a5b7f68b902d91229dcd820fbc09993955f29a97 100644 (file)
@@ -2373,6 +2373,49 @@ _bfd_XXi_final_link_postscript (bfd * abfd, struct coff_final_link_info *pfinfo)
          result = FALSE;
        }
     }
+  else
+    {
+      h1 = coff_link_hash_lookup (coff_hash_table (info),
+                                 "__IAT_start__", FALSE, FALSE, TRUE);
+      if (h1 != NULL
+         && (h1->root.type == bfd_link_hash_defined
+          || h1->root.type == bfd_link_hash_defweak)
+         && h1->root.u.def.section != NULL
+         && h1->root.u.def.section->output_section != NULL)
+       {
+         bfd_vma iat_va;
+
+         iat_va =
+           (h1->root.u.def.value
+            + h1->root.u.def.section->output_section->vma
+            + h1->root.u.def.section->output_offset);
+
+         h1 = coff_link_hash_lookup (coff_hash_table (info),
+                                     "__IAT_end__", FALSE, FALSE, TRUE);
+         if (h1 != NULL
+             && (h1->root.type == bfd_link_hash_defined
+              || h1->root.type == bfd_link_hash_defweak)
+             && h1->root.u.def.section != NULL
+             && h1->root.u.def.section->output_section != NULL)
+           {
+             pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size =
+               ((h1->root.u.def.value
+                 + h1->root.u.def.section->output_section->vma
+                 + h1->root.u.def.section->output_offset)
+                - iat_va);
+             if (pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].Size != 0)
+               pe_data (abfd)->pe_opthdr.DataDirectory[PE_IMPORT_ADDRESS_TABLE].VirtualAddress =
+                 iat_va - pe_data (abfd)->pe_opthdr.ImageBase;
+           }
+         else
+           {
+             _bfd_error_handler
+               (_("%B: unable to fill in DataDictionary[PE_IMPORT_ADDRESS_TABLE(12)]"
+                  " because .idata$6 is missing"), abfd);
+             result = FALSE;
+           }
+        }
+    }
 
   h1 = coff_link_hash_lookup (coff_hash_table (info),
                              "__tls_used", FALSE, FALSE, TRUE);