From: Kai Tietz Date: Wed, 22 Sep 2010 08:01:56 +0000 (+0000) Subject: 2010-09-22 Kai Tietz X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=cb2f80e68a7419ff24651d89699459e6973539d5;p=binutils-gdb.git 2010-09-22 Kai Tietz * peXXigen.c (_bfd_XXi_final_link_postscript): Add handling for setting IAT directory entry. --- diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 469fa17a6de..c2cd439f05f 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,8 @@ +2010-09-22 Kai Tietz + + * peXXigen.c (_bfd_XXi_final_link_postscript): + Add handling for setting IAT directory entry. + 2010-09-20 Richard Henderson * elf64-alpha.c (elf64_alpha_howto_table): Use bfd_elf_generic_reloc. diff --git a/bfd/peXXigen.c b/bfd/peXXigen.c index 8f351bacb32..a5b7f68b902 100644 --- a/bfd/peXXigen.c +++ b/bfd/peXXigen.c @@ -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);