/** @file ELF library Copyright (c) 2018 - 2021, Intel Corporation. All rights reserved.
SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef ELF_LIB_H_ #define ELF_LIB_H_ #include #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_ */