summaryrefslogtreecommitdiff
path: root/src/wiiu/cafe_loader.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/wiiu/cafe_loader.h')
-rw-r--r--src/wiiu/cafe_loader.h45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/wiiu/cafe_loader.h b/src/wiiu/cafe_loader.h
new file mode 100644
index 0000000..5417690
--- /dev/null
+++ b/src/wiiu/cafe_loader.h
@@ -0,0 +1,45 @@
+#pragma once
+
+#include "elf_reader.h"
+#include "cafe.h"
+
+class cafe_loader {
+ elf_reader<elf32> *m_elf;
+ uint32 m_relocAddr;
+
+ uint32 m_externStart;
+ uint32 m_externEnd;
+
+ struct import {
+ uint32 addr;
+ uint32 orig;
+ const char *name;
+ };
+
+ std::vector<import> m_imports;
+
+public:
+ cafe_loader(elf_reader<elf32> *elf);
+
+ void apply();
+
+private:
+ void applySegments();
+ void applySegment(uint32 sel,
+ const char *data,
+ uint32 addr,
+ uint32 size,
+ const char *name,
+ const char *sclass,
+ uchar perm,
+ uchar align,
+ bool load);
+
+ void applyRelocations();
+
+ void processImports();
+ void processExports();
+
+ void swapSymbols();
+ void applySymbols();
+}; \ No newline at end of file