#include "os/Loader.h"
#include <dlfcn.h>
#include "Base/Log.h"
namespace MapleRuntime {
namespace Os {
void* Loader::LoadBinaryFile(const char* path)
{
if (path == nullptr) {
return nullptr;
}
void* handler = dlopen(path, RTLD_NOW | RTLD_GLOBAL);
if (handler == nullptr) {
LOG(RTLOG_ERROR, dlerror());
}
return handler;
}
int Loader::UnloadBinaryFile(void* handler)
{
if (handler == nullptr) {
return -1;
}
int ret = dlclose(handler);
return ret;
}
void* Loader::FindSymbol(void* handler, const char* symbolName)
{
if (symbolName == nullptr) {
return nullptr;
}
return dlsym(handler, symbolName);
}
int Loader::GetBinaryInfoFromAddress(const void* address, BinaryInfo* binInfo)
{
if (address == nullptr) {
return 0;
}
Dl_info dlInfo;
int ret = dladdr(address, &dlInfo);
if (!ret) {
return 0;
}
binInfo->filePathName = const_cast<char*>(dlInfo.dli_fname);
binInfo->symbolName = const_cast<char*>(dlInfo.dli_sname);
return ret;
}
}
}