mirror of
https://github.com/acidanthera/audk.git
synced 2025-09-24 10:17:45 +02:00
ImageTool: Unify 32-bit and 64-bit tool variants
This commit is contained in:
parent
270a038c4d
commit
141a48425c
@ -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"
|
||||||
|
@ -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
|
|
||||||
|
@ -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)
|
||||||
|
@ -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;
|
||||||
|
7
BaseTools/ImageTool/ElfScan32.c
Normal file
7
BaseTools/ImageTool/ElfScan32.c
Normal 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"
|
7
BaseTools/ImageTool/ElfScan64.c
Normal file
7
BaseTools/ImageTool/ElfScan64.c
Normal 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"
|
24
BaseTools/ImageTool/ElfScanCommon.c
Normal file
24
BaseTools/ImageTool/ElfScanCommon.c
Normal 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;
|
||||||
|
}
|
29
BaseTools/ImageTool/ElfScanCommon.h
Normal file
29
BaseTools/ImageTool/ElfScanCommon.h
Normal 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
|
@ -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
|
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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$@
|
||||||
|
@ -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,
|
||||||
|
7
BaseTools/ImageTool/PeEmit32.c
Normal file
7
BaseTools/ImageTool/PeEmit32.c
Normal 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"
|
7
BaseTools/ImageTool/PeEmit64.c
Normal file
7
BaseTools/ImageTool/PeEmit64.c
Normal 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"
|
34
BaseTools/ImageTool/PeEmitCommon.c
Normal file
34
BaseTools/ImageTool/PeEmitCommon.c
Normal 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;
|
||||||
|
}
|
25
BaseTools/ImageTool/PeEmitCommon.h
Normal file
25
BaseTools/ImageTool/PeEmitCommon.h
Normal 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
|
Loading…
x
Reference in New Issue
Block a user