/** @file | |
ELF library | |
Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.<BR> | |
SPDX-License-Identifier: BSD-2-Clause-Patent | |
**/ | |
#ifndef ELF_LIB_H_ | |
#define ELF_LIB_H_ | |
#include <PiPei.h> | |
#define ELF_CLASS32 1 | |
#define ELF_CLASS64 2 | |
#define ELF_PT_LOAD 1 | |
typedef struct { | |
RETURN_STATUS ParseStatus; ///< Return the status after ParseElfImage(). | |
UINT8 *FileBase; ///< The source location in memory. | |
UINTN FileSize; ///< The size including sections that don't require loading. | |
UINT8 *PreferredImageAddress; ///< The preferred image to be loaded. No relocation is needed if loaded to this address. | |
BOOLEAN ReloadRequired; ///< The image needs a new memory location for running. | |
UINT8 *ImageAddress; ///< The destination memory address set by caller. | |
UINTN ImageSize; ///< The memory size for loading and execution. | |
UINT32 EiClass; | |
UINT32 ShNum; | |
UINT32 PhNum; | |
UINTN ShStrOff; | |
UINTN ShStrLen; | |
UINTN EntryPoint; ///< Return the actual entry point after LoadElfImage(). | |
} ELF_IMAGE_CONTEXT; | |
typedef struct { | |
UINT32 PtType; | |
UINTN Offset; | |
UINTN Length; | |
UINTN MemLen; | |
UINTN MemAddr; | |
UINTN Alignment; | |
} SEGMENT_INFO; | |
/** | |
Parse the ELF image info. | |
@param[in] ImageBase Memory address of an image. | |
@param[out] ElfCt The EFL image context pointer. | |
@retval EFI_INVALID_PARAMETER Input parameters are not valid. | |
@retval EFI_UNSUPPORTED Unsupported binary type. | |
@retval EFI_LOAD_ERROR ELF binary loading error. | |
@retval EFI_SUCCESS ELF binary is loaded successfully. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
ParseElfImage ( | |
IN VOID *ImageBase, | |
OUT ELF_IMAGE_CONTEXT *ElfCt | |
); | |
/** | |
Load the ELF segments to specified address in ELF header. | |
This function loads ELF image segments into memory address specified | |
in ELF program header. | |
@param[in] ElfCt ELF image context pointer. | |
@retval EFI_INVALID_PARAMETER Input parameters are not valid. | |
@retval EFI_UNSUPPORTED Unsupported binary type. | |
@retval EFI_LOAD_ERROR ELF binary loading error. | |
@retval EFI_SUCCESS ELF binary is loaded successfully. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
LoadElfImage ( | |
IN ELF_IMAGE_CONTEXT *ElfCt | |
); | |
/** | |
Get a ELF section name from its index. | |
@param[in] ElfCt ELF image context pointer. | |
@param[in] SectionIndex ELF section index. | |
@param[out] SectionName The pointer to the section name. | |
@retval EFI_INVALID_PARAMETER ElfCt or SecName is NULL. | |
@retval EFI_NOT_FOUND Could not find the section. | |
@retval EFI_SUCCESS Section name was filled successfully. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
GetElfSectionName ( | |
IN ELF_IMAGE_CONTEXT *ElfCt, | |
IN UINT32 SectionIndex, | |
OUT CHAR8 **SectionName | |
); | |
/** | |
Get the offset and size of x-th ELF section. | |
@param[in] ElfCt ELF image context pointer. | |
@param[in] Index ELF section index. | |
@param[out] Offset Return the offset of the specific section. | |
@param[out] Size Return the size of the specific section. | |
@retval EFI_INVALID_PARAMETER ImageBase, Offset or Size is NULL. | |
@retval EFI_INVALID_PARAMETER EiClass doesn't equal to ELFCLASS32 or ELFCLASS64. | |
@retval EFI_NOT_FOUND Could not find the section. | |
@retval EFI_SUCCESS Offset and Size are returned. | |
**/ | |
EFI_STATUS | |
EFIAPI | |
GetElfSectionPos ( | |
IN ELF_IMAGE_CONTEXT *ElfCt, | |
IN UINT32 Index, | |
OUT UINTN *Offset, | |
OUT UINTN *Size | |
); | |
#endif /* ELF_LIB_H_ */ |