#include #ifdef GEODE_IS_MACOS #include #include USE_GEODE_NAMESPACE(); template T findSymbolOrMangled(void* dylib, char const* name, char const* 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"); if (!this->m_implicitLoadFunc) { return Err("Unable to find mod entry point"); } 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_implicitLoadFunc = nullptr; return Ok(); } else { return Err("Unable to free library"); } } #endif