summaryrefslogtreecommitdiff
path: root/src/wiiu/cafe_loader.h
diff options
context:
space:
mode:
authorCrementif <26669564+Crementif@users.noreply.github.com>2026-05-21 23:27:58 +0200
committerCrementif <26669564+Crementif@users.noreply.github.com>2026-05-22 00:52:12 +0200
commitf78b28db5b3d1a9387bd18b1f2efe15b6d09dcb4 (patch)
tree47370fa6044f5dd138f6a8344745ed8070968b9e /src/wiiu/cafe_loader.h
parent283dd15c854eaf1ae8b967305050775183f30754 (diff)
Add RPX/RPL relocation support and improve overall accuracy
Diffstat (limited to 'src/wiiu/cafe_loader.h')
-rw-r--r--src/wiiu/cafe_loader.h48
1 files changed, 41 insertions, 7 deletions
diff --git a/src/wiiu/cafe_loader.h b/src/wiiu/cafe_loader.h
index dbfdddb..b754fe6 100644
--- a/src/wiiu/cafe_loader.h
+++ b/src/wiiu/cafe_loader.h
@@ -3,22 +3,46 @@
#include "elf_reader.h"
#include "cafe.h"
+#include <map>
+#include <string>
#include <vector>
class cafe_loader {
elf_reader<elf32> *m_elf;
- uint32 m_relocAddr;
-
- ea_t m_externStart;
- ea_t m_externEnd;
struct import {
- ea_t addr;
- ea_t orig;
- const char *name;
+ uint32 symbol_index;
+ ea_t table_ea;
+ ea_t thunk_ea;
+ std::string module;
+ std::string name;
+ int32 tls_module_index;
+ bool is_function;
+ bool is_tls;
};
std::vector<import> m_imports;
+ std::map<ea_t, ea_t> m_internalTrampolines;
+ std::vector<int> m_symbol_imports;
+
+ uint32 m_sdaBase;
+ uint32 m_sda2Base;
+ uint32 m_textSize;
+ uint32 m_trampAdjust;
+ int32 m_tlsModuleIndex;
+ bool m_haveFileInfo;
+ bool m_haveTextRegion;
+ bool m_isRpx;
+ ea_t m_textAllocBase;
+ ea_t m_textAllocEnd;
+ ea_t m_textLoadStart;
+ ea_t m_textLoadEnd;
+ ea_t m_importThunkStart;
+ ea_t m_importThunkEnd;
+ ea_t m_preTrampStart;
+ ea_t m_preTrampCursor;
+ ea_t m_postTrampCursor;
+ ea_t m_postTrampEnd;
public:
cafe_loader(elf_reader<elf32> *elf);
@@ -37,6 +61,16 @@ private:
uchar align,
bool load);
+ void collectFileInfo();
+ void collectImports();
+ void collectImportThunks();
+ void createTextTrampolineSegments();
+ bool isImportSection(uint16 section_index) const;
+ ea_t ensureImportThunk(size_t symbol_index, ea_t reloc_ea);
+ ea_t resolveSymbolValue(size_t symbol_index) const;
+ ea_t createRel24Trampoline(ea_t target);
+ int32 resolveTlsModuleIndex(size_t symbol_index) const;
+
void applyRelocations();
void processImports();