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" ]
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 "BaseTools C Tool binary was not found (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
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"

View File

@ -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 %*

View File

@ -352,7 +352,7 @@
$(OUTPUT_DIR)(+)$(MODULE_NAME).map
<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} $(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 @@
<Command.MSFT, Command.INTEL>
"$(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}
<Command.GCC>
"$(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]
<InputFile>
@ -466,23 +466,23 @@
<Command.MSFT, Command.INTEL>
"$(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}
<Command.GCC>
"$(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}
<Command.CLANGPDB>
"$(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}
<Command.XCODE>
"$(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
<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
<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
<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}
<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 "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;

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

View File

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

View File

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

View File

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

View File

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

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