#pragma once #include "loader/binary.hpp" #include #include #include class ELFLoader : public Binary { public: ELFLoader(); ~ELFLoader() override; bool load(const string& path) override; BinaryFormat getFormat() const override { return BinaryFormat::ELF; } Arch getArch() const override { return m_arch; } addr_t getEntryPoint() const override { return m_entry; } addr_t getImageBase() const override { return 0; } vector readBytes(addr_t vaddr, size_t size) const override; vector> getExecutableRanges() const override; vector> getExportedFunctions() const override; vector getImportedFunctions() const override; const string& getPath() const override { return m_path; } addr_t getInitArray() const { return m_init_array; } addr_t getFiniArray() const { return m_fini_array; } size_t getInitArraySize() const { return m_init_array_size; } size_t getFiniArraySize() const { return m_fini_array_size; } addr_t getInit() const { return m_init; } addr_t getFini() const { return m_fini; } private: bool parseHeader(); bool parseDynamic(); bool parseSections(); bool parseSymbols(); string m_path; Arch m_arch; addr_t m_entry; vector m_data; vector> m_exec_ranges; vector> m_exports; vector m_imports; map m_symbols; addr_t m_init_array; size_t m_init_array_size; addr_t m_fini_array; size_t m_fini_array_size; addr_t m_init; addr_t m_fini; };