From nobody Wed Apr 24 02:50:42 2024 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+85618+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+85618+1787277+3901457@groups.io; dmarc=fail(p=none dis=none) header.from=intel.com ARC-Seal: i=1; a=rsa-sha256; t=1641997156; cv=none; d=zohomail.com; s=zohoarc; b=hs/GP3X25mlQfHiMrpWQPcqyamfsr3IK/Sk1F2ABfvvVwwBVOiOEqxM6MicdpjSJqYJgWgh3p/65bRX+J8nblJhiqWCI5lOirxVjE/KenUg0GgawEbeAYK3GrkzOR7kxagxHK1qW98if7fMVvCW43u3E8eOfxnR+bMY2EKfXFGc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zohomail.com; s=zohoarc; t=1641997156; h=Content-Transfer-Encoding:Cc:Date:From:List-Subscribe:List-Id:List-Help:List-Unsubscribe:MIME-Version:Message-ID:Reply-To:Sender:Subject:To; bh=830s2sin3XOiiuPP2L6uYmLROAcc44p3h5ZzM2vChio=; b=OM9jv+G4mwhIqb3t7l0o6ZByhCT9GsENKBicnmzThgJ4syoXQVhUV1bDEu6r6Ccf3e6B7JxYecXd4DI0Ibwfg5CJb7rdyD1oHGRZswPoKyDKAnVLmulXNNQR+RVdyf/HY0sgpLUsjEhcTkUA85wu6pUno/DU0hE0Q/aDxtwESz8= 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+85618+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 1641997156898116.3190628566042; Wed, 12 Jan 2022 06:19:16 -0800 (PST) Return-Path: X-Received: by 127.0.0.2 with SMTP id mFJlYY1788612xIdFSqzR7Vz; Wed, 12 Jan 2022 06:19:16 -0800 X-Received: from mga02.intel.com (mga02.intel.com [134.134.136.20]) by mx.groups.io with SMTP id smtpd.web12.20612.1641973469689785506 for ; Tue, 11 Jan 2022 23:44:30 -0800 X-IronPort-AV: E=McAfee;i="6200,9189,10224"; a="231022108" X-IronPort-AV: E=Sophos;i="5.88,282,1635231600"; d="scan'208";a="231022108" X-Received: from orsmga001.jf.intel.com ([10.7.209.18]) by orsmga101.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Jan 2022 23:44:28 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.88,282,1635231600"; d="scan'208";a="558632090" X-Received: from lixiahua-desk2.ccr.corp.intel.com ([10.239.158.25]) by orsmga001.jf.intel.com with ESMTP; 11 Jan 2022 23:44:26 -0800 From: Lixia Huang To: devel@edk2.groups.io Cc: Lixia Huang , Liming Gao , Bob Feng , Yuwei Chen Subject: [edk2-devel][PATCH] BaseTools/GenFw: Enhance to add export table in PE-COFF Date: Wed, 12 Jan 2022 15:44:23 +0800 Message-Id: <20220112074423.5075-1-lisa.huang@intel.com> 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,lisa.huang@intel.com X-Gm-Message-State: 1rSl19xpBRDWe6QwlDf27A9lx1787277AA= Content-Transfer-Encoding: quoted-printable DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=groups.io; q=dns/txt; s=20140610; t=1641997156; bh=q8AC/S/YICi0zzeDlwuMBA32S2ioeZwx/FEZEuVsdUI=; h=Cc:Date:From:Reply-To:Subject:To; b=XqwOaGrhZMVn6echK6+3sFDjoD2Cn7gwB+6TewwqUi6a5+91gPOJZRvKVrh4Tijjbht TcreUGUEhyh3pUbiFLhoS5d3TtDg4wfnxQYpeczx4UE0kpAdvTB7FGMe02+opBluQl+iU +VDw40U/1/XCMBaIXx85iT2DQuWHrh0kK9w= X-ZohoMail-DKIM: pass (identity @groups.io) X-ZM-MESSAGEID: 1641997161028100001 Content-Type: text/plain; charset="utf-8" REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3D3802 Since PRM module needs to support export table in PE-COFF, we'll enhance GenFw tool to support this. Add one export flag in GenFw tool. If export flag is set: Step1: Scan ELF symbol table based on PRM module descriptor to get descriptor offset address; Step2: Find PRM handlers number and name in COFF file based on the address from step1; Step3: Write PRM info such as handler name and export RVA into COFF export table. Cc: Liming Gao Cc: Bob Feng Cc: Yuwei Chen Signed-off-by: Lixia Huang --- BaseTools/Source/C/GenFw/Elf64Convert.c | 254 +++++++++++++++++- BaseTools/Source/C/GenFw/ElfConvert.c | 10 + BaseTools/Source/C/GenFw/ElfConvert.h | 42 ++- BaseTools/Source/C/GenFw/GenFw.c | 11 +- .../C/Include/IndustryStandard/PeImage.h | 7 + 5 files changed, 318 insertions(+), 6 deletions(-) diff --git a/BaseTools/Source/C/GenFw/Elf64Convert.c b/BaseTools/Source/C/G= enFw/Elf64Convert.c index 0bb3ead228..0079507356 100644 --- a/BaseTools/Source/C/GenFw/Elf64Convert.c +++ b/BaseTools/Source/C/GenFw/Elf64Convert.c @@ -56,6 +56,18 @@ WriteDebug64 ( VOID ); =20 +STATIC +VOID +ScanSymbol64 ( + VOID + ); + +STATIC +VOID +WriteExport64 ( + VOID + ); + STATIC VOID SetImageSize64 ( @@ -122,7 +134,7 @@ STATIC UINT32 mDataOffset; STATIC UINT32 mHiiRsrcOffset; STATIC UINT32 mRelocOffset; STATIC UINT32 mDebugOffset; - +STATIC UINT32 mExportOffset; // // Used for RISC-V relocations. // @@ -132,6 +144,14 @@ STATIC Elf64_Half mRiscVPass1SymSecIndex =3D 0; STATIC INT32 mRiscVPass1Offset; STATIC INT32 mRiscVPass1GotFixup; =20 +// +// Used for Export section. +// +STATIC UINT32 mExportSize; +STATIC UINT32 mExportRVA[PRM_MODULE_EXPORT_SYMBOL_NUM]; +STATIC UINT32 mExportSymNum; +STATIC CHAR8 mExportSymName[PRM_MODULE_EXPORT_SYMBOL_NUM][PRM_HANDLE= R_NAME_MAXIMUM_LENGTH]; + // // Initialization Function // @@ -200,6 +220,10 @@ InitializeElf64 ( ElfFunctions->SetImageSize =3D SetImageSize64; ElfFunctions->CleanUp =3D CleanUp64; =20 + if (mExportFlag) { + ElfFunctions->ScanSymbol =3D ScanSymbol64; + ElfFunctions->WriteExport =3D WriteExport64; + } return TRUE; } =20 @@ -263,6 +287,17 @@ IsHiiRsrcShdr ( return (BOOLEAN) (strcmp((CHAR8*)mEhdr + Namedr->sh_offset + Shdr->sh_na= me, ELF_HII_SECTION_NAME) =3D=3D 0); } =20 +STATIC +BOOLEAN +IsSymbolShdr ( + Elf_Shdr *Shdr + ) +{ + Elf_Shdr *Namehdr =3D GetShdrByIndex(mEhdr->e_shstrndx); + + return (BOOLEAN) (strcmp((CHAR8*)mEhdr + Namehdr->sh_offset + Shdr->sh_n= ame, ELF_SYMBOL_SECTION_NAME) =3D=3D 0); +} + STATIC BOOLEAN IsDataShdr ( @@ -335,6 +370,38 @@ GetSymName ( return StrtabContents + Sym->st_name; } =20 +// +// Get Prm Handler number and name +// +STATIC +VOID +FindPrmHandler ( + UINT64 Offset + ) +{ + PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_HEADER *PrmExport; + UINT32 NameOffset; + UINT32 HandlerNum; + UINT32 Index; + UINT8 SymName[PRM_HANDLER_NAME_MAXIMUM_LENGTH]; + + PrmExport =3D (PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_HEADER*)(mCoffFile + = Offset); + NameOffset =3D sizeof(PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_HEADER) + size= of(EFI_GUID); + + for (HandlerNum =3D 0; HandlerNum < PrmExport->NumberPrmHandlers; Handle= rNum++) { + for (Index =3D 0; Index < PRM_HANDLER_NAME_MAXIMUM_LENGTH; Index++) { + SymName[Index] =3D *((UINT8 *)PrmExport + NameOffset + Index); + if (SymName[Index] =3D=3D 0) { + break; + } + } + + strcpy(mExportSymName[mExportSymNum], (CHAR8*)SymName); + NameOffset +=3D PRM_HANDLER_NAME_MAXIMUM_LENGTH + sizeof(EFI_GUID); + mExportSymNum ++; + } +} + // // Find the ELF section hosting the GOT from an ELF Rva // of a single GOT entry. Normally, GOT is placed in @@ -717,6 +784,7 @@ ScanSections64 ( UINT32 CoffEntry; UINT32 SectionCount; BOOLEAN FoundSection; + UINT32 Offset; =20 CoffEntry =3D 0; mCoffOffset =3D 0; @@ -750,7 +818,7 @@ ScanSections64 ( if (shdr->sh_addralign <=3D mCoffAlignment) { continue; } - if (IsTextShdr(shdr) || IsDataShdr(shdr) || IsHiiRsrcShdr(shdr)) { + if (IsTextShdr(shdr) || IsDataShdr(shdr) || IsHiiRsrcShdr(shdr) || IsS= ymbolShdr(shdr)) { mCoffAlignment =3D (UINT32)shdr->sh_addralign; } } @@ -880,6 +948,16 @@ ScanSections64 ( Warning (NULL, 0, 0, NULL, "Multiple sections in %s are merged into 1 = data section. Source level debug might not work correctly.", mInImageName); } =20 + // + // The Symbol sections. + // + if (mExportFlag) { + mExportOffset =3D mCoffOffset; + mExportSize =3D sizeof(EFI_IMAGE_EXPORT_DIRECTORY) + strlen(mInImageNa= me) + 1; + mCoffOffset +=3D mExportSize; + mCoffOffset =3D CoffAlign(mCoffOffset); + } + // // The HII resource sections. // @@ -962,7 +1040,11 @@ ScanSections64 ( | EFI_IMAGE_FILE_LARGE_ADDRESS_AWARE; =20 NtHdr->Pe32Plus.OptionalHeader.SizeOfCode =3D mDataOffset - mTextOffset; - NtHdr->Pe32Plus.OptionalHeader.SizeOfInitializedData =3D mRelocOffset - = mDataOffset; + if(mExportFlag) { + NtHdr->Pe32Plus.OptionalHeader.SizeOfInitializedData =3D mRelocOffset = - mExportOffset; + } else { + NtHdr->Pe32Plus.OptionalHeader.SizeOfInitializedData =3D mRelocOffset = - mDataOffset; + } NtHdr->Pe32Plus.OptionalHeader.SizeOfUninitializedData =3D 0; NtHdr->Pe32Plus.OptionalHeader.AddressOfEntryPoint =3D CoffEntry; =20 @@ -989,8 +1071,17 @@ ScanSections64 ( NtHdr->Pe32Plus.FileHeader.NumberOfSections--; } =20 + // + // If found symbol, add edata section between data and rsrc section + // + if(mExportFlag) { + Offset =3D mExportOffset; + } else { + Offset =3D mHiiRsrcOffset; + } + if ((mHiiRsrcOffset - mDataOffset) > 0) { - CreateSectionHeader (".data", mDataOffset, mHiiRsrcOffset - mDataOffse= t, + CreateSectionHeader (".data", mDataOffset, Offset - mDataOffset, EFI_IMAGE_SCN_CNT_INITIALIZED_DATA | EFI_IMAGE_SCN_MEM_WRITE | EFI_IMAGE_SCN_MEM_READ); @@ -999,6 +1090,20 @@ ScanSections64 ( NtHdr->Pe32Plus.FileHeader.NumberOfSections--; } =20 + if(mExportFlag) { + if ((mHiiRsrcOffset - mExportOffset) > 0) { + CreateSectionHeader (".edata", mExportOffset, mHiiRsrcOffset - mExpo= rtOffset, + EFI_IMAGE_SCN_CNT_INITIALIZED_DATA + | EFI_IMAGE_SCN_MEM_READ); + NtHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENT= RY_EXPORT].Size =3D mHiiRsrcOffset - mExportOffset; + NtHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENT= RY_EXPORT].VirtualAddress =3D mExportOffset; + NtHdr->Pe32Plus.FileHeader.NumberOfSections++; + } else { + // Don't make a section of size 0. + NtHdr->Pe32Plus.FileHeader.NumberOfSections--; + } + } + if ((mRelocOffset - mHiiRsrcOffset) > 0) { CreateSectionHeader (".rsrc", mHiiRsrcOffset, mRelocOffset - mHiiRsrcO= ffset, EFI_IMAGE_SCN_CNT_INITIALIZED_DATA @@ -1757,4 +1862,145 @@ CleanUp64 ( } } =20 +STATIC +VOID +ScanSymbol64 ( + VOID + ) +{ + UINT32 shIndex; + UINT32 SymIndex; + Elf_Sym *Sym; + UINT64 SymNum; + const UINT8 *SymName; + + for (shIndex =3D 0; shIndex < mEhdr->e_shnum; shIndex++) { + // + // Determine if this is a symbol section. + // + Elf_Shdr *shdr =3D GetShdrByIndex(shIndex); + if (!IsSymbolShdr(shdr)) { + continue; + } + + UINT8 *Symtab =3D (UINT8*)mEhdr + shdr->sh_offset; + SymNum =3D (shdr->sh_size) / (shdr->sh_entsize); + + // + // First Get PrmModuleExportDescriptor + // + for (SymIndex =3D 0; SymIndex < SymNum; SymIndex++) { + Sym =3D (Elf_Sym *)(Symtab + SymIndex * shdr->sh_entsize); + SymName =3D GetSymName(Sym); + if (SymName =3D=3D NULL) { + continue; + } + + if (strcmp((CHAR8*)SymName, PRM_MODULE_EXPORT_DESCRIPTOR_NAME) =3D= =3D 0) { + // + // Find PrmHandler Number and Name + // + FindPrmHandler(Sym->st_value); + + strcpy(mExportSymName[mExportSymNum], (CHAR8*)SymName); + mExportRVA[mExportSymNum] =3D (UINT32)(Sym->st_value); + mExportSize +=3D 2 * EFI_IMAGE_EXPORT_ADDR_SIZE + EFI_IMAGE_EXPORT= _ORDINAL_SIZE + strlen((CHAR8 *)SymName) + 1; + mExportSymNum ++; + break; + } + } + + // + // Second Get PrmHandler + // + for (SymIndex =3D 0; SymIndex < SymNum; SymIndex++) { + UINT32 ExpIndex; + Sym =3D (Elf_Sym *)(Symtab + SymIndex * shdr->sh_entsize); + SymName =3D GetSymName(Sym); + if (SymName =3D=3D NULL) { + continue; + } + + for (ExpIndex =3D 0; ExpIndex < (mExportSymNum -1); ExpIndex++) { + if (strcmp((CHAR8*)SymName, mExportSymName[ExpIndex]) !=3D 0) { + continue; + } + mExportRVA[ExpIndex] =3D (UINT32)(Sym->st_value); + mExportSize +=3D 2 * EFI_IMAGE_EXPORT_ADDR_SIZE + EFI_IMAGE_EXPORT= _ORDINAL_SIZE + strlen((CHAR8 *)SymName) + 1; + } + } + + break; + } +} + +STATIC +VOID +WriteExport64 ( + VOID + ) +{ + EFI_IMAGE_OPTIONAL_HEADER_UNION *NtHdr; + EFI_IMAGE_EXPORT_DIRECTORY *ExportDir; + EFI_IMAGE_DATA_DIRECTORY *DataDir; + UINT32 FileNameOffset; + UINT32 FuncOffset; + UINT16 Index; + UINT8 *Tdata =3D NULL; + + ExportDir =3D (EFI_IMAGE_EXPORT_DIRECTORY*)(mCoffFile + mExportOffset); + ExportDir->Characteristics =3D 0; + ExportDir->TimeDateStamp =3D 0; + ExportDir->MajorVersion =3D 0; + ExportDir->MinorVersion =3D0; + ExportDir->Name =3D 0; + ExportDir->NumberOfFunctions =3D mExportSymNum; + ExportDir->NumberOfNames =3D mExportSymNum; + ExportDir->Base =3D EFI_IMAGE_EXPORT_ORDINAL_BASE; + ExportDir->AddressOfFunctions =3D mExportOffset + sizeof(EFI_IMAGE_EXPOR= T_DIRECTORY); + ExportDir->AddressOfNames =3D ExportDir->AddressOfFunctions + EFI_IMAGE_= EXPORT_ADDR_SIZE * mExportSymNum; + ExportDir->AddressOfNameOrdinals =3D ExportDir->AddressOfNames + EFI_IMA= GE_EXPORT_ADDR_SIZE * mExportSymNum; + + FileNameOffset =3D ExportDir->AddressOfNameOrdinals + EFI_IMAGE_EXPORT_O= RDINAL_SIZE * mExportSymNum; + FuncOffset =3D FileNameOffset + strlen(mInImageName) + 1; + + // Write Input image Name RVA + Tdata =3D mCoffFile + 12; + *(UINT32 *)Tdata =3D FileNameOffset; + + // Write Input image Name + strcpy((char *)(mCoffFile + FileNameOffset), mInImageName); + + for (Index =3D 0; Index < mExportSymNum; Index++) { + // + // Write Export Address Table + // + Tdata =3D mCoffFile + ExportDir->AddressOfFunctions + Index * EFI_IMAG= E_EXPORT_ADDR_SIZE; + *(UINT32 *)Tdata =3D mExportRVA[Index]; + + // + // Write Export Name Pointer Table + // + Tdata =3D mCoffFile + ExportDir->AddressOfNames + Index * EFI_IMAGE_EX= PORT_ADDR_SIZE; + *(UINT32 *)Tdata =3D FuncOffset; + + // + // Write Export Ordinal table + // + Tdata =3D mCoffFile + ExportDir->AddressOfNameOrdinals + Index * EFI_I= MAGE_EXPORT_ORDINAL_SIZE; + *(UINT16 *)Tdata =3D Index; + + // + // Write Export Name Table + // + strcpy((char *)(mCoffFile + FuncOffset), mExportSymName[Index]); + FuncOffset +=3D strlen(mExportSymName[Index]) + 1; + } + + NtHdr =3D (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(mCoffFile + mNtHdrOffset); + DataDir =3D &NtHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRE= CTORY_ENTRY_EXPORT]; + DataDir->VirtualAddress =3D mExportOffset; + DataDir->Size =3D mExportSize; + +} =20 diff --git a/BaseTools/Source/C/GenFw/ElfConvert.c b/BaseTools/Source/C/Gen= Fw/ElfConvert.c index 7db8721167..795cdbd743 100644 --- a/BaseTools/Source/C/GenFw/ElfConvert.c +++ b/BaseTools/Source/C/GenFw/ElfConvert.c @@ -223,6 +223,16 @@ ConvertElf ( VerboseMsg ("Write debug info."); ElfFunctions.WriteDebug (); =20 + // + // For PRM Driver to Write export info. + // + if (mExportFlag) { + VerboseMsg ("Scan symbol info."); + ElfFunctions.ScanSymbol (); + VerboseMsg ("Write export info."); + ElfFunctions.WriteExport (); + } + // // Make sure image size is correct before returning the new image. // diff --git a/BaseTools/Source/C/GenFw/ElfConvert.h b/BaseTools/Source/C/Gen= Fw/ElfConvert.h index 801e8de4a2..7920765fbb 100644 --- a/BaseTools/Source/C/GenFw/ElfConvert.h +++ b/BaseTools/Source/C/GenFw/ElfConvert.h @@ -24,6 +24,7 @@ extern UINT8 *mCoffFile; extern UINT32 mTableOffset; extern UINT32 mOutImageType; extern UINT32 mFileBufferSize; +extern BOOLEAN mExportFlag; =20 // // Common EFI specific data. @@ -31,6 +32,42 @@ extern UINT32 mFileBufferSize; #define ELF_HII_SECTION_NAME ".hii" #define ELF_STRTAB_SECTION_NAME ".strtab" #define MAX_COFF_ALIGNMENT 0x10000 +#define ELF_SYMBOL_SECTION_NAME ".symtab" + +// +// Platform Runtime Mechanism (PRM) specific data. +// +#define PRM_MODULE_EXPORT_SYMBOL_NUM 10 +#define PRM_HANDLER_NAME_MAXIMUM_LENGTH 128 + +#define PRM_MODULE_EXPORT_DESCRIPTOR_NAME "PrmModuleExportDescript= or" +#define PRM_MODULE_EXPORT_DESCRIPTOR_SIGNATURE SIGNATURE_64 ('P', 'R', = 'M', '_', 'M', 'E', 'D', 'T') +#define PRM_MODULE_EXPORT_REVISION 0x0 + +// +// Platform Runtime Mechanism (PRM) Export Descriptor Structures +// +#pragma pack(push, 1) + +typedef struct { + EFI_GUID PrmHandlerGuid; + CHAR8 PrmHandlerName[PRM_HANDLER_NAME_MA= XIMUM_LENGTH]; +} PRM_HANDLER_EXPORT_DESCRIPTOR_STRUCT; + +typedef struct { + UINT64 Signature; + UINT16 Revision; + UINT16 NumberPrmHandlers; + EFI_GUID PlatformGuid; + EFI_GUID ModuleGuid; +} PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_HEADER; + +typedef struct { + PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_HEADER Header; + PRM_HANDLER_EXPORT_DESCRIPTOR_STRUCT PrmHandlerExportDescriptors[= 1]; +} PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT; + +#pragma pack(pop) =20 // // Filter Types @@ -38,7 +75,8 @@ extern UINT32 mFileBufferSize; typedef enum { SECTION_TEXT, SECTION_HII, - SECTION_DATA + SECTION_DATA, + SECTION_SYMBOL =20 } SECTION_FILTER_TYPES; =20 @@ -50,6 +88,8 @@ typedef struct { BOOLEAN (*WriteSections) (SECTION_FILTER_TYPES FilterType); VOID (*WriteRelocations) (); VOID (*WriteDebug) (); + VOID (*ScanSymbol) (); + VOID (*WriteExport) (); VOID (*SetImageSize) (); VOID (*CleanUp) (); =20 diff --git a/BaseTools/Source/C/GenFw/GenFw.c b/BaseTools/Source/C/GenFw/Ge= nFw.c index 8cab70ba4d..c7de5b89d8 100644 --- a/BaseTools/Source/C/GenFw/GenFw.c +++ b/BaseTools/Source/C/GenFw/GenFw.c @@ -87,7 +87,7 @@ UINT32 mImageTimeStamp =3D 0; UINT32 mImageSize =3D 0; UINT32 mOutImageType =3D FW_DUMMY_IMAGE; BOOLEAN mIsConvertXip =3D FALSE; - +BOOLEAN mExportFlag =3D FALSE; =20 STATIC EFI_STATUS @@ -1436,6 +1436,15 @@ Returns: continue; } =20 + if (stricmp (argv[0], "--PRM") =3D=3D 0) { + if (!mExportFlag) { + mExportFlag =3D TRUE; + } + argc --; + argv ++; + continue; + } + if (argv[0][0] =3D=3D '-') { Error (NULL, 0, 1000, "Unknown option", argv[0]); goto Finish; diff --git a/BaseTools/Source/C/Include/IndustryStandard/PeImage.h b/BaseTo= ols/Source/C/Include/IndustryStandard/PeImage.h index f17b8ee19b..21c968e650 100644 --- a/BaseTools/Source/C/Include/IndustryStandard/PeImage.h +++ b/BaseTools/Source/C/Include/IndustryStandard/PeImage.h @@ -571,6 +571,13 @@ typedef struct { UINT32 AddressOfNameOrdinals; } EFI_IMAGE_EXPORT_DIRECTORY; =20 +// +// Based export types. +// +#define EFI_IMAGE_EXPORT_ORDINAL_BASE 1 +#define EFI_IMAGE_EXPORT_ADDR_SIZE 4 +#define EFI_IMAGE_EXPORT_ORDINAL_SIZE 2 + /// /// DLL support. /// Import Format --=20 2.26.2.windows.1 -=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 (#85618): https://edk2.groups.io/g/devel/message/85618 Mute This Topic: https://groups.io/mt/88373239/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-