ImageTool: Unify 32-bit and 64-bit tool variants

This commit is contained in:
Marvin Häuser 2023-04-16 16:33:16 +02:00 committed by Mikhail Krichanov
parent 270a038c4d
commit 141a48425c
17 changed files with 274 additions and 159 deletions

View File

@ -9,31 +9,13 @@ cmd=${full_cmd##*/}
if [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/ImageTool" ] if [ -n "$WORKSPACE" ] && [ -e "$EDK_TOOLS_PATH/ImageTool" ]
then then
if [ $1 == 'IA32' ] || [ $1 == 'ARM' ] if [ ! -e "$EDK_TOOLS_PATH/ImageTool/ImageTool" ]
then then
if [ ! -e "$EDK_TOOLS_PATH/ImageTool/ImageTool32" ] echo "BaseTools C Tool binary was not found (ImageTool)"
then echo "You may need to run:"
echo "BaseTools C Tool binary was not found (ImageTool32)" echo " make -C $EDK_TOOLS_PATH/ImageTool"
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
else else
echo "ImageTool for $1 is not supported" exec "$EDK_TOOLS_PATH/ImageTool/ImageTool" "$@"
exit 127
fi fi
else else
echo "Unable to find the real '$cmd' to run" echo "Unable to find the real '$cmd' to run"

View File

@ -3,28 +3,4 @@
:: SPDX-License-Identifier: BSD-3-Clause :: SPDX-License-Identifier: BSD-3-Clause
:: ::
@echo off @echo off
set args=%2 call ImageTool.exe %*
: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

View File

@ -352,7 +352,7 @@
$(OUTPUT_DIR)(+)$(MODULE_NAME).map $(OUTPUT_DIR)(+)$(MODULE_NAME).map
<Command.MSFT, Command.INTEL, Command.CLANGPDB> <Command.MSFT, Command.INTEL, Command.CLANGPDB>
ImageTool $(ARCH) PeXip ${src} ${dst} $(MODULE_TYPE) ImageTool PeXip ${src} ${dst} $(MODULE_TYPE)
$(CP) ${dst} $(DEBUG_DIR) $(CP) ${dst} $(DEBUG_DIR)
$(CP) ${dst} $(BIN_DIR)(+)$(MODULE_NAME_GUID).efi $(CP) ${dst} $(BIN_DIR)(+)$(MODULE_NAME_GUID).efi
-$(CP) $(DEBUG_DIR)(+)*.map $(OUTPUT_DIR) -$(CP) $(DEBUG_DIR)(+)*.map $(OUTPUT_DIR)
@ -367,7 +367,7 @@
# #
-$(OBJCOPY) $(OBJCOPY_ADDDEBUGFLAG) ${src} -$(OBJCOPY) $(OBJCOPY_ADDDEBUGFLAG) ${src}
-$(CP) $(DEBUG_DIR)(+)$(MODULE_NAME).debug $(BIN_DIR)(+)$(MODULE_NAME_GUID).debug -$(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} $(DEBUG_DIR)
$(CP) ${dst} $(BIN_DIR)(+)$(MODULE_NAME_GUID).efi $(CP) ${dst} $(BIN_DIR)(+)$(MODULE_NAME_GUID).efi
@ -378,7 +378,7 @@
"$(MTOC)" -subsystem $(MODULE_TYPE) $(MTOC_FLAGS) ${src} $(DEBUG_DIR)(+)$(MODULE_NAME).pecoff "$(MTOC)" -subsystem $(MODULE_TYPE) $(MTOC_FLAGS) ${src} $(DEBUG_DIR)(+)$(MODULE_NAME).pecoff
# create symbol file for GDB debug # create symbol file for GDB debug
-$(DSYMUTIL) ${src} -$(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} $(DEBUG_DIR)
$(CP) ${dst} $(BIN_DIR)(+)$(MODULE_NAME_GUID).efi $(CP) ${dst} $(BIN_DIR)(+)$(MODULE_NAME_GUID).efi
-$(CP) $(DEBUG_DIR)(+)*.map $(OUTPUT_DIR) -$(CP) $(DEBUG_DIR)(+)*.map $(OUTPUT_DIR)
@ -446,12 +446,12 @@
<Command.MSFT, Command.INTEL> <Command.MSFT, Command.INTEL>
"$(ASLCC)" $(DEPS_FLAGS) /Fo$(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(ASLCC_FLAGS) $(DEPS_FLAGS) $(INC) ${src} "$(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 "$(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}
<Command.GCC> <Command.GCC>
"$(ASLCC)" $(DEPS_FLAGS) -c -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(CC_FLAGS) $(ASLCC_FLAGS) $(DEPS_FLAGS) $(INC) ${src} "$(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 "$(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] [Acpi-Table-Code-File]
<InputFile> <InputFile>
@ -466,23 +466,23 @@
<Command.MSFT, Command.INTEL> <Command.MSFT, Command.INTEL>
"$(ASLCC)" $(DEPS_FLAGS) /Fo$(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(ASLCC_FLAGS) $(DEPS_FLAGS) $(INC) ${src} "$(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 "$(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}
<Command.GCC> <Command.GCC>
"$(ASLCC)" $(DEPS_FLAGS) -c -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(CC_FLAGS) $(ASLCC_FLAGS) $(DEPS_FLAGS) $(INC) ${src} "$(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) "$(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}
<Command.CLANGPDB> <Command.CLANGPDB>
"$(ASLCC)" $(DEPS_FLAGS) -c -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(CC_FLAGS) $(ASLCC_FLAGS) $(DEPS_FLAGS) $(INC) ${src} "$(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 "$(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}
<Command.XCODE> <Command.XCODE>
"$(ASLCC)" $(DEPS_FLAGS) -o $(OUTPUT_DIR)(+)${s_dir}(+)${s_base}.obj $(ASLCC_FLAGS) $(DEPS_FLAGS) $(INC) ${src} "$(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 "$(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 "$(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] [Nasm-to-Binary-Code-File]
@ -614,16 +614,16 @@
$(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc
<Command.CLANGPDB> <Command.CLANGPDB>
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 "$(RC)" /Fo${dst} -- $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc
<Command.MSFT, Command.INTEL> <Command.MSFT, Command.INTEL>
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 "$(RC)" /Fo${dst} $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc
<Command.GCC, Command.CLANGGCC> <Command.GCC, Command.CLANGGCC>
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} "$(RC)" $(RC_FLAGS) $(OUTPUT_DIR)(+)$(MODULE_NAME)hii.rc ${dst}
<Command.XCODE> <Command.XCODE>
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)

View File

@ -5,6 +5,48 @@
#include "ImageTool.h" #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 { typedef struct {
const Elf_Ehdr *Ehdr; const Elf_Ehdr *Ehdr;
uint32_t Alignment; uint32_t Alignment;
@ -19,6 +61,8 @@ typedef struct {
#define EFI_IMAGE_MACHINE_AARCH64 0xAA64 #define EFI_IMAGE_MACHINE_AARCH64 0xAA64
#endif #endif
#define GetShrbyIndex ELF_SUFFIX(GetShrbyIndex)
static static
Elf_Shdr * Elf_Shdr *
GetShdrByIndex ( GetShdrByIndex (
@ -35,6 +79,7 @@ GetShdrByIndex (
return (Elf_Shdr *)((UINT8 *)Ehdr + Offset); return (Elf_Shdr *)((UINT8 *)Ehdr + Offset);
} }
#define GetString ELF_SUFFIX(GetString)
static static
const char * const char *
GetString ( GetString (
@ -59,6 +104,7 @@ GetString (
return (const char *)Ehdr + Shdr->sh_offset + Offset; return (const char *)Ehdr + Shdr->sh_offset + Offset;
} }
#define GetSIsHiiRsrcShdrtring ELF_SUFFIX(IsHiiRsrcShdr)
static static
BOOLEAN BOOLEAN
IsHiiRsrcShdr ( IsHiiRsrcShdr (
@ -73,6 +119,7 @@ IsHiiRsrcShdr (
return strcmp ((const char *)Ehdr + Namedr->sh_offset + Shdr->sh_name, ELF_HII_SECTION_NAME) == 0; return strcmp ((const char *)Ehdr + Namedr->sh_offset + Shdr->sh_name, ELF_HII_SECTION_NAME) == 0;
} }
#define IsShdrLoadable ELF_SUFFIX(IsShdrLoadable)
static static
BOOLEAN BOOLEAN
IsShdrLoadable ( IsShdrLoadable (
@ -85,6 +132,7 @@ IsShdrLoadable (
return (Shdr->sh_flags & SHF_ALLOC) != 0 && !IsHiiRsrcShdr (Ehdr, Shdr); return (Shdr->sh_flags & SHF_ALLOC) != 0 && !IsHiiRsrcShdr (Ehdr, Shdr);
} }
#define SetHiiResourceHeader ELF_SUFFIX(SetHiiResourceHeader)
static static
VOID VOID
SetHiiResourceHeader ( SetHiiResourceHeader (
@ -148,6 +196,7 @@ SetHiiResourceHeader (
return; return;
} }
#define ParseElfFile ELF_SUFFIX(ParseElfFile)
static static
RETURN_STATUS RETURN_STATUS
ParseElfFile ( ParseElfFile (
@ -187,18 +236,6 @@ ParseElfFile (
return RETURN_INCOMPATIBLE_VERSION; 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 // Check section headers
// //
@ -291,6 +328,7 @@ ParseElfFile (
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }
#define ProcessRelocSection ELF_SUFFIX(ProcessRelocSection)
static static
bool bool
ProcessRelocSection ( ProcessRelocSection (
@ -329,6 +367,7 @@ ProcessRelocSection (
return TRUE; return TRUE;
} }
#define SetRelocs ELF_SUFFIX(SetRelocs)
static static
RETURN_STATUS RETURN_STATUS
SetRelocs ( SetRelocs (
@ -367,7 +406,7 @@ SetRelocs (
// so we don't need to recalculate relocations computed by the linker at all r_offset's. // 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. // 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) { if (Ehdr->e_machine == EM_X86_64) {
switch (ELF_R_TYPE(Rel->r_info)) { switch (ELF_R_TYPE(Rel->r_info)) {
case R_X86_64_NONE: case R_X86_64_NONE:
@ -455,7 +494,7 @@ SetRelocs (
return RETURN_INCOMPATIBLE_VERSION; return RETURN_INCOMPATIBLE_VERSION;
} }
} }
#elif defined(EFI_TARGET32) #elif ELF_ARCH == 32
if (Ehdr->e_machine == EM_386) { if (Ehdr->e_machine == EM_386) {
switch (ELF_R_TYPE(Rel->r_info)) { switch (ELF_R_TYPE(Rel->r_info)) {
case R_386_NONE: case R_386_NONE:
@ -534,6 +573,7 @@ SetRelocs (
return RETURN_SUCCESS; return RETURN_SUCCESS;
} }
#define CreateIntermediate ELF_SUFFIX(CreateIntermediate)
static static
RETURN_STATUS RETURN_STATUS
CreateIntermediate ( CreateIntermediate (
@ -576,7 +616,7 @@ CreateIntermediate (
for (RIndex = 0; RIndex < Shdr->sh_size; RIndex += (UINTN)Shdr->sh_entsize) { for (RIndex = 0; RIndex < Shdr->sh_size; RIndex += (UINTN)Shdr->sh_entsize) {
Rel = (Elf_Rel *)((UINT8 *)Ehdr + Shdr->sh_offset + RIndex); 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 (Ehdr->e_machine == EM_X86_64) {
if ((ELF_R_TYPE(Rel->r_info) == R_X86_64_RELATIVE) if ((ELF_R_TYPE(Rel->r_info) == R_X86_64_RELATIVE)
|| (ELF_R_TYPE(Rel->r_info) == R_X86_64_64) || (ELF_R_TYPE(Rel->r_info) == R_X86_64_64)
@ -593,7 +633,7 @@ CreateIntermediate (
++NumRelocs; ++NumRelocs;
} }
} }
#elif defined(EFI_TARGET32) #elif ELF_ARCH == 32
if (Ehdr->e_machine == EM_386) { if (Ehdr->e_machine == EM_386) {
if (ELF_R_TYPE(Rel->r_info) == R_386_32) { if (ELF_R_TYPE(Rel->r_info) == R_386_32) {
++NumRelocs; ++NumRelocs;
@ -703,6 +743,7 @@ CreateIntermediate (
return SetRelocs (ImageInfo, Context); return SetRelocs (ImageInfo, Context);
} }
#define ScanElf ELF_SUFFIX(ScanElf)
RETURN_STATUS RETURN_STATUS
ScanElf ( ScanElf (
OUT image_tool_image_info_t *ImageInfo, OUT image_tool_image_info_t *ImageInfo,
@ -737,14 +778,14 @@ ScanElf (
ImageInfo->DebugInfo.SymbolsPathLen = strlen (SymbolsPath); ImageInfo->DebugInfo.SymbolsPathLen = strlen (SymbolsPath);
switch (Ehdr->e_machine) { switch (Ehdr->e_machine) {
#if defined(EFI_TARGET64) #if ELF_ARCH == 64
case EM_X86_64: case EM_X86_64:
ImageInfo->HeaderInfo.Machine = EFI_IMAGE_MACHINE_X64; ImageInfo->HeaderInfo.Machine = EFI_IMAGE_MACHINE_X64;
break; break;
case EM_AARCH64: case EM_AARCH64:
ImageInfo->HeaderInfo.Machine = EFI_IMAGE_MACHINE_AARCH64; ImageInfo->HeaderInfo.Machine = EFI_IMAGE_MACHINE_AARCH64;
break; break;
#elif defined(EFI_TARGET32) #elif ELF_ARCH == 32
case EM_386: case EM_386:
ImageInfo->HeaderInfo.Machine = EFI_IMAGE_MACHINE_IA32; ImageInfo->HeaderInfo.Machine = EFI_IMAGE_MACHINE_IA32;
break; break;

View File

@ -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"

View File

@ -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"

View File

@ -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;
}

View File

@ -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 <stdint.h>
#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

View File

@ -5,29 +5,19 @@
## ##
PROJECT = ImageTool PROJECT = ImageTool
PRODUCT = $(PROJECT)$(INFIX)$(SUFFIX)
OBJS = $(PROJECT).o 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 += UefiImageExtraActionLib.o
OBJS += PeCoffInit.o PeCoffInfo.o PeCoffLoad.o PeCoffRelocate.o PeCoffHii.o PeCoffDebug.o OBJS += PeCoffInit.o PeCoffInfo.o PeCoffLoad.o PeCoffRelocate.o PeCoffHii.o PeCoffDebug.o
WERROR = 1
DEBUG = 1 DEBUG = 1
SANITIZE = 0 SANITIZE = 0
OC_USER = ../../OpenCorePkg OC_USER = ../../OpenCorePkg
UDK_PATH = ../.. UDK_PATH = ../..
include $(OC_USER)/User/Makefile
.DEFAULT_GOAL := Tools
CFLAGS += -Werror
VPATH += ../../MdePkg/Library/BasePeCoffLib2:$\ VPATH += ../../MdePkg/Library/BasePeCoffLib2:$\
../../MdePkg/Library/BaseUefiImageExtraActionLibNull ../../MdePkg/Library/BaseUefiImageExtraActionLibNull
Tools: Tool32 Tool64 include $(OC_USER)/User/Makefile
Tool32:
$(MAKE) all CFLAGS="$(CFLAGS) -DEFI_TARGET32" PRODUCT=ImageTool32 INFIX=_Tool32
Tool64:
$(MAKE) all CFLAGS="$(CFLAGS) -DEFI_TARGET64" PRODUCT=ImageTool64 INFIX=_Tool64

View File

@ -63,7 +63,8 @@ Rebase (
uint32_t PeSize; uint32_t PeSize;
UINT64 NewBaseAddress; UINT64 NewBaseAddress;
PE_COFF_LOADER_IMAGE_CONTEXT Context; 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 (BaseAddress != NULL);
assert (OldName != NULL); assert (OldName != NULL);
@ -74,12 +75,6 @@ Rebase (
fprintf (stderr, "ImageTool: Could not convert ASCII string to UINT64\n"); fprintf (stderr, "ImageTool: Could not convert ASCII string to UINT64\n");
return Status; 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); Pe = UserReadFile (OldName, &PeSize);
if (Pe == NULL) { if (Pe == NULL) {
@ -103,12 +98,15 @@ Rebase (
return Status; return Status;
} }
PeHdr = (EFI_IMAGE_NT_HEADERS *)(void *)((char *)Context.ImageBuffer + Context.ExeHdrOffset); if (Context.ImageType == PeCoffLoaderTypePe32) {
#ifdef EFI_TARGET32 PeHdr32 = (EFI_IMAGE_NT_HEADERS32 *)(void *)((char *)Context.ImageBuffer + Context.ExeHdrOffset);
PeHdr->ImageBase = (UINT32)NewBaseAddress; PeHdr32->ImageBase = (UINT32)NewBaseAddress;
#else } else if (Context.ImageType == PeCoffLoaderTypePe32Plus) {
PeHdr->ImageBase = NewBaseAddress; PeHdr64 = (EFI_IMAGE_NT_HEADERS64 *)(void *)((char *)Context.ImageBuffer + Context.ExeHdrOffset);
#endif PeHdr64->ImageBase = NewBaseAddress;
} else {
assert (false);
}
UserWriteFile (NewName, Pe, PeSize); UserWriteFile (NewName, Pe, PeSize);

View File

@ -20,47 +20,7 @@
#include <Library/BaseOverflowLib.h> #include <Library/BaseOverflowLib.h>
#include <Library/MemoryAllocationLib.h> #include <Library/MemoryAllocationLib.h>
#include <UserFile.h> #include <UserFile.h>
#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 MAX_PE_ALIGNMENT 0x10000
#define raise() assert(false) #define raise() assert(false)

View File

@ -13,13 +13,13 @@ APP = ImageTool
OC_USER = ..\..\OpenCorePkg OC_USER = ..\..\OpenCorePkg
UDK_PATH = $(EDK2_PATH) UDK_PATH = $(EDK2_PATH)
UDK_ARCH = $(HOST_ARCH) UDK_ARCH = $(HOST_ARCH)
OUT_DIR = .\Windows_$(INFIX) OUT_DIR = .\Windows
OV = $(UDK_PATH)\MdePkg\Library\BaseOverflowLib OV = $(UDK_PATH)\MdePkg\Library\BaseOverflowLib
PE = $(UDK_PATH)\MdePkg\Library\BasePeCoffLib2 PE = $(UDK_PATH)\MdePkg\Library\BasePeCoffLib2
UA = $(UDK_PATH)\MdePkg\Library\BaseUefiImageExtraActionLibNull 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) {$(OV)}BaseAlignment.obj BaseBitOverflow.obj {$(UA)}UefiImageExtraActionLib.obj
OBJECTS = $(OBJECTS) {$(PE)}PeCoffInit.obj PeCoffInfo.obj PeCoffRelocate.obj PeCoffLoad.obj PeCoffHii.obj PeCoffDebug.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 INC = $(INC) /FI $(OC_USER)\User\Include\UserPcd.h /FI $(UDK_PATH)\MdePkg\Include\Base.h /FI $(OC_USER)\User\Include\UserGlobalVar.h
all: all:
-if not exist $(OUT_DIR)64 mkdir $(OUT_DIR)64 -if not exist $(OUT_DIR) mkdir $(OUT_DIR)
$(MAKE) $(APP)64 CFLAGS="$(CFLAGS) /D EFI_TARGET64" INFIX=64 $(MAKE) $(APP)
-if not exist $(OUT_DIR)32 mkdir $(OUT_DIR)32
$(MAKE) $(APP)32 CFLAGS="$(CFLAGS) /D EFI_TARGET32" INFIX=32
$(APP)$(INFIX) : $(OBJECTS) $(APP) : $(OBJECTS)
-@if not exist $(BIN_PATH) mkdir $(BIN_PATH) -@if not exist $(BIN_PATH) mkdir $(BIN_PATH)
@cd $(OUT_DIR) @cd $(OUT_DIR)
$(LD) /nologo /debug /OPT:REF /OPT:ICF=10 /incremental:no /nodefaultlib:libc.lib /out:..\$@ $(LIBS) $** $(LD) /nologo /debug /OPT:REF /OPT:ICF=10 /incremental:no /nodefaultlib:libc.lib /out:..\$@ $(LIBS) $**
@ -56,10 +54,10 @@ $(APP)$(INFIX) : $(OBJECTS)
.PHONY:cleanall .PHONY:cleanall
clean: 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: 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 : .c.obj :
$(CC) -c $(CFLAGS) $(INC) $< -Fo$@ $(CC) -c $(CFLAGS) $(INC) $< -Fo$@

View File

@ -6,6 +6,22 @@
#include "ImageTool.h" #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 { typedef struct {
uint8_t NumExtraSections; uint8_t NumExtraSections;
uint32_t SizeOfHeaders; uint32_t SizeOfHeaders;
@ -27,6 +43,7 @@ typedef struct {
uint32_t FileAlignment; uint32_t FileAlignment;
} image_tool_pe_emit_context_t; } image_tool_pe_emit_context_t;
#define EmitPeGetHeaderSizes PE_SUFFIX (EmitPeGetHeaderSizes)
static static
bool bool
EmitPeGetHeaderSizes ( EmitPeGetHeaderSizes (
@ -60,6 +77,7 @@ EmitPeGetHeaderSizes (
return true; return true;
} }
#define EmitPeGetSectionsSize PE_SUFFIX (EmitPeGetSectionsSize)
static static
bool bool
EmitPeGetSectionsSize ( EmitPeGetSectionsSize (
@ -99,6 +117,7 @@ EmitPeGetSectionsSize (
return true; return true;
} }
#define EmitPeGetRelocSectionSize PE_SUFFIX (EmitPeGetRelocSectionSize)
static static
bool bool
EmitPeGetRelocSectionSize ( EmitPeGetRelocSectionSize (
@ -148,6 +167,7 @@ EmitPeGetRelocSectionSize (
return true; return true;
} }
#define EmitPeGetDebugSectionSize PE_SUFFIX (EmitPeGetDebugSectionSize)
static static
void void
EmitPeGetDebugSectionSize ( EmitPeGetDebugSectionSize (
@ -168,6 +188,7 @@ EmitPeGetDebugSectionSize (
*DebugSize = Size; *DebugSize = Size;
} }
#define EmitPeGetExtraSectionsSize PE_SUFFIX (EmitPeGetExtraSectionsSize)
static static
bool bool
EmitPeGetExtraSectionsSize ( EmitPeGetExtraSectionsSize (
@ -248,6 +269,7 @@ EmitPeGetExtraSectionsSize (
return true; return true;
} }
#define ToolImageEmitPeSectionHeaders PE_SUFFIX (ToolImageEmitPeSectionHeaders)
static static
bool bool
ToolImageEmitPeSectionHeaders ( ToolImageEmitPeSectionHeaders (
@ -313,6 +335,7 @@ ToolImageEmitPeSectionHeaders (
return true; return true;
} }
#define ToolImageEmitPeExtraSectionHeaders PE_SUFFIX (ToolImageEmitPeExtraSectionHeaders)
static static
bool bool
ToolImageEmitPeExtraSectionHeaders ( ToolImageEmitPeExtraSectionHeaders (
@ -412,6 +435,7 @@ ToolImageEmitPeExtraSectionHeaders (
return true; return true;
} }
#define ToolImageEmitPeHeaders PE_SUFFIX (ToolImageEmitPeHeaders)
static static
bool bool
ToolImageEmitPeHeaders ( ToolImageEmitPeHeaders (
@ -498,6 +522,7 @@ ToolImageEmitPeHeaders (
return true; return true;
} }
#define ToolImageEmitPeSections PE_SUFFIX (ToolImageEmitPeSections)
static static
bool bool
ToolImageEmitPeSections ( ToolImageEmitPeSections (
@ -513,7 +538,7 @@ ToolImageEmitPeSections (
uint32_t SectionPadding; uint32_t SectionPadding;
bool FirstCode; bool FirstCode;
#if defined(EFI_TARGET32) #if PE_ARCH == 32
bool FirstData; bool FirstData;
#endif #endif
@ -527,7 +552,7 @@ ToolImageEmitPeSections (
SectionsSize = 0; SectionsSize = 0;
FirstCode = true; FirstCode = true;
#if defined(EFI_TARGET32) #if PE_ARCH == 32
FirstData = true; FirstData = true;
#endif #endif
@ -542,7 +567,7 @@ ToolImageEmitPeSections (
FirstCode = false; FirstCode = false;
} }
} }
#if defined(EFI_TARGET32) #if PE_ARCH == 32
else { else {
if (FirstData) { if (FirstData) {
Context->PeHdr->BaseOfData = (UINT32)Segment->ImageAddress; Context->PeHdr->BaseOfData = (UINT32)Segment->ImageAddress;
@ -574,7 +599,7 @@ ToolImageEmitPeSections (
Context->PeHdr->BaseOfCode = MIN(Context->PeHdr->BaseOfCode, (UINT32)Segment->ImageAddress); Context->PeHdr->BaseOfCode = MIN(Context->PeHdr->BaseOfCode, (UINT32)Segment->ImageAddress);
Context->PeHdr->SizeOfCode += Segment->ImageSize; Context->PeHdr->SizeOfCode += Segment->ImageSize;
} else { } else {
#if defined(EFI_TARGET32) #if PE_ARCH == 32
Context->PeHdr->BaseOfData = MIN(Context->PeHdr->BaseOfData, (UINT32)Segment->ImageAddress); Context->PeHdr->BaseOfData = MIN(Context->PeHdr->BaseOfData, (UINT32)Segment->ImageAddress);
#endif #endif
Context->PeHdr->SizeOfInitializedData += Segment->ImageSize; Context->PeHdr->SizeOfInitializedData += Segment->ImageSize;
@ -586,6 +611,7 @@ ToolImageEmitPeSections (
return true; return true;
} }
#define ToolImageEmitPeRelocTable PE_SUFFIX (ToolImageEmitPeRelocTable)
static static
bool bool
ToolImageEmitPeRelocTable ( ToolImageEmitPeRelocTable (
@ -692,6 +718,7 @@ STATIC_ASSERT(
"Flexible array aliases padding." "Flexible array aliases padding."
); );
#define ToolImageEmitPeDebugTable PE_SUFFIX (ToolImageEmitPeDebugTable)
static static
bool bool
ToolImageEmitPeDebugTable ( ToolImageEmitPeDebugTable (
@ -747,6 +774,7 @@ ToolImageEmitPeDebugTable (
return true; return true;
} }
#define ToolImageEmitPeHiiTable PE_SUFFIX (ToolImageEmitPeHiiTable)
static static
bool bool
ToolImageEmitPeHiiTable ( ToolImageEmitPeHiiTable (
@ -790,6 +818,7 @@ ToolImageEmitPeHiiTable (
return true; return true;
} }
#define ToolImageEmitPeExtraSections PE_SUFFIX (ToolImageEmitPeExtraSections)
static static
bool bool
ToolImageEmitPeExtraSections ( ToolImageEmitPeExtraSections (
@ -827,6 +856,7 @@ ToolImageEmitPeExtraSections (
return true; return true;
} }
#define ToolImageEmitPe PE_SUFFIX (ToolImageEmitPe)
void * void *
ToolImageEmitPe ( ToolImageEmitPe (
const image_tool_image_info_t *Image, const image_tool_image_info_t *Image,

View File

@ -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"

View File

@ -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"

View File

@ -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;
}

View File

@ -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 <stdint.h>
#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