From 4d8b6e0ceeb9c8df06decf33b83781adc00cbead Mon Sep 17 00:00:00 2001 From: Trygve Laugstøl Date: Tue, 26 Jul 2016 21:17:20 +0200 Subject: cleaning. --- include/trygvis/elfinfo/Ld.h | 85 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 include/trygvis/elfinfo/Ld.h (limited to 'include/trygvis/elfinfo') diff --git a/include/trygvis/elfinfo/Ld.h b/include/trygvis/elfinfo/Ld.h new file mode 100644 index 0000000..9bb81aa --- /dev/null +++ b/include/trygvis/elfinfo/Ld.h @@ -0,0 +1,85 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace trygvis { +namespace elfinfo { + +class LdParseException : public std::runtime_error { +public: + explicit LdParseException(const std::vector &messages) : + runtime_error("Parse error"), messages(messages) {} + + const std::vector messages; +}; + +class LdInternalErrorException : public std::runtime_error { +public: + explicit LdInternalErrorException(const std::string &what) : runtime_error(what) {} +}; + +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 -- cgit v1.2.3