From 942e747a913de3b27e73309bbcad936b28405ea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marvin=20Ha=CC=88user?= <8659494+mhaeuser@users.noreply.github.com> Date: Sat, 22 Apr 2023 01:21:42 +0200 Subject: [PATCH] ImageTool: Append .hii during PE generation --- BaseTools/Conf/build_rule.template | 60 +++++++---- BaseTools/Conf/tools_def.template | 16 --- BaseTools/ImageTool/BinEmit.c | 143 ++++---------------------- BaseTools/ImageTool/ElfScan.c | 159 ++++++----------------------- BaseTools/ImageTool/ImageTool.c | 48 ++++----- BaseTools/ImageTool/ImageTool.h | 12 ++- BaseTools/ImageTool/PeEmit.c | 52 +++++++--- BaseTools/ImageTool/PeScan.c | 27 ++--- 8 files changed, 176 insertions(+), 341 deletions(-) diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_rule.template index 94ae60e251..ec4dabaf4b 100755 --- a/BaseTools/Conf/build_rule.template +++ b/BaseTools/Conf/build_rule.template @@ -379,6 +379,45 @@ $(CP) ${dst} $(BIN_DIR)(+)$(MODULE_NAME_GUID).efi -$(CP) $(DEBUG_DIR)(+)*.map $(OUTPUT_DIR) +[Dynamic-Library-File.UEFI_HII] + + ?.dll + + + $(OUTPUT_DIR)(+)$(MODULE_NAME).efi + $(DEBUG_DIR)(+)$(MODULE_NAME).efi + $(OUTPUT_DIR)(+)$(MODULE_NAME).map + + + $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc + + + ImageTool PeXip ${src} ${dst} $(MODULE_TYPE) $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc + $(CP) ${dst} $(DEBUG_DIR) + $(CP) ${dst} $(BIN_DIR)(+)$(MODULE_NAME_GUID).efi + -$(CP) $(DEBUG_DIR)(+)*.map $(OUTPUT_DIR) + -$(CP) $(DEBUG_DIR)(+)*.pdb $(OUTPUT_DIR) + + + $(CP) ${src} $(DEBUG_DIR)(+)$(MODULE_NAME).strip + $(OBJCOPY) $(OBJCOPY_STRIPFLAG) $(DEBUG_DIR)(+)$(MODULE_NAME).strip + + ImageTool ElfToPe $(DEBUG_DIR)(+)$(MODULE_NAME).strip ${dst} $(MODULE_TYPE) $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc + + $(CP) ${dst} $(DEBUG_DIR) + $(CP) ${dst} $(BIN_DIR)(+)$(MODULE_NAME_GUID).efi + -$(CP) $(DEBUG_DIR)(+)*.map $(OUTPUT_DIR) + + + # tool to convert Mach-O to PE/COFF + "$(MTOC)" -subsystem $(MODULE_TYPE) $(MTOC_FLAGS) ${src} $(DEBUG_DIR)(+)$(MODULE_NAME).pecoff + # create symbol file for GDB debug + -$(DSYMUTIL) ${src} + ImageTool PeXip $(DEBUG_DIR)(+)$(MODULE_NAME).pecoff ${dst} $(MODULE_TYPE) $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc + $(CP) ${dst} $(DEBUG_DIR) + $(CP) ${dst} $(BIN_DIR)(+)$(MODULE_NAME_GUID).efi + -$(CP) $(DEBUG_DIR)(+)*.map $(OUTPUT_DIR) + [Dependency-Expression-File] ?.dxs, ?.Dxs, ?.DXS @@ -603,23 +642,8 @@ *.hpk - - $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.lib - - + $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc - - ImageTool HiiBinPe $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc $(MODULE_GUID) $(HII_BINARY_PACKAGES) - "$(RC)" /Fo${dst} -- $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc - - - ImageTool HiiBinPe $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc $(MODULE_GUID) $(HII_BINARY_PACKAGES) - "$(RC)" /Fo${dst} $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc - - - ImageTool HiiBinElf $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc $(MODULE_GUID) $(HII_BINARY_PACKAGES) - "$(RC)" $(RC_FLAGS) $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc ${dst} - - - ImageTool HiiBinElf $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc $(MODULE_GUID) $(HII_BINARY_PACKAGES) + + ImageTool HiiBin $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc $(MODULE_GUID) $(HII_BINARY_PACKAGES) diff --git a/BaseTools/Conf/tools_def.template b/BaseTools/Conf/tools_def.template index a1c821a90b..067884fc86 100755 --- a/BaseTools/Conf/tools_def.template +++ b/BaseTools/Conf/tools_def.template @@ -738,12 +738,6 @@ DEFINE GCC_ASLPP_FLAGS = -x c -E -include AutoGen.h DEFINE GCC_ASLCC_FLAGS = -x c DEFINE GCC_WINDRES_FLAGS = -J rc -O coff DEFINE GCC_DTCPP_FLAGS = -E -x assembler-with-cpp -imacros AutoGen.h -nostdinc -undef -DEFINE GCC_IA32_RC_FLAGS = -I binary -O elf32-i386 -B i386 --rename-section .data=.hii -DEFINE GCC_X64_RC_FLAGS = -I binary -O elf64-x86-64 -B i386 --rename-section .data=.hii -DEFINE GCC_ARM_RC_FLAGS = -I binary -O elf32-littlearm -B arm --rename-section .data=.hii -DEFINE GCC_AARCH64_RC_FLAGS = -I binary -O elf64-littleaarch64 -B aarch64 --rename-section .data=.hii -DEFINE GCC_RISCV64_RC_FLAGS = -I binary -O elf64-littleriscv -B riscv --rename-section .data=.hii -DEFINE GCC_LOONGARCH64_RC_FLAGS = -I binary -O elf64-loongarch -B loongarch64 --rename-section .data=.hii # GCC Build Flag for included header file list generation DEFINE GCC_DEPS_FLAGS = -MMD -MF $@.deps @@ -835,7 +829,6 @@ DEFINE GCC_PP_FLAGS = -E -x assembler-with-cpp -include A *_GCC5_IA32_ASLDLINK_FLAGS = DEF(GCC5_IA32_X64_ASLDLINK_FLAGS) -Wl,-q,-m,elf_i386 -no-pie *_GCC5_IA32_ASM_FLAGS = DEF(GCC5_ASM_FLAGS) -m32 -march=i386 *_GCC5_IA32_DLINK2_FLAGS = DEF(GCC5_IA32_DLINK2_FLAGS) -no-pie -*_GCC5_IA32_RC_FLAGS = DEF(GCC_IA32_RC_FLAGS) *_GCC5_IA32_NASM_FLAGS = -f elf32 -DRODATA_SECTION_NAME=.rodata DEBUG_GCC5_IA32_CC_FLAGS = DEF(GCC5_IA32_CC_FLAGS) -flto -Os @@ -866,7 +859,6 @@ RELEASE_GCC5_IA32_DLINK_FLAGS = DEF(GCC5_IA32_X64_DLINK_FLAGS) -flto -Os -Wl, *_GCC5_X64_ASLDLINK_FLAGS = DEF(GCC5_IA32_X64_ASLDLINK_FLAGS) -Wl,-m,elf_x86_64 *_GCC5_X64_ASM_FLAGS = DEF(GCC5_ASM_FLAGS) -m64 *_GCC5_X64_DLINK2_FLAGS = DEF(GCC5_X64_DLINK2_FLAGS) -*_GCC5_X64_RC_FLAGS = DEF(GCC_X64_RC_FLAGS) *_GCC5_X64_NASM_FLAGS = -f elf64 -DRODATA_SECTION_NAME=.rodata DEBUG_GCC5_X64_CC_FLAGS = DEF(GCC5_X64_CC_FLAGS) -flto -DUSING_LTO -Os @@ -899,7 +891,6 @@ RELEASE_GCC5_X64_DLINK_FLAGS = DEF(GCC5_X64_DLINK_FLAGS) -flto -Os *_GCC5_ARM_DLINK2_FLAGS = DEF(GCC5_ARM_DLINK2_FLAGS) *_GCC5_ARM_DTCPP_FLAGS = DEF(GCC_DTCPP_FLAGS) *_GCC5_ARM_PP_FLAGS = DEF(GCC_PP_FLAGS) -mthumb -march=armv7-a -*_GCC5_ARM_RC_FLAGS = DEF(GCC_ARM_RC_FLAGS) *_GCC5_ARM_VFRPP_FLAGS = DEF(GCC_VFRPP_FLAGS) -mthumb -march=armv7-a *_GCC5_ARM_CC_SECPEIFLAGS = DEF(GCC_ARM_CC_SECPEIFLAGS) @@ -933,7 +924,6 @@ RELEASE_GCC5_ARM_DLINK_FLAGS = DEF(GCC5_ARM_DLINK_FLAGS) -flto -Os -L$(WORKS *_GCC5_AARCH64_DLINK2_FLAGS = DEF(GCC5_AARCH64_DLINK2_FLAGS) *_GCC5_AARCH64_DTCPP_FLAGS = DEF(GCC_DTCPP_FLAGS) *_GCC5_AARCH64_PP_FLAGS = DEF(GCC_PP_FLAGS) -*_GCC5_AARCH64_RC_FLAGS = DEF(GCC_AARCH64_RC_FLAGS) *_GCC5_AARCH64_VFRPP_FLAGS = DEF(GCC_VFRPP_FLAGS) *_GCC5_AARCH64_CC_SECPEIFLAGS = DEF(GCC_AARCH64_CC_SECPEIFLAGS) @@ -977,7 +967,6 @@ RELEASE_GCC5_AARCH64_DLINK_SECPEIFLAGS = DEF(GCC_ALIGN) *_GCC5_RISCV64_CC_FLAGS = DEF(GCC5_RISCV64_CC_FLAGS) -save-temps *_GCC5_RISCV64_DLINK_FLAGS = DEF(GCC5_RISCV64_DLINK_FLAGS) *_GCC5_RISCV64_DLINK2_FLAGS = DEF(GCC5_RISCV64_DLINK2_FLAGS) -*_GCC5_RISCV64_RC_FLAGS = DEF(GCC_RISCV64_RC_FLAGS) *_GCC5_RISCV64_DTCPP_FLAGS = DEF(GCC_DTCPP_FLAGS) ################## @@ -1000,7 +989,6 @@ RELEASE_GCC5_AARCH64_DLINK_SECPEIFLAGS = DEF(GCC_ALIGN) *_GCC5_LOONGARCH64_ASM_FLAGS = DEF(GCC5_LOONGARCH64_ASM_FLAGS) *_GCC5_LOONGARCH64_DLINK_FLAGS = DEF(GCC5_LOONGARCH64_DLINK_FLAGS) *_GCC5_LOONGARCH64_DLINK2_FLAGS = DEF(GCC5_LOONGARCH64_DLINK2_FLAGS) -*_GCC5_LOONGARCH64_RC_FLAGS = DEF(GCC_LOONGARCH64_RC_FLAGS) *_GCC5_LOONGARCH64_NASM_FLAGS = -f elf32 *_GCC5_LOONGARCH64_PP_FLAGS = DEF(GCC5_LOONGARCH64_PP_FLAGS) @@ -1158,7 +1146,6 @@ DEFINE CLANGDWARF_IA32_DLINK2_FLAGS = -no-pie *_CLANGDWARF_IA32_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) -m32 -fno-lto DEF(CLANGDWARF_IA32_TARGET) *_CLANGDWARF_IA32_ASLDLINK_FLAGS = DEF(CLANGDWARF_IA32_X64_ASLDLINK_FLAGS) -Wl,-q,-m,elf_i386 -fuse-ld=lld -no-pie *_CLANGDWARF_IA32_ASM_FLAGS = DEF(GCC5_ASM_FLAGS) -m32 -march=i386 DEF(CLANGDWARF_IA32_TARGET) -*_CLANGDWARF_IA32_RC_FLAGS = DEF(GCC_IA32_RC_FLAGS) *_CLANGDWARF_IA32_NASM_FLAGS = -f elf32 -DRODATA_SECTION_NAME=.rodata *_CLANGDWARF_IA32_PP_FLAGS = DEF(GCC_PP_FLAGS) DEF(CLANGDWARF_IA32_TARGET) *_CLANGDWARF_IA32_ASLPP_FLAGS = DEF(GCC_ASLPP_FLAGS) DEF(CLANGDWARF_IA32_TARGET) @@ -1194,7 +1181,6 @@ NOOPT_CLANGDWARF_IA32_DLINK2_FLAGS = DEF(CLANGDWARF_IA32_DLINK2_FLAGS) -O0 - *_CLANGDWARF_X64_ASLCC_FLAGS = DEF(GCC_ASLCC_FLAGS) -m64 -fno-lto DEF(CLANGDWARF_X64_TARGET) *_CLANGDWARF_X64_ASLDLINK_FLAGS = DEF(CLANGDWARF_IA32_X64_ASLDLINK_FLAGS) -Wl,-m,elf_x86_64 -fuse-ld=lld *_CLANGDWARF_X64_ASM_FLAGS = DEF(GCC5_ASM_FLAGS) -m64 DEF(CLANGDWARF_X64_TARGET) -*_CLANGDWARF_X64_RC_FLAGS = DEF(GCC_X64_RC_FLAGS) *_CLANGDWARF_X64_NASM_FLAGS = -f elf64 -DRODATA_SECTION_NAME=.rodata *_CLANGDWARF_X64_PP_FLAGS = DEF(GCC_PP_FLAGS) DEF(CLANGDWARF_X64_TARGET) *_CLANGDWARF_X64_ASLPP_FLAGS = DEF(GCC_ASLPP_FLAGS) DEF(CLANGDWARF_X64_TARGET) @@ -1242,7 +1228,6 @@ DEFINE CLANGDWARF_ARM_DLINK_FLAGS = DEF(CLANGDWARF_ARM_TARGET) DEF(GCC_ARM_DLI *_CLANGDWARF_ARM_ASM_FLAGS = DEF(GCC_ASM_FLAGS) DEF(CLANGDWARF_ARM_TARGET) -march=armv7-a -Qunused-arguments *_CLANGDWARF_ARM_DLINK2_FLAGS = DEF(GCC_DLINK2_FLAGS_COMMON) *_CLANGDWARF_ARM_PP_FLAGS = DEF(GCC_PP_FLAGS) DEF(CLANGDWARF_ARM_TARGET) -march=armv7-a -*_CLANGDWARF_ARM_RC_FLAGS = DEF(GCC_ARM_RC_FLAGS) *_CLANGDWARF_ARM_VFRPP_FLAGS = DEF(GCC_VFRPP_FLAGS) DEF(CLANGDWARF_ARM_TARGET) -march=armv7-a *_CLANGDWARF_ARM_ASLPP_FLAGS = DEF(GCC_ASLPP_FLAGS) DEF(CLANGDWARF_ARM_TARGET) *_CLANGDWARF_ARM_CC_SECPEIFLAGS = DEF(GCC_ARM_CC_SECPEIFLAGS) @@ -1286,7 +1271,6 @@ DEFINE CLANGDWARF_AARCH64_DLINK_FLAGS = DEF(CLANGDWARF_AARCH64_TARGET) DEF(GCC_ *_CLANGDWARF_AARCH64_DLINK_SECPEIFLAGS = DEF(GCC_ALIGN) *_CLANGDWARF_AARCH64_DLINK2_FLAGS = DEF(GCC_DLINK2_FLAGS_COMMON) *_CLANGDWARF_AARCH64_PP_FLAGS = DEF(GCC_PP_FLAGS) DEF(CLANGDWARF_AARCH64_TARGET) -*_CLANGDWARF_AARCH64_RC_FLAGS = DEF(GCC_AARCH64_RC_FLAGS) *_CLANGDWARF_AARCH64_VFRPP_FLAGS = DEF(GCC_VFRPP_FLAGS) DEF(CLANGDWARF_AARCH64_TARGET) *_CLANGDWARF_AARCH64_ASLPP_FLAGS = DEF(GCC_ASLPP_FLAGS) DEF(CLANGDWARF_AARCH64_TARGET) *_CLANGDWARF_AARCH64_CC_SECPEIFLAGS = DEF(GCC_AARCH64_CC_SECPEIFLAGS) diff --git a/BaseTools/ImageTool/BinEmit.c b/BaseTools/ImageTool/BinEmit.c index 36a5f61863..9712ad6843 100644 --- a/BaseTools/ImageTool/BinEmit.c +++ b/BaseTools/ImageTool/BinEmit.c @@ -58,33 +58,24 @@ CreateStringEntry ( *HiiSectionOffset += sizeof (*RDStr) + RDStr->Length * sizeof (RDStr->String[0]); } -static -UINT8 * -CreateHiiResouceSectionHeader ( - OUT UINT32 *HiiHeaderSize, +GLOBAL_REMOVE_IF_UNREFERENCED CONST UINT8 mHiiResourceSectionHeaderSize = + 3 * (sizeof (EFI_IMAGE_RESOURCE_DIRECTORY) + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY) + + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_STRING) + 3 * sizeof (CHAR16)) + sizeof (EFI_IMAGE_RESOURCE_DATA_ENTRY); + +VOID +InitializeHiiResouceSectionHeader ( + OUT UINT8 *HiiSectionHeader, + IN UINT32 HiiDataAddress, IN UINT32 HiiDataSize ) { - UINT32 HiiSectionHeaderSize; UINT32 HiiSectionOffset; - UINT8 *HiiSectionHeader; EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *TypeRDirEntry; EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *NameRDirEntry; EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *LangRDirEntry; EFI_IMAGE_RESOURCE_DATA_ENTRY *ResourceDataEntry; - assert (HiiHeaderSize != NULL); - // - // Calculate the total size for the resource header (include Type, Name and Language) - // then allocate memory for whole Hii file. - // - HiiSectionHeaderSize = 3 * (sizeof (EFI_IMAGE_RESOURCE_DIRECTORY) + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY) - + sizeof (EFI_IMAGE_RESOURCE_DIRECTORY_STRING) + 3 * sizeof (CHAR16)) + sizeof (EFI_IMAGE_RESOURCE_DATA_ENTRY); - HiiSectionHeader = calloc (1, HiiSectionHeaderSize + HiiDataSize); - if (HiiSectionHeader == NULL) { - fprintf (stderr, "ImageTool: Could not allocate memory for Hii\n"); - return NULL; - } + assert (HiiSectionHeader != NULL); HiiSectionOffset = 0; // @@ -105,12 +96,8 @@ CreateHiiResouceSectionHeader ( LangRDirEntry->u2.OffsetToData = HiiSectionOffset; ResourceDataEntry = (EFI_IMAGE_RESOURCE_DATA_ENTRY *)(HiiSectionHeader + HiiSectionOffset); HiiSectionOffset += sizeof (EFI_IMAGE_RESOURCE_DATA_ENTRY); - ResourceDataEntry->OffsetToData = HiiSectionOffset; + ResourceDataEntry->OffsetToData = HiiDataAddress + HiiSectionOffset; ResourceDataEntry->Size = HiiDataSize; - - *HiiHeaderSize = HiiSectionHeaderSize; - - return HiiSectionHeader; } RETURN_STATUS @@ -119,27 +106,19 @@ ConstructHii ( IN UINT32 NumOfFiles, IN GUID *HiiGuid, OUT void **Hii, - OUT UINT32 *HiiSize, - IN BOOLEAN IsElf + OUT UINT32 *HiiSize ) { + UINT8 *HiiPackageData; UINT8 *HiiPackageDataPointer; EFI_HII_PACKAGE_LIST_HEADER HiiPackageListHeader; EFI_HII_PACKAGE_HEADER *HiiPackageHeader; EFI_IFR_FORM_SET *IfrFormSet; EFI_HII_PACKAGE_HEADER EndPackage; - UINT32 HiiSectionHeaderSize; - UINT8 *HiiSectionHeader; - const char *HiiPackageRCFileHeader; UINT32 Index; - UINT32 Total; - UINT8 *Buffer; - UINT8 *BufferStart; - UINT32 Step; void *File; UINT32 FileSize; UINT8 NumberOfFormPackages; - UINT32 TempSize; assert (Hii != NULL); assert (HiiGuid != NULL); @@ -191,111 +170,31 @@ ConstructHii ( CopyGuid (&HiiPackageListHeader.PackageListGuid, HiiGuid); - if (IsElf) { - HiiSectionHeader = CreateHiiResouceSectionHeader (&HiiSectionHeaderSize, HiiPackageListHeader.PackageLength); - if (HiiSectionHeader == NULL) { - return RETURN_OUT_OF_RESOURCES; - } - - HiiPackageDataPointer = HiiSectionHeader + HiiSectionHeaderSize; - - memcpy (HiiPackageDataPointer, &HiiPackageListHeader, sizeof (HiiPackageListHeader)); - HiiPackageDataPointer += sizeof (HiiPackageListHeader); - - for (Index = 0; Index < NumOfFiles; ++Index) { - File = UserReadFile (FileNames[Index], &FileSize); - if (File == NULL) { - fprintf (stderr, "ImageTool: Could not open %s: %s\n", FileNames[Index], strerror (errno)); - free (HiiSectionHeader); - return RETURN_ABORTED; - } - - memcpy (HiiPackageDataPointer, File, FileSize); - HiiPackageDataPointer += FileSize; - - free (File); - } - - memcpy (HiiPackageDataPointer, &EndPackage, sizeof (EndPackage)); - - *Hii = HiiSectionHeader; - *HiiSize = HiiSectionHeaderSize + HiiPackageListHeader.PackageLength; - - return RETURN_SUCCESS; - } - - HiiPackageRCFileHeader = "//\n// DO NOT EDIT -- auto-generated file\n//\n\n1 HII\n{"; - HiiSectionHeaderSize = (UINT32)AsciiStrLen (HiiPackageRCFileHeader); - - TempSize = HiiSectionHeaderSize + 5 * HiiPackageListHeader.PackageLength; - HiiSectionHeader = calloc (1, TempSize); - if (HiiSectionHeader == NULL) { - fprintf (stderr, "ImageTool: Could not allocate memory for HiiRC\n"); + HiiPackageData = calloc (1, HiiPackageListHeader.PackageLength); + if (HiiPackageData == NULL) { return RETURN_OUT_OF_RESOURCES; } - Buffer = calloc (1, HiiPackageListHeader.PackageLength); - if (Buffer == NULL) { - fprintf (stderr, "ImageTool: Could not allocate memory for Buffer\n"); - free (HiiSectionHeader); - return RETURN_OUT_OF_RESOURCES; - } - - BufferStart = Buffer; - memcpy (Buffer, &HiiPackageListHeader, sizeof (HiiPackageListHeader)); - Buffer += sizeof (HiiPackageListHeader); + memmove (HiiPackageData, &HiiPackageListHeader, sizeof (HiiPackageListHeader)); + HiiPackageDataPointer = HiiPackageData + sizeof (HiiPackageListHeader); for (Index = 0; Index < NumOfFiles; ++Index) { File = UserReadFile (FileNames[Index], &FileSize); if (File == NULL) { fprintf (stderr, "ImageTool: Could not open %s: %s\n", FileNames[Index], strerror (errno)); - free (HiiSectionHeader); - free (BufferStart); return RETURN_ABORTED; } - memcpy (Buffer, File, FileSize); - Buffer += FileSize; + memmove (HiiPackageDataPointer, File, FileSize); + HiiPackageDataPointer += FileSize; free (File); } - memcpy (Buffer, &EndPackage, sizeof (EndPackage)); + memmove (HiiPackageDataPointer, &EndPackage, sizeof (EndPackage)); - memcpy (HiiSectionHeader, HiiPackageRCFileHeader, HiiSectionHeaderSize); - HiiPackageDataPointer = HiiSectionHeader + HiiSectionHeaderSize; - - Total = HiiSectionHeaderSize; - Buffer = BufferStart; - for (Index = 0; Index + 2 < HiiPackageListHeader.PackageLength; Index += 2) { - if (Index % 16 == 0) { - Step = snprintf ((char *)HiiPackageDataPointer, TempSize - Total, "\n "); - HiiPackageDataPointer += Step; - Total += Step; - } - - Step = snprintf ((char *)HiiPackageDataPointer, TempSize - Total, " 0x%04X,", *(UINT16 *)Buffer); - HiiPackageDataPointer += Step; - Total += Step; - Buffer += 2; - } - - if (Index % 16 == 0) { - Step = snprintf ((char *)HiiPackageDataPointer, TempSize - Total, "\n "); - HiiPackageDataPointer += Step; - Total += Step; - } - - if ((Index + 2) == HiiPackageListHeader.PackageLength) { - Total += snprintf ((char *)HiiPackageDataPointer, TempSize - Total, " 0x%04X\n}\n", *(UINT16 *)Buffer); - } else if ((Index + 1) == HiiPackageListHeader.PackageLength) { - Total += snprintf ((char *)HiiPackageDataPointer, TempSize - Total, " 0x%04X\n}\n", *(UINT8 *)Buffer); - } - - *Hii = HiiSectionHeader; - *HiiSize = Total; - - free (BufferStart); + *Hii = HiiPackageData; + *HiiSize = HiiPackageListHeader.PackageLength; return RETURN_SUCCESS; } diff --git a/BaseTools/ImageTool/ElfScan.c b/BaseTools/ImageTool/ElfScan.c index e42b624bab..6cad939a50 100644 --- a/BaseTools/ImageTool/ElfScan.c +++ b/BaseTools/ImageTool/ElfScan.c @@ -45,8 +45,6 @@ #define ELF_SUFFIX_(Name, Arch) ELF_SUFFIX__ (Name, Arch) #define ELF_SUFFIX(Name) ELF_SUFFIX_ (Name, ELF_ARCH) -#define ELF_HII_SECTION_NAME ".hii" - typedef struct { const Elf_Ehdr *Ehdr; uint32_t Alignment; @@ -104,21 +102,6 @@ GetString ( return (const char *)Ehdr + Shdr->sh_offset + Offset; } -#define GetSIsHiiRsrcShdrtring ELF_SUFFIX(IsHiiRsrcShdr) -static -BOOLEAN -IsHiiRsrcShdr ( - IN const Elf_Ehdr *Ehdr, - IN const Elf_Shdr *Shdr - ) -{ - assert (Shdr != NULL); - - Elf_Shdr *Namedr = GetShdrByIndex (Ehdr, Ehdr->e_shstrndx); - - return strcmp ((const char *)Ehdr + Namedr->sh_offset + Shdr->sh_name, ELF_HII_SECTION_NAME) == 0; -} - #define IsShdrLoadable ELF_SUFFIX(IsShdrLoadable) static BOOLEAN @@ -129,71 +112,7 @@ IsShdrLoadable ( { assert (Shdr != NULL); - return (Shdr->sh_flags & SHF_ALLOC) != 0 && !IsHiiRsrcShdr (Ehdr, Shdr); -} - -#define SetHiiResourceHeader ELF_SUFFIX(SetHiiResourceHeader) -static -VOID -SetHiiResourceHeader ( - IN OUT UINT8 *Hii, - IN UINT32 Offset - ) -{ - UINT32 Index; - EFI_IMAGE_RESOURCE_DIRECTORY *RDir; - EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *RDirEntry; - EFI_IMAGE_RESOURCE_DIRECTORY_STRING *RDirString; - EFI_IMAGE_RESOURCE_DATA_ENTRY *RDataEntry; - - assert (Hii != NULL); - - // - // Fill Resource section entry - // - RDir = (EFI_IMAGE_RESOURCE_DIRECTORY *)Hii; - RDirEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *)(RDir + 1); - for (Index = 0; Index < RDir->NumberOfNamedEntries; ++Index) { - if (RDirEntry->u1.s.NameIsString) { - RDirString = (EFI_IMAGE_RESOURCE_DIRECTORY_STRING *)(Hii + RDirEntry->u1.s.NameOffset); - - if ((RDirString->Length == 3) - && (RDirString->String[0] == L'H') - && (RDirString->String[1] == L'I') - && (RDirString->String[2] == L'I')) { - // - // Resource Type "HII" found - // - if (RDirEntry->u2.s.DataIsDirectory) { - // - // Move to next level - resource Name - // - RDir = (EFI_IMAGE_RESOURCE_DIRECTORY *)(Hii + RDirEntry->u2.s.OffsetToDirectory); - RDirEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *)(RDir + 1); - - if (RDirEntry->u2.s.DataIsDirectory) { - // - // Move to next level - resource Language - // - RDir = (EFI_IMAGE_RESOURCE_DIRECTORY *)(Hii + RDirEntry->u2.s.OffsetToDirectory); - RDirEntry = (EFI_IMAGE_RESOURCE_DIRECTORY_ENTRY *)(RDir + 1); - } - } - - // - // Now it ought to be resource Data. Update its OffsetToData value - // - if (!RDirEntry->u2.s.DataIsDirectory) { - RDataEntry = (EFI_IMAGE_RESOURCE_DATA_ENTRY *)(Hii + RDirEntry->u2.OffsetToData); - RDataEntry->OffsetToData = RDataEntry->OffsetToData + Offset; - break; - } - } - } - RDirEntry++; - } - - return; + return (Shdr->sh_flags & SHF_ALLOC) != 0; } #define ParseElfFile ELF_SUFFIX(ParseElfFile) @@ -689,53 +608,37 @@ CreateIntermediate ( return RETURN_VOLUME_CORRUPTED; } - if (IsHiiRsrcShdr (Ehdr, Shdr)) { - ImageInfo->HiiInfo.DataSize = (uint32_t)Shdr->sh_size; - - ImageInfo->HiiInfo.Data = calloc (1, ImageInfo->HiiInfo.DataSize); - if (ImageInfo->HiiInfo.Data == NULL) { - fprintf (stderr, "ImageTool: Could not allocate memory for Hii Data\n"); - return RETURN_OUT_OF_RESOURCES; - }; - - if (Shdr->sh_type == SHT_PROGBITS) { - memcpy (ImageInfo->HiiInfo.Data, (const char *)Ehdr + Shdr->sh_offset, ImageInfo->HiiInfo.DataSize); - } - - SetHiiResourceHeader (ImageInfo->HiiInfo.Data, (UINT32)(Shdr->sh_addr - BaseAddress)); - } else { - Name = GetString (Ehdr, Shdr->sh_name, 0); - if (Name == NULL) { - return RETURN_VOLUME_CORRUPTED; - } - - Segments[SIndex].Name = calloc (1, strlen (Name) + 1); - if (Segments[SIndex].Name == NULL) { - fprintf (stderr, "ImageTool: Could not allocate memory for Segment #%d Name\n", Index); - return RETURN_OUT_OF_RESOURCES; - }; - - memcpy (Segments[SIndex].Name, Name, strlen (Name)); - - Segments[SIndex].ImageAddress = (uint32_t)(Shdr->sh_addr - BaseAddress); - Segments[SIndex].DataSize = (uint32_t)Shdr->sh_size; - Segments[SIndex].ImageSize = ALIGN_VALUE (Segments[SIndex].DataSize, Context->Alignment); - Segments[SIndex].Read = true; - Segments[SIndex].Write = (Shdr->sh_flags & SHF_WRITE) != 0; - Segments[SIndex].Execute = (Shdr->sh_flags & SHF_EXECINSTR) != 0; - - Segments[SIndex].Data = calloc (1, Segments[SIndex].ImageSize); - if (Segments[SIndex].Data == NULL) { - fprintf (stderr, "ImageTool: Could not allocate memory for Segment #%d Data\n", Index); - return RETURN_OUT_OF_RESOURCES; - }; - - if (Shdr->sh_type == SHT_PROGBITS) { - memcpy (Segments[SIndex].Data, (const char *)Ehdr + Shdr->sh_offset, (size_t)Shdr->sh_size); - } - - ++SIndex; + Name = GetString (Ehdr, Shdr->sh_name, 0); + if (Name == NULL) { + return RETURN_VOLUME_CORRUPTED; } + + Segments[SIndex].Name = calloc (1, strlen (Name) + 1); + if (Segments[SIndex].Name == NULL) { + fprintf (stderr, "ImageTool: Could not allocate memory for Segment #%d Name\n", Index); + return RETURN_OUT_OF_RESOURCES; + }; + + memcpy (Segments[SIndex].Name, Name, strlen (Name)); + + Segments[SIndex].ImageAddress = (uint32_t)(Shdr->sh_addr - BaseAddress); + Segments[SIndex].DataSize = (uint32_t)Shdr->sh_size; + Segments[SIndex].ImageSize = ALIGN_VALUE (Segments[SIndex].DataSize, Context->Alignment); + Segments[SIndex].Read = true; + Segments[SIndex].Write = (Shdr->sh_flags & SHF_WRITE) != 0; + Segments[SIndex].Execute = (Shdr->sh_flags & SHF_EXECINSTR) != 0; + + Segments[SIndex].Data = calloc (1, Segments[SIndex].ImageSize); + if (Segments[SIndex].Data == NULL) { + fprintf (stderr, "ImageTool: Could not allocate memory for Segment #%d Data\n", Index); + return RETURN_OUT_OF_RESOURCES; + }; + + if (Shdr->sh_type == SHT_PROGBITS) { + memcpy (Segments[SIndex].Data, (const char *)Ehdr + Shdr->sh_offset, (size_t)Shdr->sh_size); + } + + ++SIndex; } assert (SIndex == ImageInfo->SegmentInfo.NumSegments); diff --git a/BaseTools/ImageTool/ImageTool.c b/BaseTools/ImageTool/ImageTool.c index 711723367b..1b7032c887 100644 --- a/BaseTools/ImageTool/ImageTool.c +++ b/BaseTools/ImageTool/ImageTool.c @@ -18,8 +18,7 @@ HiiBin ( IN const char *HiiName, IN const char *Guid, IN const char *FileNames[], - IN UINT32 NumOfFiles, - IN BOOLEAN IsElf + IN UINT32 NumOfFiles ) { RETURN_STATUS Status; @@ -37,7 +36,7 @@ HiiBin ( return Status; } - Status = ConstructHii (FileNames, NumOfFiles, &HiiGuid, &Hii, &HiiSize, IsElf); + Status = ConstructHii (FileNames, NumOfFiles, &HiiGuid, &Hii, &HiiSize); if (RETURN_ERROR (Status)) { fprintf (stderr, "ImageTool: Could not construct HiiBin\n"); return Status; @@ -278,11 +277,14 @@ GenExecutable ( IN const char *InputFileName, IN const char *FormatName, IN const char *TypeName, + IN const char *HiiFileName, IN const char *BaseAddress ) { UINT32 InputFileSize; VOID *InputFile; + UINT32 HiiFileSize; + VOID *HiiFile; RETURN_STATUS Status; bool Result; image_tool_image_info_t ImageInfo; @@ -316,6 +318,19 @@ GenExecutable ( } } + if (HiiFileName != NULL) { + HiiFile = UserReadFile (HiiFileName, &HiiFileSize); + if (HiiFile == NULL) { + fprintf (stderr, "ImageTool: Could not open %s: %s\n", HiiFileName, strerror (errno)); + return RETURN_ABORTED; + } + + free (ImageInfo.HiiInfo.Data); + + ImageInfo.HiiInfo.Data = HiiFile; + ImageInfo.HiiInfo.DataSize = HiiFileSize; + } + Result = CheckToolImage (&ImageInfo); if (!Result) { ToolImageDestruct (&ImageInfo); @@ -371,42 +386,27 @@ int main (int argc, const char *argv[]) if (strcmp (argv[1], "ElfToPe") == 0 || strcmp (argv[1], "PeXip") == 0) { if (argc < 5) { fprintf (stderr, "ImageTool: Command arguments are missing\n"); - fprintf (stderr, " Usage: ImageTool %s InputFile OutputFile ModuleType\n", argv[1]); + fprintf (stderr, " Usage: ImageTool %s InputFile OutputFile ModuleType [HiiRc]\n", argv[1]); raise (); return -1; } - Status = GenExecutable (argv[3], argv[2], "PE", argv[4], NULL); + Status = GenExecutable (argv[3], argv[2], "PE", argv[4], argc >= 6 ? argv[5] : NULL, NULL); if (RETURN_ERROR (Status)) { raise (); return -1; } - } else if (strcmp (argv[1], "HiiBinElf") == 0) { + } else if (strcmp (argv[1], "HiiBin") == 0) { if (argc < 5) { fprintf (stderr, "ImageTool: Command arguments are missing\n"); - fprintf (stderr, " Usage: ImageTool HiiBinElf OutputFile GUID InputFile1 InputFile2 ...\n"); + fprintf (stderr, " Usage: ImageTool HiiBin OutputFile GUID InputFile1 InputFile2 ...\n"); raise (); return -1; } NumOfFiles = (UINT32)argc - 4U; - Status = HiiBin (argv[2], argv[3], &argv[4], NumOfFiles, TRUE); - if (RETURN_ERROR (Status)) { - raise (); - return -1; - } - } else if (strcmp (argv[1], "HiiBinPe") == 0) { - if (argc < 5) { - fprintf (stderr, "ImageTool: Command arguments are missing\n"); - fprintf (stderr, " Usage: ImageTool HiiBinPe OutputFile GUID InputFile1 InputFile2 ...\n"); - raise (); - return -1; - } - - NumOfFiles = (UINT32)argc - 4U; - - Status = HiiBin (argv[2], argv[3], &argv[4], NumOfFiles, FALSE); + Status = HiiBin (argv[2], argv[3], &argv[4], NumOfFiles); if (RETURN_ERROR (Status)) { raise (); return -1; @@ -419,7 +419,7 @@ int main (int argc, const char *argv[]) return -1; } - Status = GenExecutable (argv[4], argv[3], "PE", NULL, argv[2]); + Status = GenExecutable (argv[4], argv[3], "PE", NULL, NULL, argv[2]); if (RETURN_ERROR (Status)) { raise (); return -1; diff --git a/BaseTools/ImageTool/ImageTool.h b/BaseTools/ImageTool/ImageTool.h index efb0b23a75..bea58c6b1b 100644 --- a/BaseTools/ImageTool/ImageTool.h +++ b/BaseTools/ImageTool/ImageTool.h @@ -140,14 +140,22 @@ ScanElf ( IN const char *SymbolsPath ); +extern CONST UINT8 mHiiResourceSectionHeaderSize; + +VOID +InitializeHiiResouceSectionHeader ( + OUT UINT8 *HiiSectionHeader, + IN UINT32 HiiDataAddress, + IN UINT32 HiiDataSize + ); + RETURN_STATUS ConstructHii ( IN const char *FileNames[], IN UINT32 NumOfFiles, IN GUID *HiiGuid, OUT void **Hii, - OUT UINT32 *HiiSize, - IN BOOLEAN IsElf + OUT UINT32 *HiiSize ); #endif // IMAGE_TOOL_H diff --git a/BaseTools/ImageTool/PeEmit.c b/BaseTools/ImageTool/PeEmit.c index f937cdf002..440d26ea2c 100644 --- a/BaseTools/ImageTool/PeEmit.c +++ b/BaseTools/ImageTool/PeEmit.c @@ -36,6 +36,7 @@ typedef struct { EFI_IMAGE_NT_HEADERS *PeHdr; image_tool_emit_pe_hdr_info_t HdrInfo; uint32_t SectionsSize; + uint32_t HiiSectionAddress; uint32_t ExtraSectionsSize; uint32_t UnsignedFileSize; uint32_t RelocTableSize; @@ -236,14 +237,23 @@ EmitPeGetExtraSectionsSize ( return false; } - Overflow = BaseOverflowAlignUpU32 ( - Context->Image->HiiInfo.DataSize, - Context->FileAlignment, - &AlignedHiiTableSize - ); - if (Overflow) { - raise (); - return false; + AlignedHiiTableSize = 0; + if (Context->Image->HiiInfo.DataSize > 0) { + Overflow = BaseOverflowAddU32 ( + mHiiResourceSectionHeaderSize, + Context->Image->HiiInfo.DataSize, + &AlignedHiiTableSize + ); + + Overflow |= BaseOverflowAlignUpU32 ( + AlignedHiiTableSize, + Context->FileAlignment, + &AlignedHiiTableSize + ); + if (Overflow) { + raise (); + return false; + } } Overflow = BaseOverflowAddU32 ( @@ -348,6 +358,7 @@ ToolImageEmitPeExtraSectionHeaders ( uint32_t SectionHeadersSize; EFI_IMAGE_SECTION_HEADER *Section; uint32_t SectionOffset; + uint32_t HiiSectionSize; assert (Context != NULL); assert (Buffer != NULL); @@ -361,18 +372,22 @@ ToolImageEmitPeExtraSectionHeaders ( assert (sizeof (EFI_IMAGE_SECTION_HEADER) <= *BufferSize); + HiiSectionSize = mHiiResourceSectionHeaderSize + Context->Image->HiiInfo.DataSize; + Section = (void *) *Buffer; strncpy ((char *)Section->Name, ".rsrc", sizeof (Section->Name)); - Section->SizeOfRawData = ALIGN_VALUE (Context->Image->HiiInfo.DataSize, Context->FileAlignment); - Section->VirtualSize = Section->SizeOfRawData; + Section->SizeOfRawData = ALIGN_VALUE (HiiSectionSize, Context->FileAlignment); + Section->VirtualSize = ALIGN_VALUE (HiiSectionSize, Context->Image->SegmentInfo.SegmentAlignment); Section->Characteristics = EFI_IMAGE_SCN_CNT_INITIALIZED_DATA | EFI_IMAGE_SCN_MEM_READ; Section->PointerToRawData = SectionOffset; Section->VirtualAddress = Section->PointerToRawData; + Context->HiiSectionAddress = SectionOffset; + SectionOffset += Section->SizeOfRawData; - Context->PeHdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = Context->Image->HiiInfo.DataSize; + Context->PeHdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].Size = HiiSectionSize; Context->PeHdr->DataDirectory[EFI_IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress = Section->PointerToRawData; *BufferSize -= sizeof (EFI_IMAGE_SECTION_HEADER); @@ -796,7 +811,18 @@ ToolImageEmitPeHiiTable ( return true; } - Context->PeHdr->SizeOfImage += ALIGN_VALUE (Image->HiiInfo.DataSize, Image->SegmentInfo.SegmentAlignment); + Context->PeHdr->SizeOfImage += ALIGN_VALUE (mHiiResourceSectionHeaderSize + Image->HiiInfo.DataSize, Image->SegmentInfo.SegmentAlignment); + + assert (mHiiResourceSectionHeaderSize <= *BufferSize); + + InitializeHiiResouceSectionHeader ( + *Buffer, + Context->HiiSectionAddress, + Context->Image->HiiInfo.DataSize + ); + + *BufferSize -= mHiiResourceSectionHeaderSize; + *Buffer += mHiiResourceSectionHeaderSize; assert (Image->HiiInfo.DataSize <= *BufferSize); @@ -806,7 +832,7 @@ ToolImageEmitPeHiiTable ( *Buffer += Image->HiiInfo.DataSize; HiiTablePadding = ALIGN_VALUE_ADDEND( - Image->HiiInfo.DataSize, + mHiiResourceSectionHeaderSize + Image->HiiInfo.DataSize, Context->FileAlignment ); diff --git a/BaseTools/ImageTool/PeScan.c b/BaseTools/ImageTool/PeScan.c index 9c72e15c77..96d7ee0964 100644 --- a/BaseTools/ImageTool/PeScan.c +++ b/BaseTools/ImageTool/PeScan.c @@ -173,7 +173,6 @@ static bool ScanPeGetSegmentInfo ( OUT image_tool_segment_info_t *SegmentInfo, - OUT image_tool_hii_info_t *HiiInfo, IN PE_COFF_LOADER_IMAGE_CONTEXT *Context ) { @@ -184,7 +183,6 @@ ScanPeGetSegmentInfo ( uint32_t Index; assert (SegmentInfo != NULL); - assert (HiiInfo != NULL); assert (Context != NULL); SegmentInfo->SegmentAlignment = PeCoffGetSectionAlignment (Context); @@ -242,21 +240,6 @@ ScanPeGetSegmentInfo ( ++SegmentInfo->NumSegments; ++ImageSegment; - } else if (memcmp (Section->Name, PE_COFF_SECT_NAME_RESRC, sizeof (Section->Name)) == 0) { - // FIXME: Store only the HII data and construct the RESRC dir in PeEmit.c - HiiInfo->DataSize = MIN (Section->SizeOfRawData, Section->VirtualSize); - - HiiInfo->Data = malloc (HiiInfo->DataSize); - if (HiiInfo->Data == NULL) { - fprintf (stderr, "ImageTool: Could not allocate memory for Hii Data\n"); - return false; - } - - memmove ( - HiiInfo->Data, - ImageBuffer + Section->VirtualAddress, - HiiInfo->DataSize - ); } } @@ -406,7 +389,7 @@ ToolContextConstructPe ( return RETURN_VOLUME_CORRUPTED; } - Result = ScanPeGetSegmentInfo (&Image->SegmentInfo, &Image->HiiInfo, &Context); + Result = ScanPeGetSegmentInfo (&Image->SegmentInfo, &Context); if (!Result) { fprintf (stderr, "ImageTool: Could not retrieve segment info\n"); ToolImageDestruct (Image); @@ -422,6 +405,14 @@ ToolContextConstructPe ( return RETURN_VOLUME_CORRUPTED; } + Result = ScanPeGetHiiInfo (&Image->HiiInfo, &Context); + if (!Result) { + fprintf (stderr, "ImageTool: Could not retrieve HII info\n"); + ToolImageDestruct (Image); + FreeAlignedPages (Destination, DestinationPages); + return RETURN_VOLUME_CORRUPTED; + } + FreeAlignedPages (Destination, DestinationPages); return RETURN_SUCCESS;