mirror of
https://github.com/acidanthera/audk.git
synced 2025-09-24 02:07:44 +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" ]
|
||||
then
|
||||
if [ $1 == 'IA32' ] || [ $1 == 'ARM' ]
|
||||
if [ ! -e "$EDK_TOOLS_PATH/ImageTool/ImageTool" ]
|
||||
then
|
||||
if [ ! -e "$EDK_TOOLS_PATH/ImageTool/ImageTool32" ]
|
||||
then
|
||||
echo "BaseTools C Tool binary was not found (ImageTool32)"
|
||||
echo "You may need to run:"
|
||||
echo " make -C $EDK_TOOLS_PATH/ImageTool"
|
||||
else
|
||||
shift
|
||||
exec "$EDK_TOOLS_PATH/ImageTool/ImageTool32" "$@"
|
||||
fi
|
||||
elif [ $1 == 'X64' ] || [ $1 == 'AARCH64' ]
|
||||
then
|
||||
if [ ! -e "$EDK_TOOLS_PATH/ImageTool/ImageTool64" ]
|
||||
then
|
||||
echo "BaseTools C Tool binary was not found (ImageTool64)"
|
||||
echo "You may need to run:"
|
||||
echo " make -C $EDK_TOOLS_PATH/ImageTool"
|
||||
else
|
||||
shift
|
||||
exec "$EDK_TOOLS_PATH/ImageTool/ImageTool64" "$@"
|
||||
fi
|
||||
echo "BaseTools C Tool binary was not found (ImageTool)"
|
||||
echo "You may need to run:"
|
||||
echo " make -C $EDK_TOOLS_PATH/ImageTool"
|
||||
else
|
||||
echo "ImageTool for $1 is not supported"
|
||||
exit 127
|
||||
exec "$EDK_TOOLS_PATH/ImageTool/ImageTool" "$@"
|
||||
fi
|
||||
else
|
||||
echo "Unable to find the real '$cmd' to run"
|
||||
|
@ -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 %*
|
||||
|
@ -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)
|
||||
|
@ -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;
|
||||
|
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
|
||||
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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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$@
|
||||
|
@ -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,
|
||||
|
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