diff options
Diffstat (limited to 'includes/trygvis/elfinfo')
-rw-r--r-- | includes/trygvis/elfinfo/Ld.h | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/includes/trygvis/elfinfo/Ld.h b/includes/trygvis/elfinfo/Ld.h new file mode 100644 index 0000000..cab466d --- /dev/null +++ b/includes/trygvis/elfinfo/Ld.h @@ -0,0 +1,70 @@ +#pragma once + +#include <string> +#include <set> +#include <vector> +#include <sstream> + +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<MemoryAttribute> 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<MemoryArea> memoryAreas; +}; + +class LdScriptLoader { +public: + LdScriptLoader(); + + LdScript load(std::string path); + + void setDebug(bool debug); +private: + bool debug_; +}; + +} // namespace elfinfo +} // namespace trygvis |