mirror of https://github.com/acidanthera/audk.git
BaseTools/GenFw: Parse IBT/BTI support status from ELF note
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=4405 When performing ELF to PE/COFF conversion, parse any notes sections to decide whether the image supports forward CFI landing pads. This will be used to set the associated DllCharacteristicsEx flag in a subsequent patch. Signed-off-by: Ard Biesheuvel <ardb@kernel.org> Reviewed-by: Leif Lindholm <quic_llindhol@quicinc.com> Reviewed-by: Oliver Smith-Denny <osde@linux.microsoft.com> Acked-by: Michael Kubacki <michael.kubacki@microsoft.com> Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
This commit is contained in:
parent
cdf6ff1719
commit
6c299acf48
|
@ -770,6 +770,49 @@ WriteSectionRiscV64 (
|
|||
}
|
||||
}
|
||||
|
||||
STATIC UINT16 mDllCharacteristicsEx;
|
||||
|
||||
STATIC
|
||||
VOID
|
||||
ParseNoteSection (
|
||||
CONST Elf_Shdr *Shdr
|
||||
)
|
||||
{
|
||||
CONST Elf_Note *Note;
|
||||
CONST UINT32 *Prop;
|
||||
UINT32 Prop0;
|
||||
UINT32 Prop2;
|
||||
|
||||
Note = (Elf_Note *)((UINT8 *)mEhdr + Shdr->sh_offset);
|
||||
|
||||
if ((Note->n_type == NT_GNU_PROPERTY_TYPE_0) &&
|
||||
(Note->n_namesz == sizeof ("GNU")) &&
|
||||
(strcmp ((CHAR8 *)(Note + 1), "GNU") == 0) &&
|
||||
(Note->n_descsz > sizeof (UINT32[2]))) {
|
||||
Prop = (UINT32 *)((UINT8 *)(Note + 1) + sizeof("GNU"));
|
||||
|
||||
switch (mEhdr->e_machine) {
|
||||
case EM_AARCH64:
|
||||
Prop0 = GNU_PROPERTY_AARCH64_FEATURE_1_AND;
|
||||
Prop2 = GNU_PROPERTY_AARCH64_FEATURE_1_BTI;
|
||||
break;
|
||||
|
||||
case EM_X86_64:
|
||||
Prop0 = GNU_PROPERTY_X86_FEATURE_1_AND;
|
||||
Prop2 = GNU_PROPERTY_X86_FEATURE_1_IBT;
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
if ((Prop[0] == Prop0) &&
|
||||
(Prop[1] >= sizeof (UINT32)) &&
|
||||
((Prop[2] & Prop2) != 0)) {
|
||||
mDllCharacteristicsEx |= EFI_IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Elf functions interface implementation
|
||||
//
|
||||
|
@ -826,6 +869,13 @@ ScanSections64 (
|
|||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < mEhdr->e_shnum; i++) {
|
||||
Elf_Shdr *shdr = GetShdrByIndex(i);
|
||||
if (shdr->sh_type == SHT_NOTE) {
|
||||
ParseNoteSection (shdr);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Check if mCoffAlignment is larger than MAX_COFF_ALIGNMENT
|
||||
//
|
||||
|
|
|
@ -59,6 +59,15 @@ typedef struct {
|
|||
UINT32 n_type; /* Type of this note. */
|
||||
} Elf_Note;
|
||||
|
||||
#define NT_GNU_PROPERTY_TYPE_0 5
|
||||
|
||||
#define GNU_PROPERTY_X86_FEATURE_1_AND 0xc0000002
|
||||
#define GNU_PROPERTY_X86_FEATURE_1_IBT 0x1
|
||||
|
||||
#define GNU_PROPERTY_AARCH64_FEATURE_1_AND 0xc0000000
|
||||
#define GNU_PROPERTY_AARCH64_FEATURE_1_BTI 0x1
|
||||
#define GNU_PROPERTY_AARCH64_FEATURE_1_PAC 0x2
|
||||
|
||||
/* Indexes into the e_ident array. Keep synced with
|
||||
http://www.sco.com/developers/gabi/latest/ch4.eheader.html */
|
||||
#define EI_MAG0 0 /* Magic number, byte 0. */
|
||||
|
|
Loading…
Reference in New Issue