mirror of
https://github.com/wiiu-env/WiiUPluginLoaderBackend.git
synced 2024-11-22 04:39:17 +01:00
Set a custom OSDynLoad Allocator when processing relocations
This commit is contained in:
parent
0a254e59f4
commit
2882635f6f
@ -52,6 +52,7 @@ bool PluginManagement::doRelocation(const std::vector<std::unique_ptr<Relocation
|
|||||||
} else {
|
} else {
|
||||||
//DEBUG_FUNCTION_LINE("Found export for %s %s", rplName.c_str(), functionName.c_str());
|
//DEBUG_FUNCTION_LINE("Found export for %s %s", rplName.c_str(), functionName.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!ElfUtils::elfLinkOne(cur->getType(), cur->getOffset(), cur->getAddend(), (uint32_t) cur->getDestination(), functionAddress, tramp_data, tramp_length, RELOC_TYPE_IMPORT, trampolineID)) {
|
if (!ElfUtils::elfLinkOne(cur->getType(), cur->getOffset(), cur->getAddend(), (uint32_t) cur->getDestination(), functionAddress, tramp_data, tramp_length, RELOC_TYPE_IMPORT, trampolineID)) {
|
||||||
DEBUG_FUNCTION_LINE_ERR("elfLinkOne failed");
|
DEBUG_FUNCTION_LINE_ERR("elfLinkOne failed");
|
||||||
return false;
|
return false;
|
||||||
@ -73,19 +74,28 @@ bool PluginManagement::doRelocation(const std::vector<std::unique_ptr<Relocation
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool PluginManagement::doRelocations(const std::vector<std::unique_ptr<PluginContainer>> &plugins, relocation_trampoline_entry_t *trampData, uint32_t tramp_size) {
|
bool PluginManagement::doRelocations(const std::vector<std::unique_ptr<PluginContainer>> &plugins, relocation_trampoline_entry_t *trampData, uint32_t tramp_size) {
|
||||||
for (uint32_t i = 0; i < tramp_size; i++) {
|
for (uint32_t i = 0; i < tramp_size; i++) {
|
||||||
if (trampData[i].status == RELOC_TRAMP_IMPORT_DONE) {
|
if (trampData[i].status == RELOC_TRAMP_IMPORT_DONE) {
|
||||||
trampData[i].status = RELOC_TRAMP_FREE;
|
trampData[i].status = RELOC_TRAMP_FREE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OSDynLoadAllocFn prevDynLoadAlloc = nullptr;
|
||||||
|
OSDynLoadFreeFn prevDynLoadFree = nullptr;
|
||||||
|
|
||||||
|
OSDynLoad_GetAllocator(&prevDynLoadAlloc, &prevDynLoadFree);
|
||||||
|
OSDynLoad_SetAllocator(CustomDynLoadAlloc, CustomDynLoadFree);
|
||||||
|
|
||||||
for (auto &pluginContainer : plugins) {
|
for (auto &pluginContainer : plugins) {
|
||||||
DEBUG_FUNCTION_LINE_VERBOSE("Doing relocations for plugin: %s", pluginContainer->getMetaInformation()->getName().c_str());
|
DEBUG_FUNCTION_LINE_VERBOSE("Doing relocations for plugin: %s", pluginContainer->getMetaInformation()->getName().c_str());
|
||||||
if (!PluginManagement::doRelocation(pluginContainer->getPluginInformation()->getRelocationDataList(), trampData, tramp_size, pluginContainer->getPluginInformation()->getTrampolineId())) {
|
if (!PluginManagement::doRelocation(pluginContainer->getPluginInformation()->getRelocationDataList(), trampData, tramp_size, pluginContainer->getPluginInformation()->getTrampolineId())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OSDynLoad_SetAllocator(prevDynLoadAlloc, prevDynLoadFree);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
#include "utils/logger.h"
|
#include "utils.h"
|
||||||
|
#include "logger.h"
|
||||||
#include <coreinit/ios.h>
|
#include <coreinit/ios.h>
|
||||||
#include <cstring>
|
#include <cstring>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
@ -53,3 +54,25 @@ void dumpHex(const void *data, size_t size) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OSDynLoad_Error CustomDynLoadAlloc(int32_t size, int32_t align, void **outAddr) {
|
||||||
|
if (!outAddr) {
|
||||||
|
return OS_DYNLOAD_INVALID_ALLOCATOR_PTR;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (align >= 0 && align < 4) {
|
||||||
|
align = 4;
|
||||||
|
} else if (align < 0 && align > -4) {
|
||||||
|
align = -4;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(*outAddr = memalign(align, size))) {
|
||||||
|
return OS_DYNLOAD_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return OS_DYNLOAD_OK;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CustomDynLoadFree(void *addr) {
|
||||||
|
free(addr);
|
||||||
|
}
|
@ -1,5 +1,6 @@
|
|||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <coreinit/dynload.h>
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
#include <forward_list>
|
#include <forward_list>
|
||||||
#include <malloc.h>
|
#include <malloc.h>
|
||||||
@ -73,4 +74,8 @@ bool remove_locked_first_if(std::mutex &mutex, std::forward_list<T, Allocator> &
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string getPluginPath();
|
std::string getPluginPath();
|
||||||
|
|
||||||
|
OSDynLoad_Error CustomDynLoadAlloc(int32_t size, int32_t align, void **outAddr);
|
||||||
|
|
||||||
|
void CustomDynLoadFree(void *addr);
|
Loading…
Reference in New Issue
Block a user