#pragma once #include #include #include #include namespace calc_efl { enum class LoadFlag : uint32_t { DO_NOT_LOAD = 0, BY_SECTION = 1, BY_PT_LOAD }; struct Parsed_Elf_Section_s { char name[64]; uint32_t type; uint64_t size; // size after padding if in need uint64_t address; uint64_t offset = 0; // indicate the raw efficient data index in image std::vector data; }; // struct Parsed_shared_ph_s // { // uint32_t p_type; // uint32_t p_flgas; // uint64_t p_vaddr; // uint64_t p_filesz; // }; struct Parsed_Elf_s { uint16_t id; uint16_t e_type; uint64_t e_entry; uint64_t progBitSize = 0; // only record max progbit type siz (cross all elf under the same model) uint64_t f_addr = 0; // indicate the first valid section address. For relocation usage char path[256]; char postfix[128]; // if is same chip ccu // std::map phs; std::map sections; // [address, section] bool operator ==(const Parsed_Elf_s &other) const { bool isSamePost = std::strcmp(postfix, other.postfix) == 0; bool isSamePath = std::strcmp(path, other.path) == 0; return (isSamePost && isSamePath); } }; /** * @brief intelligent parse method * * @param path ELF path * @return std::pair> entry addr and datas */ std::pair> ParseElf_Intell(const char *path); /** * @brief naively parse metho * * @param path elf path * @param isRT is it for calrt purpose (default: false) * @return Parsed_Elf_s */ Parsed_Elf_s ParseElf_Naive(const char *path, LoadFlag lFlag = LoadFlag::BY_SECTION); Parsed_Elf_s ParseElf_by_PT_LOAD(const char *path); /** * @brief relocate elf * * @param elf_mirror data struct get from ParseElf * @param path elf file path * @param loadBase new allocated address */ void RelocateSection(uint8_t *imageElf, const char *path, uint64_t loadBase, const Parsed_Elf_s &parsed_elf); }