From: "Michael Kubacki" <mikuback@linux.microsoft.com>
To: "Huang, Li-Xia" <lisa.huang@intel.com>,
Michael Kubacki <michael.kubacki@outlook.com>,
"devel@edk2.groups.io" <devel@edk2.groups.io>,
"Gao, Liming" <gaoliming@byosoft.com.cn>,
"Feng, Bob C" <bob.c.feng@intel.com>
Cc: "Chen, Christine" <yuwei.chen@intel.com>,
"Wu, Yidong" <yidong.wu@intel.com>,
"Xu, Wei6" <wei6.xu@intel.com>,
"You, Benjamin" <benjamin.you@intel.com>
Subject: Re: [edk2-devel][PATCH] BaseTools/GenFw: Enhance to add export table in PE-COFF
Date: Wed, 26 Jan 2022 15:18:33 -0500 [thread overview]
Message-ID: <b15d7e6f-43ec-3d55-0715-83441692d74b@linux.microsoft.com> (raw)
In-Reply-To: <PH0PR11MB565988C23DD077758A26245B83209@PH0PR11MB5659.namprd11.prod.outlook.com>
Are you referring to "static data"? If so, no. That is allocated at boot
time and placed into the appropriate handler information structures.
The items in the export table for a given PRM Module are:
1. PRM handler count
2. Platform GUID (automatically applied from the DSC
EDKII_DSC_PLATFORM_GUID)
(https://bugzilla.tianocore.org/show_bug.cgi?id=2969)
3. The PRM Module GUID
4. A list of PRM handler GUID<->PRM handler names
(used by FW discovery to map handler in export to GUID entry in the
PRMT it produces)
https://github.com/tianocore/edk2-staging/blob/PlatformRuntimeMechanism/PrmPkg/Include/PrmExportDescriptor.h
Thanks,
Michael
On 1/26/2022 3:16 AM, Huang, Li-Xia wrote:
> Hi Michael,
>
> Sure, I will include you if any update on PRM functionality.
>
> BTW, I have a question about InitializedData, does it include export section or not? Thanks.
>
> Regards,
> Lisa
>
> -----Original Message-----
> From: Michael Kubacki <michael.kubacki@outlook.com>
> Sent: 2022年1月22日 10:50
> To: devel@edk2.groups.io; Huang, Li-Xia <lisa.huang@intel.com>; Gao, Liming <gaoliming@byosoft.com.cn>; Feng, Bob C <bob.c.feng@intel.com>
> Cc: Chen, Christine <yuwei.chen@intel.com>; Wu, Yidong <yidong.wu@intel.com>; Xu, Wei6 <wei6.xu@intel.com>; You, Benjamin <benjamin.you@intel.com>; mikuback@linux.microsoft.com
> Subject: Re: [edk2-devel][PATCH] BaseTools/GenFw: Enhance to add export table in PE-COFF
>
> Hi Lisa,
>
> Thank you for contributing this. Please include me on functionality related to PRM.
>
> I was using the PRM_EXPORT_API macro
> (https://github.com/tianocore/edk2-staging/blob/9da8abf66505d8ff636aaecc429a5237ce226650/PrmPkg/Include/Prm.h#L17)
> to support this on MS toolchain.
>
> It looks like this is to add similar functionality for ELF binaries using GenFw?
>
> Thanks,
> Michael
>
> On 1/18/2022 1:19 AM, Huang, Li-Xia wrote:
>> Hi Liming,
>>
>> Thanks for your feedback.
>>
>> I have added some detail in BZ. 😊
>>
>> https://bugzilla.tianocore.org/show_bug.cgi?id=3802#add_comment
>> <https://bugzilla.tianocore.org/show_bug.cgi?id=3802#add_comment>
>>
>> Regards,
>>
>> Lisa
>>
>> *From:*gaoliming <gaoliming@byosoft.com.cn>
>> *Sent:* 2022年1月18日13:20
>> *To:* devel@edk2.groups.io; Huang, Li-Xia <lisa.huang@intel.com>;
>> Feng, Bob C <bob.c.feng@intel.com>
>> *Cc:* Chen, Christine <yuwei.chen@intel.com>; Wu, Yidong
>> <yidong.wu@intel.com>; Xu, Wei6 <wei6.xu@intel.com>; You, Benjamin
>> <benjamin.you@intel.com>
>> *Subject:* 回复: [edk2-devel][PATCH] BaseTools/GenFw: Enhance to add
>> export table in PE-COFF
>>
>> Lisa:
>>
>> Can you give more background about PRM usage? What new usage
>> requires RPM? Can you add the detail in BZ?
>>
>> Thanks
>>
>> Liming
>>
>> *发件人**:*devel@edk2.groups.io
>> <mailto:devel@edk2.groups.io><devel@edk2.groups.io
>> <mailto:devel@edk2.groups.io>> *代表 *Huang, Li-Xia
>> *发送时间:* 2022年1月17日 11:09
>> *收件人:* Feng, Bob C <bob.c.feng@intel.com
>> <mailto:bob.c.feng@intel.com>>; devel@edk2.groups.io
>> <mailto:devel@edk2.groups.io>
>> *抄送:* Gao, Liming <gaoliming@byosoft.com.cn
>> <mailto:gaoliming@byosoft.com.cn>>; Chen, Christine
>> <yuwei.chen@intel.com <mailto:yuwei.chen@intel.com>>; Wu, Yidong
>> <yidong.wu@intel.com <mailto:yidong.wu@intel.com>>; Xu, Wei6
>> <wei6.xu@intel.com <mailto:wei6.xu@intel.com>>; You, Benjamin
>> <benjamin.you@intel.com <mailto:benjamin.you@intel.com>>
>> *主题:* Re: [edk2-devel][PATCH] BaseTools/GenFw: Enhance to add export
>> table in PE-COFF
>>
>> Hi Bob,
>>
>> Thanks for your comments.
>>
>> 1. I will add the help information for "--PRM";
>>
>> 2.
>>
>> @@ -750,7 +818,7 @@ ScanSections64 (
>>
>> if (shdr->sh_addralign <= mCoffAlignment) {
>>
>> continue;
>>
>> }
>>
>> - if (IsTextShdr(shdr) || IsDataShdr(shdr) || IsHiiRsrcShdr(shdr))
>> {
>>
>> + if (IsTextShdr(shdr) || IsDataShdr(shdr) || IsHiiRsrcShdr(shdr)
>> +||
>> IsSymbolShdr(shdr)) {
>>
>> mCoffAlignment = (UINT32)shdr->sh_addralign;
>>
>> }
>>
>> }
>>
>> 1) Above change is to Set mCoffAlignment to the maximum alignment of
>> the input sections including symbol section.
>>
>> The symbol section will only exist with below change, so it
>> should have no effect to other drivers.
>>
>> build_rule.template:
>>
>> <Command.GCC>
>>
>> $(CP) ${src} $(DEBUG_DIR)(+)$(MODULE_NAME).debug
>>
>> #$(OBJCOPY) --strip-unneeded -R .eh_frame ${src}
>>
>> $(OBJCOPY) $(OBJCOPY_STRIPFLAG) ${src}
>>
>> tools_def.template:
>>
>> *_*_*_OBJCOPY_STRIPFLAG = --strip-unneeded -R .eh_frame
>>
>> PrmAddrTransDsm.inf:
>>
>> [BuildOptions.common]
>>
>> ...
>>
>> GCC: *_*_*_OBJCOPY_STRIPFLAG == -R .eh_frame
>>
>> 2) For PRM driver, sh_addralign of symbol section is 8, and less than
>> other sections such as Text and Data (sh_addralign is 4096).
>>
>> Regards,
>>
>> Lisa
>>
>> -----Original Message-----
>> From: Feng, Bob C <bob.c.feng@intel.com <mailto:bob.c.feng@intel.com>>
>> Sent: 2022年1月14日 14:12
>> To: Huang, Li-Xia <lisa.huang@intel.com
>> <mailto:lisa.huang@intel.com>>; devel@edk2.groups.io
>> <mailto:devel@edk2.groups.io>
>> Cc: Gao, Liming <gaoliming@byosoft.com.cn
>> <mailto:gaoliming@byosoft.com.cn>>; Chen, Christine
>> <yuwei.chen@intel.com <mailto:yuwei.chen@intel.com>>
>> Subject: RE: [edk2-devel][PATCH] BaseTools/GenFw: Enhance to add
>> export table in PE-COFF
>>
>> Hi Lixia,
>>
>> This patch introduce a new command line option --PRM. Could you add
>> the help information about --PRM?
>>
>> Could you provide more information about the below change? Would there
>> be side-effect?
>>
>> @@ -750,7 +818,7 @@ ScanSections64 (
>>
>> if (shdr->sh_addralign <= mCoffAlignment) {
>>
>> continue;
>>
>> }
>>
>> - if (IsTextShdr(shdr) || IsDataShdr(shdr) || IsHiiRsrcShdr(shdr))
>> {
>>
>> + if (IsTextShdr(shdr) || IsDataShdr(shdr) || IsHiiRsrcShdr(shdr)
>> +||
>> IsSymbolShdr(shdr)) {
>>
>> mCoffAlignment = (UINT32)shdr->sh_addralign;
>>
>> }
>>
>> }
>>
>> Thanks,
>>
>> Bob
>>
>> -----Original Message-----
>>
>> From: Huang, Li-Xia <lisa.huang@intel.com
>> <mailto:lisa.huang@intel.com>>
>>
>> Sent: Wednesday, January 12, 2022 3:44 PM
>>
>> To: devel@edk2.groups.io <mailto:devel@edk2.groups.io>
>>
>> Cc: Huang, Li-Xia <lisa.huang@intel.com
>> <mailto:lisa.huang@intel.com>>; Gao, Liming <gaoliming@byosoft.com.cn
>> <mailto:gaoliming@byosoft.com.cn>>; Feng, Bob C <bob.c.feng@intel.com
>> <mailto:bob.c.feng@intel.com>>; Chen, Christine <yuwei.chen@intel.com
>> <mailto:yuwei.chen@intel.com>>
>>
>> Subject: [edk2-devel][PATCH] BaseTools/GenFw: Enhance to add export
>> table in PE-COFF
>>
>> REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3802
>> <https://bugzilla.tianocore.org/show_bug.cgi?id=3802>
>>
>> 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 <gaoliming@byosoft.com.cn
>> <mailto:gaoliming@byosoft.com.cn>>
>>
>> Cc: Bob Feng <bob.c.feng@intel.com <mailto:bob.c.feng@intel.com>>
>>
>> Cc: Yuwei Chen <yuwei.chen@intel.com <mailto:yuwei.chen@intel.com>>
>>
>> Signed-off-by: Lixia Huang <lisa.huang@intel.com
>> <mailto:lisa.huang@intel.com>>
>>
>> ---
>>
>> 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/GenFw/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 ); +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 = 0;
>>
>> STATIC INT32 mRiscVPass1Offset; STATIC INT32
>> mRiscVPass1GotFixup; +//+// 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_HANDLER_NAME_MAXIMUM_
>> LENGTH];+ // // Initialization Function //@@ -200,6 +220,10 @@
>> InitializeElf64 (
>>
>> ElfFunctions->SetImageSize = SetImageSize64;
>> ElfFunctions->CleanUp = CleanUp64; + if (mExportFlag) {+ ElfFunctions->ScanSymbol =
>> ScanSymbol64;+ ElfFunctions->WriteExport = WriteExport64;+ }
>> return TRUE; } @@ -263,6 +287,17 @@ IsHiiRsrcShdr (
>>
>> return (BOOLEAN) (strcmp((CHAR8*)mEhdr + Namedr->sh_offset +
>> Shdr->sh_name, ELF_HII_SECTION_NAME) == 0); }
>> +STATIC+BOOLEAN+IsSymbolShdr (+ Elf_Shdr *Shdr+ )+{+ Elf_Shdr
>> *Namehdr = GetShdrByIndex(mEhdr->e_shstrndx);++ return (BOOLEAN)
>> (strcmp((CHAR8*)mEhdr + Namehdr->sh_offset + Shdr->sh_name,
>> ELF_SYMBOL_SECTION_NAME) == 0);+}+ STATIC BOOLEAN IsDataShdr (@@
>> -335,6
>> +370,38 @@ GetSymName (
>>
>> return StrtabContents + Sym->st_name; } +//+// 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 =
>> (PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_HEADER*)(mCoffFile + Offset);+
>> NameOffset = sizeof(PRM_MODULE_EXPORT_DESCRIPTOR_STRUCT_HEADER) +
>> sizeof(EFI_GUID);++ for (HandlerNum = 0; HandlerNum <
>> PrmExport->NumberPrmHandlers; HandlerNum++) {+ for (Index = 0;
>> PrmExport->Index
>> < PRM_HANDLER_NAME_MAXIMUM_LENGTH; Index++) {+ SymName[Index] =
>> *((UINT8 *)PrmExport + NameOffset + Index);+ if (SymName[Index]
>> ==
>> 0) {+ break;+ }+ }++
>> strcpy(mExportSymName[mExportSymNum],
>> (CHAR8*)SymName);+ NameOffset += 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; CoffEntry = 0;
>> mCoffOffset = 0;@@ -750,7 +818,7 @@ ScanSections64 (
>>
>> if (shdr->sh_addralign <= mCoffAlignment) { continue;
>> }- if (IsTextShdr(shdr) || IsDataShdr(shdr) || IsHiiRsrcShdr(shdr))
>> {+ if (IsTextShdr(shdr) || IsDataShdr(shdr) || IsHiiRsrcShdr(shdr)
>> ||
>> IsSymbolShdr(shdr)) { mCoffAlignment =
>> (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); } + //+ // The Symbol sections.+ //+ if
>> (mExportFlag) {+ mExportOffset = mCoffOffset;+ mExportSize =
>> sizeof(EFI_IMAGE_EXPORT_DIRECTORY) + strlen(mInImageName) + 1;+
>> mCoffOffset += mExportSize;+ mCoffOffset = CoffAlign(mCoffOffset);+
>> }+ // // The HII resource sections. //@@ -962,7 +1040,11 @@
>> ScanSections64 (
>>
>> | EFI_IMAGE_FILE_LARGE_ADDRESS_AWARE;
>> NtHdr->Pe32Plus.OptionalHeader.SizeOfCode = mDataOffset -
>> NtHdr->mTextOffset;- Pe32Plus.OptionalHeader.SizeOfInitializedData =
>> NtHdr->mRelocOffset -
>> mDataOffset;+ if(mExportFlag) {+
>> NtHdr->Pe32Plus.OptionalHeader.SizeOfInitializedData = mRelocOffset -
>> mExportOffset;+ } else {+
>> NtHdr->Pe32Plus.OptionalHeader.SizeOfInitializedData = mRelocOffset -
>> mDataOffset;+ }
>> NtHdr->Pe32Plus.OptionalHeader.SizeOfUninitializedData = 0;
>> NtHdr->Pe32Plus.OptionalHeader.AddressOfEntryPoint = CoffEntry; @@
>> -989,8 +1071,17 @@ ScanSections64 (
>>
>> NtHdr->Pe32Plus.FileHeader.NumberOfSections--; } + //+ // If
>> found symbol, add edata section between data and rsrc section+ //+
>> if(mExportFlag) {+ Offset = mExportOffset;+ } else {+ Offset =
>> mHiiRsrcOffset;+ }+ if ((mHiiRsrcOffset - mDataOffset) > 0) {-
>> CreateSectionHeader (".data", mDataOffset, mHiiRsrcOffset -
>> mDataOffset,+ 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--; } +
>> if(mExportFlag) {+ if ((mHiiRsrcOffset - mExportOffset) > 0) {+
>> CreateSectionHeader (".edata", mExportOffset, mHiiRsrcOffset -
>> mExportOffset,+ EFI_IMAGE_SCN_CNT_INITIALIZED_DATA+ |
>> EFI_IMAGE_SCN_MEM_READ);+
>> NtHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY
>> NtHdr->_EXPORT].Size
>> = mHiiRsrcOffset - mExportOffset;+
>> NtHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY
>> NtHdr->_EXPORT].VirtualAddress
>> = 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 - mHiiRsrcOffset,
>> EFI_IMAGE_SCN_CNT_INITIALIZED_DATA@@ -1757,4 +1862,145 @@ CleanUp64 (
>>
>> } } +STATIC+VOID+ScanSymbol64 (+ VOID+ )+{+ UINT32
>> shIndex;+ UINT32 SymIndex;+ Elf_Sym *Sym;+ UINT64
>> SymNum;+ const UINT8 *SymName;++ for (shIndex = 0; shIndex <
>> mEhdr->e_shnum; shIndex++) {+ //+ // Determine if this is a
>> mEhdr->symbol
>> section.+ //+ Elf_Shdr *shdr = GetShdrByIndex(shIndex);+ if
>> (!IsSymbolShdr(shdr)) {+ continue;+ }++ UINT8 *Symtab =
>> (UINT8*)mEhdr + shdr->sh_offset;+ SymNum = (shdr->sh_size) /
>> (shdr->sh_entsize);++ //+ // First Get PrmModuleExportDescriptor+
>> //+ for (SymIndex = 0; SymIndex < SymNum; SymIndex++) {+ Sym =
>> (Elf_Sym *)(Symtab + SymIndex * shdr->sh_entsize);+ SymName =
>> GetSymName(Sym);+ if (SymName == NULL) {+ continue;+ }++
>> if (strcmp((CHAR8*)SymName, PRM_MODULE_EXPORT_DESCRIPTOR_NAME)
>> == 0) {+ //+ // Find PrmHandler Number and Name+
>> //+ FindPrmHandler(Sym->st_value);++
>> strcpy(mExportSymName[mExportSymNum], (CHAR8*)SymName);+
>> mExportRVA[mExportSymNum] = (UINT32)(Sym->st_value);+
>> mExportSize
>> += 2 * EFI_IMAGE_EXPORT_ADDR_SIZE + EFI_IMAGE_EXPORT_ORDINAL_SIZE +
>> strlen((CHAR8 *)SymName) + 1;+ mExportSymNum ++;+
>> break;+ }+ }++ //+ // Second Get PrmHandler+ //+ for
>> (SymIndex = 0; SymIndex < SymNum; SymIndex++) {+ UINT32
>> ExpIndex;+ Sym = (Elf_Sym *)(Symtab + SymIndex *
>> shdr->sh_entsize);+ SymName = GetSymName(Sym);+ if (SymName
>> shdr->==
>> NULL) {+ continue;+ }++ for (ExpIndex = 0; ExpIndex
>> < (mExportSymNum -1); ExpIndex++) {+ if (strcmp((CHAR8*)SymName,
>> mExportSymName[ExpIndex]) != 0) {+ continue;+ }+
>> mExportRVA[ExpIndex] = (UINT32)(Sym->st_value);+ mExportSize +=
>> 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 = NULL;++ ExportDir =
>> (EFI_IMAGE_EXPORT_DIRECTORY*)(mCoffFile + mExportOffset);+
>> ExportDir->Characteristics = 0;+ ExportDir->TimeDateStamp = 0;+
>> ExportDir->MajorVersion = 0;+ ExportDir->MinorVersion =0;+ Name = 0;+
>> ExportDir->ExportDir->NumberOfFunctions = mExportSymNum;+
>> ExportDir->NumberOfNames = mExportSymNum;+ ExportDir->Base =
>> EFI_IMAGE_EXPORT_ORDINAL_BASE;+ ExportDir->AddressOfFunctions =
>> mExportOffset + sizeof(EFI_IMAGE_EXPORT_DIRECTORY);+
>> ExportDir->AddressOfNames = ExportDir->AddressOfFunctions +
>> EFI_IMAGE_EXPORT_ADDR_SIZE * mExportSymNum;+
>> ExportDir->AddressOfNameOrdinals = ExportDir->AddressOfNames +
>> EFI_IMAGE_EXPORT_ADDR_SIZE * mExportSymNum;++ FileNameOffset =
>> ExportDir->AddressOfNameOrdinals + EFI_IMAGE_EXPORT_ORDINAL_SIZE *
>> mExportSymNum;+ FuncOffset = FileNameOffset + strlen(mInImageName) +
>> 1;++ // Write Input image Name RVA+ Tdata = mCoffFile + 12;+
>> *(UINT32 *)Tdata = FileNameOffset;++ // Write Input image Name+
>> strcpy((char *)(mCoffFile + FileNameOffset), mInImageName);++ for
>> (Index = 0; Index < mExportSymNum; Index++) {+ //+ // Write
>> Export Address Table+ //+ Tdata = mCoffFile +
>> ExportDir->AddressOfFunctions + Index * EFI_IMAGE_EXPORT_ADDR_SIZE;+ *(UINT32 *)Tdata =
>> mExportRVA[Index];++ //+ // Write Export Name Pointer Table+
>> //+ Tdata = mCoffFile + ExportDir->AddressOfNames + Index *
>> EFI_IMAGE_EXPORT_ADDR_SIZE;+ *(UINT32 *)Tdata = FuncOffset;++ //+
>> // Write Export Ordinal table+ //+ Tdata = mCoffFile +
>> ExportDir->AddressOfNameOrdinals + Index *
>> EFI_IMAGE_EXPORT_ORDINAL_SIZE;+ *(UINT16 *)Tdata = Index;++ //+
>> // Write Export Name Table+ //+ strcpy((char *)(mCoffFile +
>> FuncOffset), mExportSymName[Index]);+ FuncOffset +=
>> strlen(mExportSymName[Index]) + 1;+ }++ NtHdr =
>> (EFI_IMAGE_OPTIONAL_HEADER_UNION *)(mCoffFile + mNtHdrOffset);+
>> DataDir =
>> &NtHdr->Pe32Plus.OptionalHeader.DataDirectory[EFI_IMAGE_DIRECTORY_ENTR
>> Y_EXPORT];+
>> DataDir->VirtualAddress = mExportOffset;+ DataDir->Size =
>> mExportSize;++} diff --git a/BaseTools/Source/C/GenFw/ElfConvert.c
>> b/BaseTools/Source/C/GenFw/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 (); +
>> //+ // 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/GenFw/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; // // 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
>> "PrmModuleExportDescriptor"+#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_MAXIMUM_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) // // Filter
>> Types@@ -38,7 +75,8 @@ extern UINT32 mFileBufferSize;
>>
>> typedef enum { SECTION_TEXT, SECTION_HII,- SECTION_DATA+
>> SECTION_DATA,+ SECTION_SYMBOL } SECTION_FILTER_TYPES; @@ -50,6 +88,8
>> @@ typedef struct {
>>
>> BOOLEAN (*WriteSections) (SECTION_FILTER_TYPES FilterType);
>> VOID (*WriteRelocations) (); VOID (*WriteDebug) ();+ VOID
>> (*ScanSymbol) ();+ VOID (*WriteExport) (); VOID
>> (*SetImageSize) (); VOID (*CleanUp) (); diff --git
>> a/BaseTools/Source/C/GenFw/GenFw.c b/BaseTools/Source/C/GenFw/GenFw.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 = 0;
>>
>> UINT32 mImageSize = 0; UINT32 mOutImageType = FW_DUMMY_IMAGE; BOOLEAN
>> mIsConvertXip = FALSE;-+BOOLEAN mExportFlag = FALSE; STATIC
>> EFI_STATUS@@ -1436,6 +1436,15 @@ Returns:
>>
>> continue; } + if (stricmp (argv[0], "--PRM") == 0)
>> {+ if (!mExportFlag) {+ mExportFlag = TRUE;+ }+
>> argc --;+ argv ++;+ continue;+ }+ if (argv[0][0] ==
>> '-') { Error (NULL, 0, 1000, "Unknown option", argv[0]);
>> goto Finish;diff --git
>> a/BaseTools/Source/C/Include/IndustryStandard/PeImage.h
>> b/BaseTools/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; +//+//
>> 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--
>>
>> 2.26.2.windows.1
>>
>>
next prev parent reply other threads:[~2022-01-26 20:18 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-12 7:44 [edk2-devel][PATCH] BaseTools/GenFw: Enhance to add export table in PE-COFF Lixia Huang
2022-01-14 6:11 ` Bob Feng
2022-01-17 3:09 ` Huang, Li-Xia
2022-01-18 5:20 ` 回复: " gaoliming
2022-01-18 6:19 ` Huang, Li-Xia
2022-01-22 2:50 ` Michael Kubacki
2022-01-26 8:16 ` lisa.huang
2022-01-26 20:18 ` Michael Kubacki [this message]
2022-01-27 3:04 ` Huang, Li-Xia
2022-01-27 16:02 ` Michael Kubacki
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-list from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b15d7e6f-43ec-3d55-0715-83441692d74b@linux.microsoft.com \
--to=devel@edk2.groups.io \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox