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
This commit is contained in:
klu2
2009-07-21 16:56:35 +00:00
parent 19bf20e11a
commit 58e4d80096
17 changed files with 25 additions and 7 deletions

View File

@@ -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) {