From nobody Sun Feb 8 19:02:57 2026 Delivered-To: importer@patchew.org Received-SPF: pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) client-ip=66.175.222.108; envelope-from=bounce+27952+102493+1787277+3901457@groups.io; helo=mail02.groups.io; Authentication-Results: mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+102493+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=kernel.org ARC-Seal: i=1; a=rsa-sha256; t=1680622841; cv=none; d=zohomail.com; s=zohoarc; b=ZYn0valUduwacpPVoY98oI5R4l3oC0FZ//jJvwSxNSWnVITSQwRqf/yCQYrt0PyIGxvS/OYyzYUNosC36OyicDGtlUcCnyp4att7FIg5FQTm8FCLMnEM5lWu6sQu9do2V0LowCOhYe9mo6d/LS1E7WAB5+6PCULsZq1FF9aMO3Q= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1680622841; h=Content-Transfer-Encoding:Cc:Date:From:In-Reply-To:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:References:Sender:Subject:To; bh=u0M2MMwl2Ur2gkbUTeoo+eHajfsdHIVzVoUyZAQrHTw=; b=UDsOBX+FojJ39Aataiff69GC7zg5gANvuyuMhm6DPgypRrnhNuDuZs3rpJtCH1q8sby9u+03S4EhfbU1tLu4k0xl+L8bZqsatT/rQPpZgzcxy7YINaI+mBQE9PTbauuNBMLaYlXCzLQihd5qemtcmjfgvKuRAcKYNVKIRnd7hz8= ARC-Authentication-Results: i=1; mx.zohomail.com; dkim=pass; spf=pass (zohomail.com: domain of groups.io designates 66.175.222.108 as permitted sender) smtp.mailfrom=bounce+27952+102493+1787277+3901457@groups.io; dmarc=fail header.from= (p=none dis=none) Received: from mail02.groups.io (mail02.groups.io [66.175.222.108]) by mx.zohomail.com with SMTPS id 1680622841189385.45779249716395; Tue, 4 Apr 2023 08:40:41 -0700 (PDT) Return-Path: X-Received: by 127.0.0.2 with SMTP id OGbGYY1788612xKjBRBafp72; Tue, 04 Apr 2023 08:40:40 -0700 X-Received: from dfw.source.kernel.org (dfw.source.kernel.org [139.178.84.217]) by mx.groups.io with SMTP id smtpd.web11.105359.1680622840325722980 for ; Tue, 04 Apr 2023 08:40:40 -0700 X-Received: from smtp.kernel.org (relay.kernel.org [52.25.139.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dfw.source.kernel.org (Postfix) with ESMTPS id D8B42634F1; Tue, 4 Apr 2023 15:40:39 +0000 (UTC) X-Received: by smtp.kernel.org (Postfix) with ESMTPSA id 93C96C433EF; Tue, 4 Apr 2023 15:40:36 +0000 (UTC) From: "Ard Biesheuvel" To: devel@edk2.groups.io Cc: Ard Biesheuvel , Michael Kinney , Liming Gao , Jiewen Yao , Michael Kubacki , Sean Brogan , Rebecca Cran , Leif Lindholm , Sami Mujawar , Taylor Beebe , =?UTF-8?q?Marvin=20H=C3=A4user?= , Bob Feng , Oliver Smith-Denny Subject: [edk2-devel] [PATCH v3 2/4] BaseTools/GenFw: Add DllCharacteristicsEx field to debug data Date: Tue, 4 Apr 2023 17:40:20 +0200 Message-Id: <20230404154022.2776035-3-ardb@kernel.org> In-Reply-To: <20230404154022.2776035-1-ardb@kernel.org> References: <20230404154022.2776035-1-ardb@kernel.org> MIME-Version: 1.0 Precedence: Bulk List-Unsubscribe: List-Subscribe: List-Help: Sender: devel@edk2.groups.io List-Id: Mailing-List: list devel@edk2.groups.io; contact devel+owner@edk2.groups.io Reply-To: devel@edk2.groups.io,ardb@kernel.org X-Gm-Message-State: Mujb9yfq356Ew7cfMcJsdN9Kx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1680622840; bh=3Ii3ZIncURud0/3fvukCfG+ENxmnidZXnEmmivrnJtk=; h=Cc:Date:From:Reply-To:Subject:To; b=jyM6x9dzbkFaRq5yLxwiHOgTWuP6nXZVzEblatjTSDsilT36gj1jfaTR9DR8f1AcKsJ aDaySg2UOFDO9UemE+WcRx+bnPfhMJR+4VTxMHZiwEifS2q2T9IRJrhjVoShpRHz6y0v4 a17fN6eCkz7eIJTgCgXQ45lxqkabBoVkadc= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1680622841832100001 Content-Type: text/plain; charset="utf-8" The PE/COFF spec describes an additional DllCharacteristics field implemented as a debug directory entry, which carries flags related to which control flow integrity (CFI) features are supported by the binary. So let's add this entry when doing ELF to PE/COFF conversion - we will add support for setting the flags in a subsequent patch. Signed-off-by: Ard Biesheuvel Reviewed-by: Leif Lindholm Reviewed-by: Oliver Smith-Denny Reviewed-by: Michael Kubacki --- BaseTools/Source/C/GenFw/Elf64Convert.c | 54 +++++++++++++++= ----- BaseTools/Source/C/GenFw/GenFw.c | 3 +- BaseTools/Source/C/Include/IndustryStandard/PeImage.h | 13 ++++- 3 files changed, 55 insertions(+), 15 deletions(-) diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c b/BaseTools/Source/C/G= enFw/Elf64Convert.c index 2a810e835d4a4a66..9c17c90b16602421 100644 --- a/BaseTools/Source/C/GenFw/Elf64Convert.c +++ b/BaseTools/Source/C/GenFw/Elf64Convert.c @@ -992,6 +992,16 @@ ScanSections64 ( sizeof(EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY) + strlen(mInImageName) + 1; =20 + // + // Add more space in the .debug data region for the DllCharacteristicsEx + // field. + // + if (mDllCharacteristicsEx !=3D 0) { + mCoffOffset =3D DebugRvaAlign(mCoffOffset) + + sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY) + + sizeof (EFI_IMAGE_DEBUG_EX_DLLCHARACTERISTICS_ENTRY); + } + mCoffOffset =3D CoffAlign(mCoffOffset); if (SectionCount =3D=3D 0) { mDataOffset =3D mCoffOffset; @@ -2244,29 +2254,47 @@ WriteDebug64 ( VOID ) { - UINT32 Len; - EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; - EFI_IMAGE_DATA_DIRECTORY *DataDir; - EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *Dir; - EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY *Nb10; + UINT32 Len; + EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; + EFI_IMAGE_DATA_DIRECTORY *DataDir; + EFI_IMAGE_DEBUG_DIRECTORY_ENTRY *Dir; + EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY *Nb10; + EFI_IMAGE_DEBUG_EX_DLLCHARACTERISTICS_ENTRY *DllEntry; =20 Len =3D strlen(mInImageName) + 1; =20 + NtHdr =3D (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(mCoffFile + mNtHdrOffset); + DataDir =3D &NtHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRE= CTORY_ENTRY_DEBUG]; + DataDir->VirtualAddress =3D mDebugOffset; + DataDir->Size =3D sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY); + Dir =3D (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY*)(mCoffFile + mDebugOffset); + + if (mDllCharacteristicsEx !=3D 0) { + DataDir->Size +=3D sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY); + + Dir->Type =3D EFI_IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS; + Dir->SizeOfData =3D sizeof (EFI_IMAGE_DEBUG_EX_DLLCHARACTERISTICS_ENTR= Y); + Dir->FileOffset =3D mDebugOffset + DataDir->Size + + sizeof (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY) + + DebugRvaAlign(Len); + Dir->RVA =3D Dir->FileOffset; + + DllEntry =3D (VOID *)(mCoffFile + Dir->FileOffset); + + DllEntry->DllCharacteristicsEx =3D mDllCharacteristicsEx; + + Dir++; + } + Dir->Type =3D EFI_IMAGE_DEBUG_TYPE_CODEVIEW; Dir->SizeOfData =3D sizeof(EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY) + Len; - Dir->RVA =3D mDebugOffset + sizeof(EFI_IMAGE_DEBUG_DIRECTORY_ENTRY); - Dir->FileOffset =3D mDebugOffset + sizeof(EFI_IMAGE_DEBUG_DIRECTORY_ENTR= Y); + Dir->RVA =3D mDebugOffset + DataDir->Size; + Dir->FileOffset =3D mDebugOffset + DataDir->Size; =20 Nb10 =3D (EFI_IMAGE_DEBUG_CODEVIEW_NB10_ENTRY*)(Dir + 1); Nb10->Signature =3D CODEVIEW_SIGNATURE_NB10; strcpy ((char *)(Nb10 + 1), mInImageName); - - - NtHdr =3D (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(mCoffFile + mNtHdrOffset); - DataDir =3D &NtHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRE= CTORY_ENTRY_DEBUG]; - DataDir->VirtualAddress =3D mDebugOffset; - DataDir->Size =3D sizeof(EFI_IMAGE_DEBUG_DIRECTORY_ENTRY); } =20 STATIC diff --git a/BaseTools/Source/C/GenFw/GenFw.c b/BaseTools/Source/C/GenFw/Ge= nFw.c index 6f61f16788cd2a0a..d0e52ccc26431380 100644 --- a/BaseTools/Source/C/GenFw/GenFw.c +++ b/BaseTools/Source/C/GenFw/GenFw.c @@ -2932,7 +2932,8 @@ Routine Description: if (mIsConvertXip) { DebugEntry->FileOffset =3D DebugEntry->RVA; } - if (ZeroDebugFlag || DebugEntry->Type !=3D EFI_IMAGE_DEBUG_TYPE_CODE= VIEW) { + if ((ZeroDebugFlag || DebugEntry->Type !=3D EFI_IMAGE_DEBUG_TYPE_COD= EVIEW) && + (DebugEntry->Type !=3D EFI_IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTIC= S)) { memset (FileBuffer + DebugEntry->FileOffset, 0, DebugEntry->SizeOf= Data); memset (DebugEntry, 0, sizeof (EFI_IMAGE_DEBUG_DIRECTORY_ENTRY)); } diff --git a/BaseTools/Source/C/Include/IndustryStandard/PeImage.h b/BaseTo= ols/Source/C/Include/IndustryStandard/PeImage.h index 77ded3f611398278..22161edf443d0e22 100644 --- a/BaseTools/Source/C/Include/IndustryStandard/PeImage.h +++ b/BaseTools/Source/C/Include/IndustryStandard/PeImage.h @@ -615,7 +615,8 @@ typedef struct { /// /// Debug Format /// -#define EFI_IMAGE_DEBUG_TYPE_CODEVIEW 2 +#define EFI_IMAGE_DEBUG_TYPE_CODEVIEW 2 +#define EFI_IMAGE_DEBUG_TYPE_EX_DLLCHARACTERISTICS 20 =20 typedef struct { UINT32 Characteristics; @@ -664,6 +665,16 @@ typedef struct { // } EFI_IMAGE_DEBUG_CODEVIEW_MTOC_ENTRY; =20 +/// +/// Extended DLL Characteristics +/// +#define EFI_IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT 0x0001 +#define EFI_IMAGE_DLLCHARACTERISTICS_EX_FORWARD_CFI_COMPAT 0x0040 + +typedef struct { + UINT32 DllCharacteristicsEx; +} EFI_IMAGE_DEBUG_EX_DLLCHARACTERISTICS_ENTRY; + // // .pdata entries for X64 // --=20 2.39.2 -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#102493): https://edk2.groups.io/g/devel/message/102493 Mute This Topic: https://groups.io/mt/98062735/1787277 Group Owner: devel+owner@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [importer@patchew.org] -=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-=3D-