aboutsummaryrefslogtreecommitdiff
path: root/includes/trygvis/elfinfo/Ld.h
diff options
context:
space:
mode:
Diffstat (limited to 'includes/trygvis/elfinfo/Ld.h')
-rw-r--r--includes/trygvis/elfinfo/Ld.h70
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