#pragma once #include #include #include #include namespace trygvis { namespace elfinfo { enum class MemoryAttribute { R, W, X }; static char to_str(const MemoryAttribute &type) { switch (type) { case MemoryAttribute::R: return 'r'; case MemoryAttribute::W: return 'w'; case MemoryAttribute::X: return 'x'; } } struct Section { std::string name; }; struct MemoryArea { std::string name; uint64_t origin; uint64_t length; std::set attributes; bool contains(uint64_t address, uint64_t size) const { return contains(address) && contains(address + size); } bool contains(uint64_t address) const { return origin <= address && address < origin + length; } std::string attributes_string() const { char buf[4]; buf[0] = attributes.find(MemoryAttribute::R) == attributes.end() ? '-' : 'r'; buf[1] = attributes.find(MemoryAttribute::W) == attributes.end() ? '-' : 'w'; buf[2] = attributes.find(MemoryAttribute::X) == attributes.end() ? '-' : 'x'; buf[3] = '\0'; return std::string(buf); } }; struct LdScript { std::vector memoryAreas; }; class LdScriptLoader { public: LdScriptLoader(); LdScript load(std::string path); void setDebug(bool debug); private: bool debug_; }; } // namespace elfinfo } // namespace trygvis