| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- /**
- * @file elf_file.h
- * ELF file loader
- */
- #pragma once
- #include <storage/storage.h>
- #include "../application_manifest.h"
- #include "elf_api_interface.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- typedef struct ELFFile ELFFile;
- typedef struct {
- const char* name;
- uint32_t address;
- } ELFMemoryMapEntry;
- typedef struct {
- uint32_t debug_link_size;
- uint8_t* debug_link;
- } ELFDebugLinkInfo;
- typedef struct {
- uint32_t mmap_entry_count;
- ELFMemoryMapEntry* mmap_entries;
- ELFDebugLinkInfo debug_link_info;
- off_t entry;
- } ELFDebugInfo;
- typedef enum {
- ELFFileLoadStatusSuccess = 0,
- ELFFileLoadStatusUnspecifiedError,
- ELFFileLoadStatusNoFreeMemory,
- ELFFileLoadStatusMissingImports,
- } ELFFileLoadStatus;
- /**
- * @brief Allocate ELFFile instance
- * @param storage
- * @param api_interface
- * @return ELFFile*
- */
- ELFFile* elf_file_alloc(Storage* storage, const ElfApiInterface* api_interface);
- /**
- * @brief Free ELFFile instance
- * @param elf_file
- */
- void elf_file_free(ELFFile* elf_file);
- /**
- * @brief Open ELF file
- * @param elf_file
- * @param path
- * @return bool
- */
- bool elf_file_open(ELFFile* elf_file, const char* path);
- /**
- * @brief Load ELF file manifest
- * @param elf
- * @param manifest
- * @return bool
- */
- bool elf_file_load_manifest(ELFFile* elf, FlipperApplicationManifest* manifest);
- /**
- * @brief Load ELF file section table (load stage #1)
- * @param elf_file
- * @param manifest
- * @return bool
- */
- bool elf_file_load_section_table(ELFFile* elf_file, FlipperApplicationManifest* manifest);
- /**
- * @brief Load and relocate ELF file sections (load stage #2)
- * @param elf_file
- * @return ELFFileLoadStatus
- */
- ELFFileLoadStatus elf_file_load_sections(ELFFile* elf_file);
- /**
- * @brief Execute ELF file pre-run stage, call static constructors for example (load stage #3)
- * @param elf
- */
- void elf_file_pre_run(ELFFile* elf);
- /**
- * @brief Run ELF file (load stage #4)
- * @param elf_file
- * @param args
- * @return int32_t
- */
- int32_t elf_file_run(ELFFile* elf_file, void* args);
- /**
- * @brief Execute ELF file post-run stage, call static destructors for example (load stage #5)
- * @param elf
- */
- void elf_file_post_run(ELFFile* elf);
- /**
- * @brief Get ELF file API interface
- * @param elf_file
- * @return const ElfApiInterface*
- */
- const ElfApiInterface* elf_file_get_api_interface(ELFFile* elf_file);
- /**
- * @brief Get ELF file debug info
- * @param elf_file
- * @param debug_info
- */
- void elf_file_init_debug_info(ELFFile* elf_file, ELFDebugInfo* debug_info);
- /**
- * @brief Clear ELF file debug info generated by elf_file_init_debug_info
- * @param debug_info
- */
- void elf_file_clear_debug_info(ELFDebugInfo* debug_info);
- #ifdef __cplusplus
- }
- #endif
|