ImageTool: Determine PE section characteristics based on permissions

This commit is contained in:
Marvin Häuser 2023-04-15 17:03:24 +02:00 committed by Marvin Häuser
parent b4bcef3681
commit 3f691ba5eb
4 changed files with 23 additions and 63 deletions

View File

@ -631,7 +631,6 @@ CreateIntermediate (
Segments[SIndex].Read = true;
Segments[SIndex].Write = false;
Segments[SIndex].Execute = true;
Segments[SIndex].Type = ToolImageSectionTypeCode;
++SIndex;
continue;
} else if (IsDataShdr (Shdr)) {
@ -665,7 +664,6 @@ CreateIntermediate (
Segments[SIndex].Read = true;
Segments[SIndex].Write = true;
Segments[SIndex].Execute = false;
Segments[SIndex].Type = ToolImageSectionTypeInitialisedData;
++SIndex;
continue;
} else if (IsHiiRsrcShdr (Shdr)) {

View File

@ -82,12 +82,6 @@ typedef struct {
bool IsXip;
} image_tool_header_info_t;
typedef enum {
ToolImageSectionTypeCode,
ToolImageSectionTypeInitialisedData,
ToolImageSectionTypeUninitialisedData
} image_tool_type_t;
typedef struct {
char *Name;
uint8_t *Data;
@ -97,7 +91,6 @@ typedef struct {
bool Read;
bool Write;
bool Execute;
image_tool_type_t Type;
} image_tool_segment_t;
typedef struct {

View File

@ -275,20 +275,7 @@ ToolImageEmitPeSectionHeaders (
assert (SectionHeadersSize <= *BufferSize);
for (Index = 0; Index < Image->SegmentInfo.NumSegments; ++Index) {
switch (Image->SegmentInfo.Segments[Index].Type) {
case ToolImageSectionTypeCode:
Sections[Index].Characteristics = EFI_IMAGE_SCN_CNT_CODE;
break;
case ToolImageSectionTypeInitialisedData:
Sections[Index].Characteristics = EFI_IMAGE_SCN_CNT_INITIALIZED_DATA;
break;
case ToolImageSectionTypeUninitialisedData:
Sections[Index].Characteristics = EFI_IMAGE_SCN_CNT_UNINITIALIZED_DATA;
break;
default:
assert (false);
break;
}
assert (Sections[Index].Characteristics == 0);
if (Image->SegmentInfo.Segments[Index].Read) {
Sections[Index].Characteristics |= EFI_IMAGE_SCN_MEM_READ;
@ -299,7 +286,9 @@ ToolImageEmitPeSectionHeaders (
}
if (Image->SegmentInfo.Segments[Index].Execute) {
Sections[Index].Characteristics |= EFI_IMAGE_SCN_MEM_EXECUTE;
Sections[Index].Characteristics |= EFI_IMAGE_SCN_MEM_EXECUTE | EFI_IMAGE_SCN_CNT_CODE;
} else {
Sections[Index].Characteristics |= EFI_IMAGE_SCN_CNT_INITIALIZED_DATA;
}
Sections[Index].PointerToRawData = SectionOffset;
@ -547,15 +536,18 @@ ToolImageEmitPeSections (
Context->PeHdr->SizeOfImage += Segment->ImageSize;
if (FirstCode && (Segment->Type == ToolImageSectionTypeCode)) {
Context->PeHdr->BaseOfCode = (UINT32)Segment->ImageAddress;
FirstCode = false;
if (Segment->Execute) {
if (FirstCode) {
Context->PeHdr->BaseOfCode = (UINT32)Segment->ImageAddress;
FirstCode = false;
}
}
#if defined(EFI_TARGET32)
if (FirstData && (Segment->Type == ToolImageSectionTypeInitialisedData)) {
Context->PeHdr->BaseOfData = (UINT32)Segment->ImageAddress;
FirstData = false;
else {
if (FirstData) {
Context->PeHdr->BaseOfData = (UINT32)Segment->ImageAddress;
FirstData = false;
}
}
#endif
@ -578,23 +570,14 @@ ToolImageEmitPeSections (
*Buffer += SectionPadding;
SectionsSize += SectionPadding;
switch (Segment->Type) {
case ToolImageSectionTypeCode:
Context->PeHdr->BaseOfCode = MIN(Context->PeHdr->BaseOfCode, (UINT32)Segment->ImageAddress);
Context->PeHdr->SizeOfCode += Segment->ImageSize;
break;
case ToolImageSectionTypeInitialisedData:
if (Segment->Execute) {
Context->PeHdr->BaseOfCode = MIN(Context->PeHdr->BaseOfCode, (UINT32)Segment->ImageAddress);
Context->PeHdr->SizeOfCode += Segment->ImageSize;
} else {
#if defined(EFI_TARGET32)
Context->PeHdr->BaseOfData = MIN(Context->PeHdr->BaseOfData, (UINT32)Segment->ImageAddress);
Context->PeHdr->BaseOfData = MIN(Context->PeHdr->BaseOfData, (UINT32)Segment->ImageAddress);
#endif
Context->PeHdr->SizeOfInitializedData += Segment->ImageSize;
break;
case ToolImageSectionTypeUninitialisedData:
Context->PeHdr->SizeOfUninitializedData += Segment->ImageSize;
break;
default:
assert (false);
break;
Context->PeHdr->SizeOfInitializedData += Segment->ImageSize;
}
}

View File

@ -240,23 +240,9 @@ ScanPeGetSegmentInfo (
ImageSegment->ImageAddress = Section->VirtualAddress;
ImageSegment->ImageSize = Size;
if ((Section->Characteristics & EFI_IMAGE_SCN_MEM_READ) != 0) {
ImageSegment->Read = true;
}
if ((Section->Characteristics & EFI_IMAGE_SCN_MEM_WRITE) != 0) {
ImageSegment->Write = true;
}
if ((Section->Characteristics & EFI_IMAGE_SCN_MEM_EXECUTE) != 0) {
ImageSegment->Execute = true;
}
if (ImageSegment->Execute) {
ImageSegment->Type = ToolImageSectionTypeCode;
} else {
ImageSegment->Type = ToolImageSectionTypeInitialisedData;
}
ImageSegment->Read = (Section->Characteristics & EFI_IMAGE_SCN_MEM_READ) != 0;
ImageSegment->Write = (Section->Characteristics & EFI_IMAGE_SCN_MEM_WRITE) != 0;
ImageSegment->Execute = (Section->Characteristics & EFI_IMAGE_SCN_MEM_EXECUTE) != 0;
++SegmentInfo->NumSegments;
++ImageSegment;