diff options
author | Bastien Bouclet | 2019-12-01 17:19:50 +0100 |
---|---|---|
committer | Bastien Bouclet | 2019-12-01 17:19:50 +0100 |
commit | 34e835a20ca648b0fd2e67cefc84511c1dab6217 (patch) | |
tree | 97ba9b239a8fd9c9d8bba925b21262314de2f2c2 /backends/plugins/elf/elf-loader.cpp | |
parent | a51c23abd3a667811b01e90b0c8c53505021950a (diff) | |
download | scummvm-rg350-34e835a20ca648b0fd2e67cefc84511c1dab6217.tar.gz scummvm-rg350-34e835a20ca648b0fd2e67cefc84511c1dab6217.tar.bz2 scummvm-rg350-34e835a20ca648b0fd2e67cefc84511c1dab6217.zip |
3DS: Implement dynamic plugins
Allows a full build to run on old generation devices
Diffstat (limited to 'backends/plugins/elf/elf-loader.cpp')
-rw-r--r-- | backends/plugins/elf/elf-loader.cpp | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/backends/plugins/elf/elf-loader.cpp b/backends/plugins/elf/elf-loader.cpp index 5198fa8088..39f1f7dfa5 100644 --- a/backends/plugins/elf/elf-loader.cpp +++ b/backends/plugins/elf/elf-loader.cpp @@ -50,8 +50,7 @@ DLObject::DLObject() : DLObject::~DLObject() { discardSymtab(); - ELFMemMan.pluginDeallocate(_segment); - _segment = 0; + discardSegment(); } // Expel the symbol table from memory @@ -65,11 +64,12 @@ void DLObject::discardSymtab() { _symbol_cnt = 0; } -// Unload all objects from memory -void DLObject::unload() { - discardSymtab(); - - ELFMemMan.pluginDeallocate(_segment); +void DLObject::discardSegment() { + if (_segment) { + // Restore default protection before returning memory + protectMemory(_segment, _segmentSize, PF_R | PF_W); + deallocateMemory(_segment, _segmentSize); + } _segment = 0; _segmentSize = 0; @@ -77,6 +77,12 @@ void DLObject::unload() { _segmentVMA = 0; } +// Unload all objects from memory +void DLObject::unload() { + discardSymtab(); + discardSegment(); +} + bool DLObject::readElfHeader(Elf32_Ehdr *ehdr) { assert(_file); @@ -163,7 +169,7 @@ bool DLObject::readProgramHeaders(Elf32_Ehdr *ehdr, Elf32_Phdr *phdr, Elf32_Half } bool DLObject::loadSegment(Elf32_Phdr *phdr) { - _segment = (byte *)ELFMemMan.pluginAllocate(phdr->p_align, phdr->p_memsz); + _segment = (byte *)allocateMemory(phdr->p_align, phdr->p_memsz); if (!_segment) { warning("elfloader: Out of memory."); @@ -402,6 +408,8 @@ bool DLObject::load() { return false; } + protectMemory(_segment, _segmentSize, phdr.p_flags); + return true; } @@ -488,4 +496,12 @@ void *DLObject::symbol(const char *name) { return 0; } +void *DLObject::allocateMemory(uint32 align, uint32 size) { + return ELFMemMan.pluginAllocate(align, size); +} + +void DLObject::deallocateMemory(void *ptr, uint32 size) { + ELFMemMan.pluginDeallocate(ptr); +} + #endif /* defined(DYNAMIC_MODULES) && defined(USE_ELF_LOADER) */ |