From 58e4d800962d8b84ad122eceae8df2f6616f34fd Mon Sep 17 00:00:00 2001 From: klu2 Date: Tue, 21 Jul 2009 16:56:35 +0000 Subject: Hot fixing for the bug that GenFw can not convert ELF to PE format correctly, the root cause is invalid size of OptionalHeader is computed. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@8976 6f19259b-4bc3-4df7-8a09-765794883524 --- BaseTools/Source/C/GenFw/GenFw.c | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) (limited to 'BaseTools/Source/C') diff --git a/BaseTools/Source/C/GenFw/GenFw.c b/BaseTools/Source/C/GenFw/GenFw.c index 2278948b3d..d570f633d5 100644 --- a/BaseTools/Source/C/GenFw/GenFw.c +++ b/BaseTools/Source/C/GenFw/GenFw.c @@ -583,7 +583,21 @@ ScanSections( // CoffOffset = sizeof(EFI_IMAGE_DOS_HEADER) + 0x40; NtHdrOffset = CoffOffset; - CoffOffset += sizeof(EFI_IMAGE_OPTIONAL_HEADER_UNION); + switch (Ehdr->e_machine) { + case EM_386: + case EM_ARM: + CoffOffset += sizeof (EFI_IMAGE_NT_HEADERS32); + break; + case EM_X86_64: + case EM_IA_64: + CoffOffset += sizeof (EFI_IMAGE_NT_HEADERS64); + break; + default: + VerboseMsg ("%s unknown e_machine type. Assume IA-32", (UINTN)Ehdr->e_machine); + CoffOffset += sizeof (EFI_IMAGE_NT_HEADERS32); + break; + } + TableOffset = CoffOffset; CoffOffset += CoffNbrSections * sizeof(EFI_IMAGE_SECTION_HEADER); @@ -1144,6 +1158,7 @@ ConvertElf ( // // Compute sections new address. // + ScanSections(); VerboseMsg ("Compute sections new address."); @@ -2660,9 +2675,12 @@ Returns: // // Init variable. // - DebugDirectoryEntryRva = 0; - ExportDirectoryEntryRva = 0; - ResourceDirectoryEntryRva = 0; + DebugDirectoryEntryRva = 0; + ExportDirectoryEntryRva = 0; + ResourceDirectoryEntryRva = 0; + DebugDirectoryEntryFileOffset = 0; + ExportDirectoryEntryFileOffset = 0; + ResourceDirectoryEntryFileOffset = 0; DosHdr = (EFI_IMAGE_DOS_HEADER *) FileBuffer; FileHdr = (EFI_IMAGE_FILE_HEADER *) (FileBuffer + DosHdr->e_lfanew + sizeof (UINT32)); @@ -2745,17 +2763,17 @@ Returns: // FileHdr->TimeDateStamp = 0; - if (ExportDirectoryEntryRva != 0) { + if (ExportDirectoryEntryFileOffset != 0) { NewTimeStamp = (UINT32 *) (FileBuffer + ExportDirectoryEntryFileOffset + sizeof (UINT32)); *NewTimeStamp = 0; } - if (ResourceDirectoryEntryRva != 0) { + if (ResourceDirectoryEntryFileOffset != 0) { NewTimeStamp = (UINT32 *) (FileBuffer + ResourceDirectoryEntryFileOffset + sizeof (UINT32)); *NewTimeStamp = 0; } - if (DebugDirectoryEntryRva != 0) { + if (DebugDirectoryEntryFileOffset != 0) { DebugEntry = (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *) (FileBuffer + DebugDirectoryEntryFileOffset); DebugEntry->TimeDateStamp = 0; if (ZeroDebugFlag) { -- cgit v1.2.3