mirror of https://github.com/acidanthera/audk.git
Fixed FwImage/fwimage.c to guarantee that the raw size of a section is a multiple of the file alignment.
Revert PeCoffLoader/BasePeCoff.c and PeiRebase/PeiRebaseExe.c back to the previous revisions. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@1582 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
0e9d14c4e7
commit
0411bcafa0
|
@ -165,7 +165,7 @@ Returns:
|
||||||
ULONG Index;
|
ULONG Index;
|
||||||
ULONG Index1;
|
ULONG Index1;
|
||||||
BOOLEAN TimeStampPresent;
|
BOOLEAN TimeStampPresent;
|
||||||
UINTN RelocSize;
|
UINTN AllignedRelocSize;
|
||||||
UINTN Delta;
|
UINTN Delta;
|
||||||
EFI_IMAGE_SECTION_HEADER *SectionHeader;
|
EFI_IMAGE_SECTION_HEADER *SectionHeader;
|
||||||
UINT8 *FileBuffer;
|
UINT8 *FileBuffer;
|
||||||
|
@ -356,7 +356,6 @@ Returns:
|
||||||
PeHdr->FileHeader.TimeDateStamp = (UINT32) TimeStamp;
|
PeHdr->FileHeader.TimeDateStamp = (UINT32) TimeStamp;
|
||||||
}
|
}
|
||||||
|
|
||||||
RelocSize = 0;
|
|
||||||
if (PeHdr->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {
|
if (PeHdr->OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {
|
||||||
Optional32 = (EFI_IMAGE_OPTIONAL_HEADER32 *)&PeHdr->OptionalHeader;
|
Optional32 = (EFI_IMAGE_OPTIONAL_HEADER32 *)&PeHdr->OptionalHeader;
|
||||||
Optional32->MajorLinkerVersion = 0;
|
Optional32->MajorLinkerVersion = 0;
|
||||||
|
@ -401,10 +400,29 @@ Returns:
|
||||||
if (Optional32->DataDirectory[5].Size != 0) {
|
if (Optional32->DataDirectory[5].Size != 0) {
|
||||||
SectionHeader = (EFI_IMAGE_SECTION_HEADER *)(FileBuffer + DosHdr->e_lfanew + sizeof(UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) + PeHdr->FileHeader.SizeOfOptionalHeader);
|
SectionHeader = (EFI_IMAGE_SECTION_HEADER *)(FileBuffer + DosHdr->e_lfanew + sizeof(UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) + PeHdr->FileHeader.SizeOfOptionalHeader);
|
||||||
for (Index = 0; Index < PeHdr->FileHeader.NumberOfSections; Index++, SectionHeader++) {
|
for (Index = 0; Index < PeHdr->FileHeader.NumberOfSections; Index++, SectionHeader++) {
|
||||||
|
//
|
||||||
|
// Look for the Section Header that starts as the same virtual address as the Base Relocation Data Directory
|
||||||
|
//
|
||||||
if (SectionHeader->VirtualAddress == Optional32->DataDirectory[5].VirtualAddress) {
|
if (SectionHeader->VirtualAddress == Optional32->DataDirectory[5].VirtualAddress) {
|
||||||
FileLength = SectionHeader->PointerToRawData + Optional32->DataDirectory[5].Size;
|
SectionHeader->Misc.VirtualSize = Optional32->DataDirectory[5].Size;
|
||||||
FileLength = (FileLength + 7) & 0xfffffff8;
|
AllignedRelocSize = (Optional32->DataDirectory[5].Size + Optional32->FileAlignment - 1) & (~(Optional32->FileAlignment - 1));
|
||||||
RelocSize = FileLength - SectionHeader->PointerToRawData;
|
//
|
||||||
|
// Check to see if there is zero padding at the end of the base relocations
|
||||||
|
//
|
||||||
|
if (AllignedRelocSize < SectionHeader->SizeOfRawData) {
|
||||||
|
//
|
||||||
|
// Check to see if the base relocations are at the end of the file
|
||||||
|
//
|
||||||
|
if (SectionHeader->PointerToRawData + SectionHeader->SizeOfRawData == Optional32->SizeOfImage) {
|
||||||
|
//
|
||||||
|
// All the required conditions are met to strip the zero padding of the end of the base relocations section
|
||||||
|
//
|
||||||
|
Optional32->SizeOfImage -= (SectionHeader->SizeOfRawData - AllignedRelocSize);
|
||||||
|
Optional32->SizeOfInitializedData -= (SectionHeader->SizeOfRawData - AllignedRelocSize);
|
||||||
|
SectionHeader->SizeOfRawData = AllignedRelocSize;
|
||||||
|
FileLength = Optional32->SizeOfImage;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -454,26 +472,35 @@ Returns:
|
||||||
if (Optional64->DataDirectory[5].Size != 0) {
|
if (Optional64->DataDirectory[5].Size != 0) {
|
||||||
SectionHeader = (EFI_IMAGE_SECTION_HEADER *)(FileBuffer + DosHdr->e_lfanew + sizeof(UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) + PeHdr->FileHeader.SizeOfOptionalHeader);
|
SectionHeader = (EFI_IMAGE_SECTION_HEADER *)(FileBuffer + DosHdr->e_lfanew + sizeof(UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) + PeHdr->FileHeader.SizeOfOptionalHeader);
|
||||||
for (Index = 0; Index < PeHdr->FileHeader.NumberOfSections; Index++, SectionHeader++) {
|
for (Index = 0; Index < PeHdr->FileHeader.NumberOfSections; Index++, SectionHeader++) {
|
||||||
|
//
|
||||||
|
// Look for the Section Header that starts as the same virtual address as the Base Relocation Data Directory
|
||||||
|
//
|
||||||
if (SectionHeader->VirtualAddress == Optional64->DataDirectory[5].VirtualAddress) {
|
if (SectionHeader->VirtualAddress == Optional64->DataDirectory[5].VirtualAddress) {
|
||||||
FileLength = SectionHeader->PointerToRawData + Optional64->DataDirectory[5].Size;
|
SectionHeader->Misc.VirtualSize = Optional64->DataDirectory[5].Size;
|
||||||
FileLength = (FileLength + 7) & 0xfffffff8;
|
AllignedRelocSize = (Optional64->DataDirectory[5].Size + Optional64->FileAlignment - 1) & (~(Optional64->FileAlignment - 1));
|
||||||
RelocSize = FileLength - SectionHeader->PointerToRawData;
|
//
|
||||||
|
// Check to see if there is zero padding at the end of the base relocations
|
||||||
|
//
|
||||||
|
if (AllignedRelocSize < SectionHeader->SizeOfRawData) {
|
||||||
|
//
|
||||||
|
// Check to see if the base relocations are at the end of the file
|
||||||
|
//
|
||||||
|
if (SectionHeader->PointerToRawData + SectionHeader->SizeOfRawData == Optional64->SizeOfImage) {
|
||||||
|
//
|
||||||
|
// All the required conditions are met to strip the zero padding of the end of the base relocations section
|
||||||
|
//
|
||||||
|
Optional64->SizeOfImage -= (SectionHeader->SizeOfRawData - AllignedRelocSize);
|
||||||
|
Optional64->SizeOfInitializedData -= (SectionHeader->SizeOfRawData - AllignedRelocSize);
|
||||||
|
SectionHeader->SizeOfRawData = AllignedRelocSize;
|
||||||
|
FileLength = Optional64->SizeOfImage;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (RelocSize != 0) {
|
|
||||||
SectionHeader = (EFI_IMAGE_SECTION_HEADER *)(FileBuffer + DosHdr->e_lfanew + sizeof(UINT32) + sizeof (EFI_IMAGE_FILE_HEADER) + PeHdr->FileHeader.SizeOfOptionalHeader);
|
|
||||||
for (Index = 0; Index < PeHdr->FileHeader.NumberOfSections; Index++, SectionHeader++) {
|
|
||||||
if (strcmp(SectionHeader->Name, ".reloc") == 0) {
|
|
||||||
SectionHeader->Misc.VirtualSize = (RelocSize + 0x1f) & 0xffffffe0;
|
|
||||||
SectionHeader->SizeOfRawData = RelocSize;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
FWriteFile (fpOut, FileBuffer, FileLength);
|
FWriteFile (fpOut, FileBuffer, FileLength);
|
||||||
|
|
||||||
//
|
//
|
||||||
|
|
|
@ -858,7 +858,7 @@ Returns:
|
||||||
Base = PeCoffLoaderImageAddress (ImageContext, Section->VirtualAddress);
|
Base = PeCoffLoaderImageAddress (ImageContext, Section->VirtualAddress);
|
||||||
End = PeCoffLoaderImageAddress (
|
End = PeCoffLoaderImageAddress (
|
||||||
ImageContext,
|
ImageContext,
|
||||||
Section->VirtualAddress + Section->SizeOfRawData - 1
|
Section->VirtualAddress + Section->Misc.VirtualSize - 1
|
||||||
);
|
);
|
||||||
if (ImageContext->IsTeImage) {
|
if (ImageContext->IsTeImage) {
|
||||||
Base = (CHAR8 *) ((UINTN) Base + sizeof (EFI_TE_IMAGE_HEADER) - (UINTN) TeHdr->StrippedSize);
|
Base = (CHAR8 *) ((UINTN) Base + sizeof (EFI_TE_IMAGE_HEADER) - (UINTN) TeHdr->StrippedSize);
|
||||||
|
|
|
@ -624,12 +624,12 @@ Returns:
|
||||||
// Allocate a buffer for the image to be loaded into.
|
// Allocate a buffer for the image to be loaded into.
|
||||||
//
|
//
|
||||||
Pe32ImageSize = GetLength (CurrentPe32Section.Pe32Section->CommonHeader.Size) - sizeof (EFI_PE32_SECTION);
|
Pe32ImageSize = GetLength (CurrentPe32Section.Pe32Section->CommonHeader.Size) - sizeof (EFI_PE32_SECTION);
|
||||||
MemoryImagePointer = (UINTN) (malloc (Pe32ImageSize + 0x1000 + ImageContext.SectionAlignment));
|
MemoryImagePointer = (UINTN) (malloc (Pe32ImageSize + 0x1000));
|
||||||
if (MemoryImagePointer == 0) {
|
if (MemoryImagePointer == 0) {
|
||||||
Error (NULL, 0, 0, "memory allocation failure", NULL);
|
Error (NULL, 0, 0, "memory allocation failure", NULL);
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
memset ((void *) MemoryImagePointer, 0, Pe32ImageSize + 0x1000 + ImageContext.SectionAlignment);
|
memset ((void *) MemoryImagePointer, 0, Pe32ImageSize + 0x1000);
|
||||||
MemoryImagePointerAligned = (MemoryImagePointer + 0x0FFF) & (-1 << 12);
|
MemoryImagePointerAligned = (MemoryImagePointer + 0x0FFF) & (-1 << 12);
|
||||||
|
|
||||||
|
|
||||||
|
@ -876,13 +876,13 @@ Returns:
|
||||||
//
|
//
|
||||||
// Allocate a buffer for the image to be loaded into.
|
// Allocate a buffer for the image to be loaded into.
|
||||||
//
|
//
|
||||||
MemoryImagePointer = (UINTN) (malloc (Pe32ImageSize + 0x1000 + ImageContext.SectionAlignment));
|
MemoryImagePointer = (UINTN) (malloc (Pe32ImageSize + 0x1000));
|
||||||
if (MemoryImagePointer == 0) {
|
if (MemoryImagePointer == 0) {
|
||||||
Error (NULL, 0, 0, "memory allocation error on rebase of TE image", FileGuidString);
|
Error (NULL, 0, 0, "memory allocation error on rebase of TE image", FileGuidString);
|
||||||
free (TEBuffer);
|
free (TEBuffer);
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
memset ((void *) MemoryImagePointer, 0, Pe32ImageSize + 0x1000 + ImageContext.SectionAlignment);
|
memset ((void *) MemoryImagePointer, 0, Pe32ImageSize + 0x1000);
|
||||||
MemoryImagePointerAligned = (MemoryImagePointer + 0x0FFF) & (-1 << 12);
|
MemoryImagePointerAligned = (MemoryImagePointer + 0x0FFF) & (-1 << 12);
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue