#include #ifdef GEODE_IS_MACOS #include #include USE_GEODE_NAMESPACE(); template T findSymbolOrMangled(void* dylib, const char* name, const char* mangled) { auto res = reinterpret_cast(dlsym(dylib, name)); if (!res) { res = reinterpret_cast(dlsym(dylib,mangled)); } return res; } Result<> Mod::loadPlatformBinary() { auto dylib = dlopen((this->m_tempDirName / this->m_info.m_binaryName).string().c_str(), RTLD_LAZY); if (dylib) { this->m_implicitLoadFunc = findSymbolOrMangled(dylib, "geode_implicit_load", "_geode_implicit_load"); this->m_loadFunc = findSymbolOrMangled(dylib, "geode_load", "_geode_load"); this->m_unloadFunc = findSymbolOrMangled(dylib, "geode_unload", "_geode_unload"); this->m_enableFunc = findSymbolOrMangled(dylib, "geode_enable", "_geode_enable"); this->m_disableFunc = findSymbolOrMangled(dylib, "geode_disable", "_geode_disable"); this->m_saveDataFunc = findSymbolOrMangled(dylib, "geode_save_data", "_geode_save_data"); this->m_loadDataFunc = findSymbolOrMangled(dylib, "geode_load_data", "_geode_load_data"); this->m_settingUpdatedFunc = findSymbolOrMangled(dylib, "geode_setting_updated", "_geode_setting_updated"); if (!this->m_implicitLoadFunc && !this->m_loadFunc) { return Err<>("Unable to find mod entry point (lacking both implicit & explicit definition)"); } if (this->m_platformInfo) { delete this->m_platformInfo; } this->m_platformInfo = new PlatformInfo { dylib }; return Ok<>(); } std::string err = (char const*)dlerror(); return Err<>("Unable to load the DYLIB: dlerror returned (" + err + ")"); } Result<> Mod::unloadPlatformBinary() { auto dylib = this->m_platformInfo->m_dylib; delete this->m_platformInfo; this->m_platformInfo = nullptr; if (dlclose(dylib) == 0) { this->m_unloadFunc = nullptr; this->m_loadFunc = nullptr; this->m_implicitLoadFunc = nullptr; this->m_enableFunc = nullptr; this->m_disableFunc = nullptr; this->m_saveDataFunc = nullptr; this->m_loadDataFunc = nullptr; this->m_settingUpdatedFunc = nullptr; return Ok<>(); } else { return Err<>("Unable to free library"); } } #endif