diff options
Diffstat (limited to 'src/vita/psp2_loader.h')
| -rw-r--r-- | src/vita/psp2_loader.h | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/vita/psp2_loader.h b/src/vita/psp2_loader.h new file mode 100644 index 0000000..3f64556 --- /dev/null +++ b/src/vita/psp2_loader.h @@ -0,0 +1,54 @@ +#pragma once + +#include "elf_reader.h" +#include "sce.h" + +#include <fstream> +#include <array> +#include <map> + +class psp2_loader +{ + elf_reader<elf32> *m_elf; + uint64 m_relocAddr; + + std::ifstream m_database; + std::map<uint32, std::string> m_nidset; + +public: + psp2_loader(elf_reader<elf32> *elf, std::string databaseFile); + + void apply(); + + bool isLoadingPrx() const + { return m_elf->type() == ET_SCE_RELEXEC; } + + bool isLoadingExec() const + { return m_elf->type() == ET_EXEC; } + +private: + void declareStructures(); + + void applySegments(); + void applySectionHeaders(); + void applyProgramHeaders(); + void applySegment( + uint32 sel, uint64 offset, + uint64 addr, uint64 size, + const char *name, const char *sclass, + uchar perm, uchar align, + bool load = true + ); + + void applyRelocations(); + void applyRelocation(uint32 type, uint32 addr, uint32 addend, uint32 value); + + void applyModuleInfo(); + void loadExports(uint32 entTop, uint32 entEnd); + void loadImports(uint32 stubTop, uint32 stubEnd); + + const char *getNameFromDatabase(unsigned int nid); + + void applySymbols(); +}; + |
