mirror of
https://github.com/acidanthera/audk.git
synced 2025-09-23 17:57:45 +02:00
ImageTool: Determine PE section characteristics based on permissions
This commit is contained in:
parent
b4bcef3681
commit
3f691ba5eb
@ -631,7 +631,6 @@ CreateIntermediate (
|
|||||||
Segments[SIndex].Read = true;
|
Segments[SIndex].Read = true;
|
||||||
Segments[SIndex].Write = false;
|
Segments[SIndex].Write = false;
|
||||||
Segments[SIndex].Execute = true;
|
Segments[SIndex].Execute = true;
|
||||||
Segments[SIndex].Type = ToolImageSectionTypeCode;
|
|
||||||
++SIndex;
|
++SIndex;
|
||||||
continue;
|
continue;
|
||||||
} else if (IsDataShdr (Shdr)) {
|
} else if (IsDataShdr (Shdr)) {
|
||||||
@ -665,7 +664,6 @@ CreateIntermediate (
|
|||||||
Segments[SIndex].Read = true;
|
Segments[SIndex].Read = true;
|
||||||
Segments[SIndex].Write = true;
|
Segments[SIndex].Write = true;
|
||||||
Segments[SIndex].Execute = false;
|
Segments[SIndex].Execute = false;
|
||||||
Segments[SIndex].Type = ToolImageSectionTypeInitialisedData;
|
|
||||||
++SIndex;
|
++SIndex;
|
||||||
continue;
|
continue;
|
||||||
} else if (IsHiiRsrcShdr (Shdr)) {
|
} else if (IsHiiRsrcShdr (Shdr)) {
|
||||||
|
@ -82,12 +82,6 @@ typedef struct {
|
|||||||
bool IsXip;
|
bool IsXip;
|
||||||
} image_tool_header_info_t;
|
} image_tool_header_info_t;
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
ToolImageSectionTypeCode,
|
|
||||||
ToolImageSectionTypeInitialisedData,
|
|
||||||
ToolImageSectionTypeUninitialisedData
|
|
||||||
} image_tool_type_t;
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char *Name;
|
char *Name;
|
||||||
uint8_t *Data;
|
uint8_t *Data;
|
||||||
@ -97,7 +91,6 @@ typedef struct {
|
|||||||
bool Read;
|
bool Read;
|
||||||
bool Write;
|
bool Write;
|
||||||
bool Execute;
|
bool Execute;
|
||||||
image_tool_type_t Type;
|
|
||||||
} image_tool_segment_t;
|
} image_tool_segment_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -275,20 +275,7 @@ ToolImageEmitPeSectionHeaders (
|
|||||||
assert (SectionHeadersSize <= *BufferSize);
|
assert (SectionHeadersSize <= *BufferSize);
|
||||||
|
|
||||||
for (Index = 0; Index < Image->SegmentInfo.NumSegments; ++Index) {
|
for (Index = 0; Index < Image->SegmentInfo.NumSegments; ++Index) {
|
||||||
switch (Image->SegmentInfo.Segments[Index].Type) {
|
assert (Sections[Index].Characteristics == 0);
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Image->SegmentInfo.Segments[Index].Read) {
|
if (Image->SegmentInfo.Segments[Index].Read) {
|
||||||
Sections[Index].Characteristics |= EFI_IMAGE_SCN_MEM_READ;
|
Sections[Index].Characteristics |= EFI_IMAGE_SCN_MEM_READ;
|
||||||
@ -299,7 +286,9 @@ ToolImageEmitPeSectionHeaders (
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (Image->SegmentInfo.Segments[Index].Execute) {
|
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;
|
Sections[Index].PointerToRawData = SectionOffset;
|
||||||
@ -547,15 +536,18 @@ ToolImageEmitPeSections (
|
|||||||
|
|
||||||
Context->PeHdr->SizeOfImage += Segment->ImageSize;
|
Context->PeHdr->SizeOfImage += Segment->ImageSize;
|
||||||
|
|
||||||
if (FirstCode && (Segment->Type == ToolImageSectionTypeCode)) {
|
if (Segment->Execute) {
|
||||||
Context->PeHdr->BaseOfCode = (UINT32)Segment->ImageAddress;
|
if (FirstCode) {
|
||||||
FirstCode = false;
|
Context->PeHdr->BaseOfCode = (UINT32)Segment->ImageAddress;
|
||||||
|
FirstCode = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(EFI_TARGET32)
|
#if defined(EFI_TARGET32)
|
||||||
if (FirstData && (Segment->Type == ToolImageSectionTypeInitialisedData)) {
|
else {
|
||||||
Context->PeHdr->BaseOfData = (UINT32)Segment->ImageAddress;
|
if (FirstData) {
|
||||||
FirstData = false;
|
Context->PeHdr->BaseOfData = (UINT32)Segment->ImageAddress;
|
||||||
|
FirstData = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -578,23 +570,14 @@ ToolImageEmitPeSections (
|
|||||||
*Buffer += SectionPadding;
|
*Buffer += SectionPadding;
|
||||||
SectionsSize += SectionPadding;
|
SectionsSize += SectionPadding;
|
||||||
|
|
||||||
switch (Segment->Type) {
|
if (Segment->Execute) {
|
||||||
case ToolImageSectionTypeCode:
|
Context->PeHdr->BaseOfCode = MIN(Context->PeHdr->BaseOfCode, (UINT32)Segment->ImageAddress);
|
||||||
Context->PeHdr->BaseOfCode = MIN(Context->PeHdr->BaseOfCode, (UINT32)Segment->ImageAddress);
|
Context->PeHdr->SizeOfCode += Segment->ImageSize;
|
||||||
Context->PeHdr->SizeOfCode += Segment->ImageSize;
|
} else {
|
||||||
break;
|
|
||||||
case ToolImageSectionTypeInitialisedData:
|
|
||||||
#if defined(EFI_TARGET32)
|
#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
|
#endif
|
||||||
Context->PeHdr->SizeOfInitializedData += Segment->ImageSize;
|
Context->PeHdr->SizeOfInitializedData += Segment->ImageSize;
|
||||||
break;
|
|
||||||
case ToolImageSectionTypeUninitialisedData:
|
|
||||||
Context->PeHdr->SizeOfUninitializedData += Segment->ImageSize;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
assert (false);
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -240,23 +240,9 @@ ScanPeGetSegmentInfo (
|
|||||||
ImageSegment->ImageAddress = Section->VirtualAddress;
|
ImageSegment->ImageAddress = Section->VirtualAddress;
|
||||||
ImageSegment->ImageSize = Size;
|
ImageSegment->ImageSize = Size;
|
||||||
|
|
||||||
if ((Section->Characteristics & EFI_IMAGE_SCN_MEM_READ) != 0) {
|
ImageSegment->Read = (Section->Characteristics & EFI_IMAGE_SCN_MEM_READ) != 0;
|
||||||
ImageSegment->Read = true;
|
ImageSegment->Write = (Section->Characteristics & EFI_IMAGE_SCN_MEM_WRITE) != 0;
|
||||||
}
|
ImageSegment->Execute = (Section->Characteristics & EFI_IMAGE_SCN_MEM_EXECUTE) != 0;
|
||||||
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
++SegmentInfo->NumSegments;
|
++SegmentInfo->NumSegments;
|
||||||
++ImageSegment;
|
++ImageSegment;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user