diff --git a/BaseTools/BinWrappers/PosixLike/ImageTool b/BaseTools/BinWrappers/PosixLike/ImageTool index b33ed5e41b..7c6a21ce99 100755 --- a/BaseTools/BinWrappers/PosixLike/ImageTool +++ b/BaseTools/BinWrappers/PosixLike/ImageTool @@ -9,31 +9,13 @@ cmd=${full_cmd##*/} if [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/ImageTool" ] then - if [ $1 == 'IA32' ] || [ $1 == 'ARM' ] + if [ ! -e "$EDK_TOOLS_PATH/ImageTool/ImageTool" ] then - if [ ! -e "$EDK_TOOLS_PATH/ImageTool/ImageTool32" ] - then - echo "BaseTools C Tool binary was not found (ImageTool32)" - echo "You may need to run:" - echo " make -C $EDK_TOOLS_PATH/ImageTool" - else - shift - exec "$EDK_TOOLS_PATH/ImageTool/ImageTool32" "$@" - fi - elif [ $1 == 'X64' ] || [ $1 == 'AARCH64' ] - then - if [ ! -e "$EDK_TOOLS_PATH/ImageTool/ImageTool64" ] - then - echo "BaseTools C Tool binary was not found (ImageTool64)" - echo "You may need to run:" - echo " make -C $EDK_TOOLS_PATH/ImageTool" - else - shift - exec "$EDK_TOOLS_PATH/ImageTool/ImageTool64" "$@" - fi + echo "BaseTools C Tool binary was not found (ImageTool)" + echo "You may need to run:" + echo " make -C $EDK_TOOLS_PATH/ImageTool" else - echo "ImageTool for $1 is not supported" - exit 127 + exec "$EDK_TOOLS_PATH/ImageTool/ImageTool" "$@" fi else echo "Unable to find the real '$cmd' to run" diff --git a/BaseTools/BinWrappers/WindowsLike/ImageTool.bat b/BaseTools/BinWrappers/WindowsLike/ImageTool.bat index 61fd050ebe..2092a1f76e 100644 --- a/BaseTools/BinWrappers/WindowsLike/ImageTool.bat +++ b/BaseTools/BinWrappers/WindowsLike/ImageTool.bat @@ -3,28 +3,4 @@ :: SPDX-License-Identifier: BSD-3-Clause :: @echo off -set args=%2 -:start -shift /2 -if "%2"=="" goto done -set args=%args% %2 -goto start - -:done -if "%1%"=="IA32" ( - call ImageTool32.exe %args% - exit - ) -if "%1%"=="ARM" ( - call ImageTool32.exe %args% - exit - ) -if "%1%"=="X64" ( - call ImageTool64.exe %args% - exit -) -if "%1%"=="AARCH64" ( - call ImageTool64.exe %args% - exit -) -echo ImageTool for %1% is not supported +call ImageTool.exe %* diff --git a/BaseTools/Conf/build_rule.template b/BaseTools/Conf/build_rule.template index f4c67c5acf..e116226c67 100755 --- a/BaseTools/Conf/build_rule.template +++ b/BaseTools/Conf/build_rule.template @@ -352,7 +352,7 @@ $(OUTPUT_DIR)(+)$(MODULE_NAME).map - ImageTool $(ARCH) PeXip ${src} ${dst} $(MODULE_TYPE) + ImageTool PeXip ${src} ${dst} $(MODULE_TYPE) $(CP) ${dst} $(DEBUG_DIR) $(CP) ${dst} $(BIN_DIR)(+)$(MODULE_NAME_GUID).efi -$(CP) $(DEBUG_DIR)(+)*.map $(OUTPUT_DIR) @@ -367,7 +367,7 @@ # -$(OBJCOPY) $(OBJCOPY_ADDDEBUGFLAG) ${src} -$(CP) $(DEBUG_DIR)(+)$(MODULE_NAME).debug $(BIN_DIR)(+)$(MODULE_NAME_GUID).debug - ImageTool $(ARCH) ElfToPe ${src} ${dst} $(MODULE_TYPE) + ImageTool ElfToPe ${src} ${dst} $(MODULE_TYPE) $(CP) ${dst} $(DEBUG_DIR) $(CP) ${dst} $(BIN_DIR)(+)$(MODULE_NAME_GUID).efi @@ -378,7 +378,7 @@ "$(MTOC)" -subsystem $(MODULE_TYPE) $(MTOC_FLAGS) ${src} $(DEBUG_DIR)(+)$(MODULE_NAME).pecoff # create symbol file for GDB debug -$(DSYMUTIL) ${src} - ImageTool $(ARCH) PeXip $(DEBUG_DIR)(+)$(MODULE_NAME).pecoff ${dst} $(MODULE_TYPE) + ImageTool PeXip $(DEBUG_DIR)(+)$(MODULE_NAME).pecoff ${dst} $(MODULE_TYPE) $(CP) ${dst} $(DEBUG_DIR) $(CP) ${dst} $(BIN_DIR)(+)$(MODULE_NAME_GUID).efi -$(CP) $(DEBUG_DIR)(+)*.map $(OUTPUT_DIR) @@ -446,12 +446,12 @@ "$(ASLCC)" $(DEPS_FLAGS) /Fo$(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(ASLCC_FLAGS) $(DEPS_FLAGS) $(INC) ${src} "$(ASLDLINK)" /OUT:$(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll $(ASLDLINK_FLAGS) $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj - ImageTool $(ARCH) GetAcpi $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll ${dst} + ImageTool GetAcpi $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll ${dst} "$(ASLCC)" $(DEPS_FLAGS) -c -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(CC_FLAGS) $(ASLCC_FLAGS) $(DEPS_FLAGS) $(INC) ${src} "$(ASLDLINK)" -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll $(ASLDLINK_FLAGS) $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj - ImageTool $(ARCH) GetAcpi $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll ${dst} + ImageTool GetAcpi $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll ${dst} [Acpi-Table-Code-File] @@ -466,23 +466,23 @@ "$(ASLCC)" $(DEPS_FLAGS) /Fo$(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(ASLCC_FLAGS) $(DEPS_FLAGS) $(INC) ${src} "$(ASLDLINK)" /OUT:$(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll $(ASLDLINK_FLAGS) $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj - ImageTool $(ARCH) GetAcpi $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll ${dst} + ImageTool GetAcpi $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll ${dst} "$(ASLCC)" $(DEPS_FLAGS) -c -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(CC_FLAGS) $(ASLCC_FLAGS) $(DEPS_FLAGS) $(INC) ${src} "$(ASLDLINK)" -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll $(ASLDLINK_FLAGS) $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(CC_FLAGS) $(ASLCC_FLAGS) - ImageTool $(ARCH) GetAcpi $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll ${dst} + ImageTool GetAcpi $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll ${dst} "$(ASLCC)" $(DEPS_FLAGS) -c -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(CC_FLAGS) $(ASLCC_FLAGS) $(DEPS_FLAGS) $(INC) ${src} "$(ASLDLINK)" /OUT:$(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll $(ASLDLINK_FLAGS) $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj - ImageTool $(ARCH) GetAcpi $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll ${dst} + ImageTool GetAcpi $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll ${dst} "$(ASLCC)" $(DEPS_FLAGS) -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(ASLCC_FLAGS) $(DEPS_FLAGS) $(INC) ${src} "$(ASLDLINK)" -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll $(ASLDLINK_FLAGS) $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj "$(MTOC)" -subsystem $(MODULE_TYPE) $(MTOC_FLAGS) $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.dll $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.pecoff - ImageTool $(ARCH) GetAcpi $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.pecoff ${dst} + ImageTool GetAcpi $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.pecoff ${dst} [Nasm-to-Binary-Code-File] @@ -614,16 +614,16 @@ $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc - ImageTool $(ARCH) HiiBinPe $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc $(MODULE_GUID) $(HII_BINARY_PACKAGES) + ImageTool HiiBinPe $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc $(MODULE_GUID) $(HII_BINARY_PACKAGES) "$(RC)" /Fo${dst} -- $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc - ImageTool $(ARCH) HiiBinPe $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc $(MODULE_GUID) $(HII_BINARY_PACKAGES) + ImageTool HiiBinPe $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc $(MODULE_GUID) $(HII_BINARY_PACKAGES) "$(RC)" /Fo${dst} $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc - ImageTool $(ARCH) HiiBinElf $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc $(MODULE_GUID) $(HII_BINARY_PACKAGES) + ImageTool HiiBinElf $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc $(MODULE_GUID) $(HII_BINARY_PACKAGES) "$(RC)" $(RC_FLAGS) $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc ${dst} - ImageTool $(ARCH) HiiBinElf $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc $(MODULE_GUID) $(HII_BINARY_PACKAGES) + ImageTool HiiBinElf $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc $(MODULE_GUID) $(HII_BINARY_PACKAGES) diff --git a/BaseTools/ImageTool/ElfScan.c b/BaseTools/ImageTool/ElfScan.c index 533a3a04b5..3bfa46fe80 100644 --- a/BaseTools/ImageTool/ElfScan.c +++ b/BaseTools/ImageTool/ElfScan.c @@ -5,6 +5,48 @@ #include "ImageTool.h" +#include "ElfScanCommon.h" + +#include "../../UefiPayloadPkg/PayloadLoaderPeim/ElfLib/ElfCommon.h" + +#if ELF_ARCH == 32 + +#include "../../UefiPayloadPkg/PayloadLoaderPeim/ElfLib/Elf32.h" + +#define ELFCLASS ELFCLASS32 +#define Elf_Ehdr Elf32_Ehdr +#define Elf_Shdr Elf32_Shdr +#define Elf_Sym Elf32_Sym +#define Elf_Rel Elf32_Rel +#define Elf_Rela Elf32_Rela +#define Elf_Size Elf32_Size +#define Elf_Addr Elf32_Addr +#define ELF_R_TYPE ELF32_R_TYPE +#define ELF_R_SYM ELF32_R_SYM + +#elif ELF_ARCH == 64 + +#include "../../UefiPayloadPkg/PayloadLoaderPeim/ElfLib/Elf64.h" + +#define ELFCLASS ELFCLASS64 +#define Elf_Ehdr Elf64_Ehdr +#define Elf_Shdr Elf64_Shdr +#define Elf_Sym Elf64_Sym +#define Elf_Rel Elf64_Rel +#define Elf_Rela Elf64_Rela +#define Elf_Size Elf64_Size +#define Elf_Addr Elf64_Addr +#define ELF_R_TYPE ELF64_R_TYPE +#define ELF_R_SYM ELF64_R_SYM + +#endif + +#define ELF_SUFFIX__(Name, Arch) Name##Arch +#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; @@ -19,6 +61,8 @@ typedef struct { #define EFI_IMAGE_MACHINE_AARCH64 0xAA64 #endif + +#define GetShrbyIndex ELF_SUFFIX(GetShrbyIndex) static Elf_Shdr * GetShdrByIndex ( @@ -35,6 +79,7 @@ GetShdrByIndex ( return (Elf_Shdr *)((UINT8 *)Ehdr + Offset); } +#define GetString ELF_SUFFIX(GetString) static const char * GetString ( @@ -59,6 +104,7 @@ GetString ( return (const char *)Ehdr + Shdr->sh_offset + Offset; } +#define GetSIsHiiRsrcShdrtring ELF_SUFFIX(IsHiiRsrcShdr) static BOOLEAN IsHiiRsrcShdr ( @@ -73,6 +119,7 @@ IsHiiRsrcShdr ( return strcmp ((const char *)Ehdr + Namedr->sh_offset + Shdr->sh_name, ELF_HII_SECTION_NAME) == 0; } +#define IsShdrLoadable ELF_SUFFIX(IsShdrLoadable) static BOOLEAN IsShdrLoadable ( @@ -85,6 +132,7 @@ IsShdrLoadable ( return (Shdr->sh_flags & SHF_ALLOC) != 0 && !IsHiiRsrcShdr (Ehdr, Shdr); } +#define SetHiiResourceHeader ELF_SUFFIX(SetHiiResourceHeader) static VOID SetHiiResourceHeader ( @@ -148,6 +196,7 @@ SetHiiResourceHeader ( return; } +#define ParseElfFile ELF_SUFFIX(ParseElfFile) static RETURN_STATUS ParseElfFile ( @@ -187,18 +236,6 @@ ParseElfFile ( return RETURN_INCOMPATIBLE_VERSION; } -#if defined(EFI_TARGET64) - if ((Ehdr->e_machine != EM_X86_64) && (Ehdr->e_machine != EM_AARCH64)) { - fprintf (stderr, "ImageTool: Unsupported ELF e_machine\n"); - return RETURN_INCOMPATIBLE_VERSION; - } -#elif defined(EFI_TARGET32) - if ((Ehdr->e_machine != EM_386) && (Ehdr->e_machine != EM_ARM)) { - fprintf (stderr, "ImageTool: Unsupported ELF e_machine\n"); - return RETURN_INCOMPATIBLE_VERSION; - } -#endif - // // Check section headers // @@ -291,6 +328,7 @@ ParseElfFile ( return RETURN_SUCCESS; } +#define ProcessRelocSection ELF_SUFFIX(ProcessRelocSection) static bool ProcessRelocSection ( @@ -329,6 +367,7 @@ ProcessRelocSection ( return TRUE; } +#define SetRelocs ELF_SUFFIX(SetRelocs) static RETURN_STATUS SetRelocs ( @@ -367,7 +406,7 @@ SetRelocs ( // so we don't need to recalculate relocations computed by the linker at all r_offset's. // We only need to transform ELF relocations' format into PE one. // -#if defined(EFI_TARGET64) +#if ELF_ARCH == 64 if (Ehdr->e_machine == EM_X86_64) { switch (ELF_R_TYPE(Rel->r_info)) { case R_X86_64_NONE: @@ -455,7 +494,7 @@ SetRelocs ( return RETURN_INCOMPATIBLE_VERSION; } } -#elif defined(EFI_TARGET32) +#elif ELF_ARCH == 32 if (Ehdr->e_machine == EM_386) { switch (ELF_R_TYPE(Rel->r_info)) { case R_386_NONE: @@ -534,6 +573,7 @@ SetRelocs ( return RETURN_SUCCESS; } +#define CreateIntermediate ELF_SUFFIX(CreateIntermediate) static RETURN_STATUS CreateIntermediate ( @@ -576,7 +616,7 @@ CreateIntermediate ( for (RIndex = 0; RIndex < Shdr->sh_size; RIndex += (UINTN)Shdr->sh_entsize) { Rel = (Elf_Rel *)((UINT8 *)Ehdr + Shdr->sh_offset + RIndex); -#if defined(EFI_TARGET64) +#if ELF_ARCH == 64 if (Ehdr->e_machine == EM_X86_64) { if ((ELF_R_TYPE(Rel->r_info) == R_X86_64_RELATIVE) || (ELF_R_TYPE(Rel->r_info) == R_X86_64_64) @@ -593,7 +633,7 @@ CreateIntermediate ( ++NumRelocs; } } -#elif defined(EFI_TARGET32) +#elif ELF_ARCH == 32 if (Ehdr->e_machine == EM_386) { if (ELF_R_TYPE(Rel->r_info) == R_386_32) { ++NumRelocs; @@ -703,6 +743,7 @@ CreateIntermediate ( return SetRelocs (ImageInfo, Context); } +#define ScanElf ELF_SUFFIX(ScanElf) RETURN_STATUS ScanElf ( OUT image_tool_image_info_t *ImageInfo, @@ -737,14 +778,14 @@ ScanElf ( ImageInfo->DebugInfo.SymbolsPathLen = strlen (SymbolsPath); switch (Ehdr->e_machine) { -#if defined(EFI_TARGET64) +#if ELF_ARCH == 64 case EM_X86_64: ImageInfo->HeaderInfo.Machine = EFI_IMAGE_MACHINE_X64; break; case EM_AARCH64: ImageInfo->HeaderInfo.Machine = EFI_IMAGE_MACHINE_AARCH64; break; -#elif defined(EFI_TARGET32) +#elif ELF_ARCH == 32 case EM_386: ImageInfo->HeaderInfo.Machine = EFI_IMAGE_MACHINE_IA32; break; diff --git a/BaseTools/ImageTool/ElfScan32.c b/BaseTools/ImageTool/ElfScan32.c new file mode 100644 index 0000000000..2e3cef6a25 --- /dev/null +++ b/BaseTools/ImageTool/ElfScan32.c @@ -0,0 +1,7 @@ +/** @file + Copyright (c) 2023, Marvin Häuser. All rights reserved. + SPDX-License-Identifier: BSD-3-Clause +**/ + +#define ELF_ARCH 32 +#include "ElfScan.c" diff --git a/BaseTools/ImageTool/ElfScan64.c b/BaseTools/ImageTool/ElfScan64.c new file mode 100644 index 0000000000..d47685ed34 --- /dev/null +++ b/BaseTools/ImageTool/ElfScan64.c @@ -0,0 +1,7 @@ +/** @file + Copyright (c) 2023, Marvin Häuser. All rights reserved. + SPDX-License-Identifier: BSD-3-Clause +**/ + +#define ELF_ARCH 64 +#include "ElfScan.c" diff --git a/BaseTools/ImageTool/ElfScanCommon.c b/BaseTools/ImageTool/ElfScanCommon.c new file mode 100644 index 0000000000..6bc47782f9 --- /dev/null +++ b/BaseTools/ImageTool/ElfScanCommon.c @@ -0,0 +1,24 @@ +/** @file + Copyright (c) 2023, Marvin Häuser. All rights reserved. + SPDX-License-Identifier: BSD-3-Clause +**/ + +#include "ElfScanCommon.h" + +RETURN_STATUS +ScanElf ( + OUT image_tool_image_info_t *ImageInfo, + IN const void *File, + IN uint32_t FileSize, + IN const char *SymbolsPath + ) +{ + RETURN_STATUS Status; + + Status = ScanElf64 (ImageInfo, File, FileSize, SymbolsPath); + if (Status == RETURN_UNSUPPORTED) { + Status = ScanElf32 (ImageInfo, File, FileSize, SymbolsPath); + } + + return Status; +} diff --git a/BaseTools/ImageTool/ElfScanCommon.h b/BaseTools/ImageTool/ElfScanCommon.h new file mode 100644 index 0000000000..46f7353480 --- /dev/null +++ b/BaseTools/ImageTool/ElfScanCommon.h @@ -0,0 +1,29 @@ +/** @file + Copyright (c) 2023, Marvin Häuser. All rights reserved. + SPDX-License-Identifier: BSD-3-Clause +**/ + +#ifndef ELF_SCAN_COMMON_H +#define ELF_SCAN_COMMON_H + +#include + +#include "ImageTool.h" + +RETURN_STATUS +ScanElf32 ( + OUT image_tool_image_info_t *ImageInfo, + IN const void *File, + IN uint32_t FileSize, + IN const char *SymbolsPath + ); + +RETURN_STATUS +ScanElf64 ( + OUT image_tool_image_info_t *ImageInfo, + IN const void *File, + IN uint32_t FileSize, + IN const char *SymbolsPath + ); + +#endif // ELF_SCAN_COMMON_H diff --git a/BaseTools/ImageTool/GNUmakefile b/BaseTools/ImageTool/GNUmakefile index 4065576144..ce5e8c9c1e 100644 --- a/BaseTools/ImageTool/GNUmakefile +++ b/BaseTools/ImageTool/GNUmakefile @@ -5,29 +5,19 @@ ## PROJECT = ImageTool +PRODUCT = $(PROJECT)$(INFIX)$(SUFFIX) OBJS = $(PROJECT).o -OBJS += Image.o PeEmit.o PeScan.o ElfScan.o BinEmit.o +OBJS += Image.o PeEmit32.o PeEmit64.o PeEmitCommon.o PeScan.o ElfScan32.o ElfScan64.o ElfScanCommon.o BinEmit.o OBJS += UefiImageExtraActionLib.o OBJS += PeCoffInit.o PeCoffInfo.o PeCoffLoad.o PeCoffRelocate.o PeCoffHii.o PeCoffDebug.o +WERROR = 1 DEBUG = 1 SANITIZE = 0 OC_USER = ../../OpenCorePkg UDK_PATH = ../.. -include $(OC_USER)/User/Makefile - -.DEFAULT_GOAL := Tools - -CFLAGS += -Werror - VPATH += ../../MdePkg/Library/BasePeCoffLib2:$\ ../../MdePkg/Library/BaseUefiImageExtraActionLibNull -Tools: Tool32 Tool64 - -Tool32: - $(MAKE) all CFLAGS="$(CFLAGS) -DEFI_TARGET32" PRODUCT=ImageTool32 INFIX=_Tool32 - -Tool64: - $(MAKE) all CFLAGS="$(CFLAGS) -DEFI_TARGET64" PRODUCT=ImageTool64 INFIX=_Tool64 +include $(OC_USER)/User/Makefile diff --git a/BaseTools/ImageTool/ImageTool.c b/BaseTools/ImageTool/ImageTool.c index 520c7a6854..3dfcdc319d 100644 --- a/BaseTools/ImageTool/ImageTool.c +++ b/BaseTools/ImageTool/ImageTool.c @@ -63,7 +63,8 @@ Rebase ( uint32_t PeSize; UINT64 NewBaseAddress; PE_COFF_LOADER_IMAGE_CONTEXT Context; - EFI_IMAGE_NT_HEADERS *PeHdr; + EFI_IMAGE_NT_HEADERS32 *PeHdr32; + EFI_IMAGE_NT_HEADERS64 *PeHdr64; assert (BaseAddress != NULL); assert (OldName != NULL); @@ -74,12 +75,6 @@ Rebase ( fprintf (stderr, "ImageTool: Could not convert ASCII string to UINT64\n"); return Status; } -#ifdef EFI_TARGET32 - if (NewBaseAddress > MAX_UINT32) { - fprintf (stderr, "ImageTool: New Base Address exceeds MAX value\n"); - return RETURN_INVALID_PARAMETER; - } -#endif Pe = UserReadFile (OldName, &PeSize); if (Pe == NULL) { @@ -103,12 +98,15 @@ Rebase ( return Status; } - PeHdr = (EFI_IMAGE_NT_HEADERS *)(void *)((char *)Context.ImageBuffer + Context.ExeHdrOffset); -#ifdef EFI_TARGET32 - PeHdr->ImageBase = (UINT32)NewBaseAddress; -#else - PeHdr->ImageBase = NewBaseAddress; -#endif + if (Context.ImageType == PeCoffLoaderTypePe32) { + PeHdr32 = (EFI_IMAGE_NT_HEADERS32 *)(void *)((char *)Context.ImageBuffer + Context.ExeHdrOffset); + PeHdr32->ImageBase = (UINT32)NewBaseAddress; + } else if (Context.ImageType == PeCoffLoaderTypePe32Plus) { + PeHdr64 = (EFI_IMAGE_NT_HEADERS64 *)(void *)((char *)Context.ImageBuffer + Context.ExeHdrOffset); + PeHdr64->ImageBase = NewBaseAddress; + } else { + assert (false); + } UserWriteFile (NewName, Pe, PeSize); diff --git a/BaseTools/ImageTool/ImageTool.h b/BaseTools/ImageTool/ImageTool.h index 2a4f1cc03f..3dfcbade32 100644 --- a/BaseTools/ImageTool/ImageTool.h +++ b/BaseTools/ImageTool/ImageTool.h @@ -20,47 +20,7 @@ #include #include #include -#include "../../UefiPayloadPkg/PayloadLoaderPeim/ElfLib/ElfCommon.h" -#undef ELF_R_TYPE -#undef ELF_R_SYM - -#ifdef EFI_TARGET32 -#include "../../UefiPayloadPkg/PayloadLoaderPeim/ElfLib/Elf32.h" - -#define EFI_IMAGE_NT_HEADERS EFI_IMAGE_NT_HEADERS32 -#define EFI_IMAGE_NT_OPTIONAL_HDR_MAGIC EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC -#define EFI_IMAGE_FILE_MACHINE EFI_IMAGE_FILE_32BIT_MACHINE -#define ELFCLASS ELFCLASS32 -#define Elf_Ehdr Elf32_Ehdr -#define Elf_Shdr Elf32_Shdr -#define Elf_Sym Elf32_Sym -#define Elf_Rel Elf32_Rel -#define Elf_Rela Elf32_Rela -#define Elf_Size Elf32_Size -#define Elf_Addr Elf32_Addr -#define ELF_R_TYPE ELF32_R_TYPE -#define ELF_R_SYM ELF32_R_SYM - -#elif defined(EFI_TARGET64) -#include "../../UefiPayloadPkg/PayloadLoaderPeim/ElfLib/Elf64.h" - -#define EFI_IMAGE_NT_HEADERS EFI_IMAGE_NT_HEADERS64 -#define EFI_IMAGE_NT_OPTIONAL_HDR_MAGIC EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC -#define EFI_IMAGE_FILE_MACHINE 0 -#define ELFCLASS ELFCLASS64 -#define Elf_Ehdr Elf64_Ehdr -#define Elf_Shdr Elf64_Shdr -#define Elf_Sym Elf64_Sym -#define Elf_Rel Elf64_Rel -#define Elf_Rela Elf64_Rela -#define Elf_Size Elf64_Size -#define Elf_Addr Elf64_Addr -#define ELF_R_TYPE ELF64_R_TYPE -#define ELF_R_SYM ELF64_R_SYM -#endif - -#define ELF_HII_SECTION_NAME ".hii" #define MAX_PE_ALIGNMENT 0x10000 #define raise() assert(false) diff --git a/BaseTools/ImageTool/Makefile b/BaseTools/ImageTool/Makefile index fd48e5df94..cadf57d9c9 100644 --- a/BaseTools/ImageTool/Makefile +++ b/BaseTools/ImageTool/Makefile @@ -13,13 +13,13 @@ APP = ImageTool OC_USER = ..\..\OpenCorePkg UDK_PATH = $(EDK2_PATH) UDK_ARCH = $(HOST_ARCH) -OUT_DIR = .\Windows_$(INFIX) +OUT_DIR = .\Windows OV = $(UDK_PATH)\MdePkg\Library\BaseOverflowLib PE = $(UDK_PATH)\MdePkg\Library\BasePeCoffLib2 UA = $(UDK_PATH)\MdePkg\Library\BaseUefiImageExtraActionLibNull -OBJECTS = ImageTool.obj Image.obj PeEmit.obj PeScan.obj ElfScan.obj BinEmit.obj +OBJECTS = ImageTool.obj Image.obj PeEmit32.obj PeEmit64.obj PeEmitCommon.obj PeScan.obj ElfScan32.obj ElfScan64.obj ElfScanCommon.obj BinEmit.obj OBJECTS = $(OBJECTS) {$(OV)}BaseAlignment.obj BaseBitOverflow.obj {$(UA)}UefiImageExtraActionLib.obj OBJECTS = $(OBJECTS) {$(PE)}PeCoffInit.obj PeCoffInfo.obj PeCoffRelocate.obj PeCoffLoad.obj PeCoffHii.obj PeCoffDebug.obj @@ -41,12 +41,10 @@ INC = $(INC) -I $(UDK_PATH)\MdePkg\Library\BaseLib -I $(UDK_PATH)\MdeModulePkg\I INC = $(INC) /FI $(OC_USER)\User\Include\UserPcd.h /FI $(UDK_PATH)\MdePkg\Include\Base.h /FI $(OC_USER)\User\Include\UserGlobalVar.h all: - -if not exist $(OUT_DIR)64 mkdir $(OUT_DIR)64 - $(MAKE) $(APP)64 CFLAGS="$(CFLAGS) /D EFI_TARGET64" INFIX=64 - -if not exist $(OUT_DIR)32 mkdir $(OUT_DIR)32 - $(MAKE) $(APP)32 CFLAGS="$(CFLAGS) /D EFI_TARGET32" INFIX=32 + -if not exist $(OUT_DIR) mkdir $(OUT_DIR) + $(MAKE) $(APP) -$(APP)$(INFIX) : $(OBJECTS) +$(APP) : $(OBJECTS) -@if not exist $(BIN_PATH) mkdir $(BIN_PATH) @cd $(OUT_DIR) $(LD) /nologo /debug /OPT:REF /OPT:ICF=10 /incremental:no /nodefaultlib:libc.lib /out:..\$@ $(LIBS) $** @@ -56,10 +54,10 @@ $(APP)$(INFIX) : $(OBJECTS) .PHONY:cleanall clean: - del /f /q $(OUT_DIR)32 $(OUT_DIR)64 $(APP)32 $(APP)64 *.pdb > nul + del /f /q $(OUT_DIR) $(APP) *.pdb > nul cleanall: - del /f /q $(OUT_DIR)32 $(OUT_DIR)64 *.pdb $(BIN_PATH)\$(APP)64.exe $(BIN_PATH)\$(APP)32.exe > nul + del /f /q $(OUT_DIR) *.pdb $(BIN_PATH)\$(APP).exe > nul .c.obj : $(CC) -c $(CFLAGS) $(INC) $< -Fo$@ diff --git a/BaseTools/ImageTool/PeEmit.c b/BaseTools/ImageTool/PeEmit.c index 15bf8b8110..e3a3747367 100644 --- a/BaseTools/ImageTool/PeEmit.c +++ b/BaseTools/ImageTool/PeEmit.c @@ -6,6 +6,22 @@ #include "ImageTool.h" +#if PE_ARCH == 32 + +#define EFI_IMAGE_NT_HEADERS EFI_IMAGE_NT_HEADERS32 +#define EFI_IMAGE_NT_OPTIONAL_HDR_MAGIC EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC + +#elif PE_ARCH == 64 + +#define EFI_IMAGE_NT_HEADERS EFI_IMAGE_NT_HEADERS64 +#define EFI_IMAGE_NT_OPTIONAL_HDR_MAGIC EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC + +#endif + +#define PE_SUFFIX__(Name, Arch) Name##Arch +#define PE_SUFFIX_(Name, Arch) PE_SUFFIX__ (Name, Arch) +#define PE_SUFFIX(Name) PE_SUFFIX_ (Name, PE_ARCH) + typedef struct { uint8_t NumExtraSections; uint32_t SizeOfHeaders; @@ -27,6 +43,7 @@ typedef struct { uint32_t FileAlignment; } image_tool_pe_emit_context_t; +#define EmitPeGetHeaderSizes PE_SUFFIX (EmitPeGetHeaderSizes) static bool EmitPeGetHeaderSizes ( @@ -60,6 +77,7 @@ EmitPeGetHeaderSizes ( return true; } +#define EmitPeGetSectionsSize PE_SUFFIX (EmitPeGetSectionsSize) static bool EmitPeGetSectionsSize ( @@ -99,6 +117,7 @@ EmitPeGetSectionsSize ( return true; } +#define EmitPeGetRelocSectionSize PE_SUFFIX (EmitPeGetRelocSectionSize) static bool EmitPeGetRelocSectionSize ( @@ -148,6 +167,7 @@ EmitPeGetRelocSectionSize ( return true; } +#define EmitPeGetDebugSectionSize PE_SUFFIX (EmitPeGetDebugSectionSize) static void EmitPeGetDebugSectionSize ( @@ -168,6 +188,7 @@ EmitPeGetDebugSectionSize ( *DebugSize = Size; } +#define EmitPeGetExtraSectionsSize PE_SUFFIX (EmitPeGetExtraSectionsSize) static bool EmitPeGetExtraSectionsSize ( @@ -248,6 +269,7 @@ EmitPeGetExtraSectionsSize ( return true; } +#define ToolImageEmitPeSectionHeaders PE_SUFFIX (ToolImageEmitPeSectionHeaders) static bool ToolImageEmitPeSectionHeaders ( @@ -313,6 +335,7 @@ ToolImageEmitPeSectionHeaders ( return true; } +#define ToolImageEmitPeExtraSectionHeaders PE_SUFFIX (ToolImageEmitPeExtraSectionHeaders) static bool ToolImageEmitPeExtraSectionHeaders ( @@ -412,6 +435,7 @@ ToolImageEmitPeExtraSectionHeaders ( return true; } +#define ToolImageEmitPeHeaders PE_SUFFIX (ToolImageEmitPeHeaders) static bool ToolImageEmitPeHeaders ( @@ -498,6 +522,7 @@ ToolImageEmitPeHeaders ( return true; } +#define ToolImageEmitPeSections PE_SUFFIX (ToolImageEmitPeSections) static bool ToolImageEmitPeSections ( @@ -513,7 +538,7 @@ ToolImageEmitPeSections ( uint32_t SectionPadding; bool FirstCode; -#if defined(EFI_TARGET32) +#if PE_ARCH == 32 bool FirstData; #endif @@ -527,7 +552,7 @@ ToolImageEmitPeSections ( SectionsSize = 0; FirstCode = true; -#if defined(EFI_TARGET32) +#if PE_ARCH == 32 FirstData = true; #endif @@ -542,7 +567,7 @@ ToolImageEmitPeSections ( FirstCode = false; } } -#if defined(EFI_TARGET32) +#if PE_ARCH == 32 else { if (FirstData) { Context->PeHdr->BaseOfData = (UINT32)Segment->ImageAddress; @@ -574,7 +599,7 @@ ToolImageEmitPeSections ( Context->PeHdr->BaseOfCode = MIN(Context->PeHdr->BaseOfCode, (UINT32)Segment->ImageAddress); Context->PeHdr->SizeOfCode += Segment->ImageSize; } else { -#if defined(EFI_TARGET32) +#if PE_ARCH == 32 Context->PeHdr->BaseOfData = MIN(Context->PeHdr->BaseOfData, (UINT32)Segment->ImageAddress); #endif Context->PeHdr->SizeOfInitializedData += Segment->ImageSize; @@ -586,6 +611,7 @@ ToolImageEmitPeSections ( return true; } +#define ToolImageEmitPeRelocTable PE_SUFFIX (ToolImageEmitPeRelocTable) static bool ToolImageEmitPeRelocTable ( @@ -692,6 +718,7 @@ STATIC_ASSERT( "Flexible array aliases padding." ); +#define ToolImageEmitPeDebugTable PE_SUFFIX (ToolImageEmitPeDebugTable) static bool ToolImageEmitPeDebugTable ( @@ -747,6 +774,7 @@ ToolImageEmitPeDebugTable ( return true; } +#define ToolImageEmitPeHiiTable PE_SUFFIX (ToolImageEmitPeHiiTable) static bool ToolImageEmitPeHiiTable ( @@ -790,6 +818,7 @@ ToolImageEmitPeHiiTable ( return true; } +#define ToolImageEmitPeExtraSections PE_SUFFIX (ToolImageEmitPeExtraSections) static bool ToolImageEmitPeExtraSections ( @@ -827,6 +856,7 @@ ToolImageEmitPeExtraSections ( return true; } +#define ToolImageEmitPe PE_SUFFIX (ToolImageEmitPe) void * ToolImageEmitPe ( const image_tool_image_info_t *Image, diff --git a/BaseTools/ImageTool/PeEmit32.c b/BaseTools/ImageTool/PeEmit32.c new file mode 100644 index 0000000000..7b33248b23 --- /dev/null +++ b/BaseTools/ImageTool/PeEmit32.c @@ -0,0 +1,7 @@ +/** @file + Copyright (c) 2023, Marvin Häuser. All rights reserved. + SPDX-License-Identifier: BSD-3-Clause +**/ + +#define PE_ARCH 32 +#include "PeEmit.c" diff --git a/BaseTools/ImageTool/PeEmit64.c b/BaseTools/ImageTool/PeEmit64.c new file mode 100644 index 0000000000..859ed0fe5a --- /dev/null +++ b/BaseTools/ImageTool/PeEmit64.c @@ -0,0 +1,7 @@ +/** @file + Copyright (c) 2023, Marvin Häuser. All rights reserved. + SPDX-License-Identifier: BSD-3-Clause +**/ + +#define PE_ARCH 64 +#include "PeEmit.c" diff --git a/BaseTools/ImageTool/PeEmitCommon.c b/BaseTools/ImageTool/PeEmitCommon.c new file mode 100644 index 0000000000..762272c046 --- /dev/null +++ b/BaseTools/ImageTool/PeEmitCommon.c @@ -0,0 +1,34 @@ +/** @file + Copyright (c) 2023, Marvin Häuser. All rights reserved. + SPDX-License-Identifier: BSD-3-Clause +**/ + +#include "PeEmitCommon.h" + +void * +ToolImageEmitPe ( + const image_tool_image_info_t *Image, + uint32_t *FileSize + ) +{ + switch (Image->HeaderInfo.Machine) { + case IMAGE_FILE_MACHINE_I386: + case IMAGE_FILE_MACHINE_ARMTHUMB_MIXED: + { + return ToolImageEmitPe32 (Image, FileSize); + } + + case IMAGE_FILE_MACHINE_X64: + case IMAGE_FILE_MACHINE_ARM64: + { + return ToolImageEmitPe64 (Image, FileSize); + } + + default: + { + assert (false); + } + } + + return NULL; +} \ No newline at end of file diff --git a/BaseTools/ImageTool/PeEmitCommon.h b/BaseTools/ImageTool/PeEmitCommon.h new file mode 100644 index 0000000000..6b7d564e80 --- /dev/null +++ b/BaseTools/ImageTool/PeEmitCommon.h @@ -0,0 +1,25 @@ +/** @file + Copyright (c) 2023, Marvin Häuser. All rights reserved. + SPDX-License-Identifier: BSD-3-Clause +**/ + +#ifndef PE_EMIT_COMMON_H +#define PE_EMIT_COMMON_H + +#include + +#include "ImageTool.h" + +void * +ToolImageEmitPe32 ( + const image_tool_image_info_t *Image, + uint32_t *FileSize + ); + +void * +ToolImageEmitPe64 ( + const image_tool_image_info_t *Image, + uint32_t *FileSize + ); + +#endif // PE_EMIT_COMMON_H