54 -> std::expected<void *, rtp::Error>
56 std::string safeNullTerminatedPath(path);
57 void *handle = dlopen(safeNullTerminatedPath.c_str(),
58 RTLD_LAZY | RTLD_LOCAL);
59 if (!handle) [[unlikely]] {
60 const char *err = dlerror();
63 err ? err :
"Unknown dlopen error")};
70 -> std::expected<void, rtp::Error>
72 if (dlclose(handle) != 0) [[unlikely]] {
73 const char *err = dlerror();
75 return std::unexpected{
78 err ? err :
"Unknown dlclose error")};
85 -> std::expected<void *, rtp::Error>
88 "LoaderBackend: Handle cannot be null during symbol lookup");
89 RTP_ASSERT(!name.empty(),
"LoaderBackend: Symbol name cannot be empty");
92 std::string safeNullTerminatedName(name);
93 void *symbol = dlsym(handle, safeNullTerminatedName.c_str());
94 const char *err = dlerror();
97 "dlsym error: {}", err)};
Assertion and verification macros for runtime checks.
#define RTP_ASSERT(condition, msg,...)
Assertion macro (Debug mode)
Declarations for platform-specific dynamic library handling.
static auto failure(ErrorCode code, std::format_string< Args... > fmt, Args &&...args) -> Error
Create a failure-level error.
static auto getSymbol(void *handle, std::string_view name) -> std::expected< void *, rtp::Error >
Get a symbol from the dynamic library.
static auto open(std::string_view path) -> std::expected< void *, rtp::Error >
Open a dynamic library from the given path.
static auto close(void *handle) noexcept -> std::expected< void, rtp::Error >
Close the dynamic library handle.
@ LibraryLoadFailed
Failed to load dynamic library.
@ SymbolNotFound
Symbol not found in dynamic library.