/* * ======================================================== * * HCore * Copyright Mahrouss Logic, all rights reserved. * * ======================================================== */ #include #include #include #include #include #include /* ------------------------------------------- Revision History: 01/02/24: Rework shared library ABI, except a __LibInit and __LibFini (amlel) 15/02/24: Breaking changes, changed the name of the routines. (amlel) ------------------------------------------- */ using namespace HCore; /***********************************************************************************/ /// @file SharedObjectRT.cxx /// @brief Shared Object runtime. /***********************************************************************************/ /***********************************************************************************/ /* @brief Library runtime initializer. */ /***********************************************************************************/ extern "C" SharedObjectPtr ke_library_init(void) { SharedObjectPtr library = hcore_tls_new_class(); if (!library) { ProcessManager::Shared().Leak().GetCurrent().Leak().Crash(); return nullptr; } library->Mount(hcore_tls_new_class()); if (!library->Get()) { ProcessManager::Shared().Leak().GetCurrent().Leak().Crash(); return nullptr; } library->Get()->fImageObject = ProcessManager::Shared().Leak().GetCurrent().Leak().Image; if (!library->Get()->fImageObject) { ProcessManager::Shared().Leak().GetCurrent().Leak().Crash(); return nullptr; } library->Get()->fImageEntrypointOffset = library->Load(kPefStart, rt_string_len(kPefStart, 0), kPefCode); return library; } /***********************************************************************************/ /* @brief Ends the library. */ /* @note Please check if the lib got freed! */ /* @param SharedObjectPtr the library to free. */ /***********************************************************************************/ extern "C" Void ke_library_free(SharedObjectPtr lib, bool *successful) { MUST_PASS(successful); // sanity check (will also trigger a bug check) if (lib == nullptr) { *successful = false; ProcessManager::Shared().Leak().GetCurrent().Leak().Crash(); } delete lib->Get(); delete lib; lib = nullptr; *successful = true; } /***********************************************************************************/ extern "C" void __mh_purecall(void) { // virtual placeholder. return; }