1e509ee18Sopenharmony_ci/*
2e509ee18Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
3e509ee18Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4e509ee18Sopenharmony_ci * you may not use this file except in compliance with the License.
5e509ee18Sopenharmony_ci * You may obtain a copy of the License at
6e509ee18Sopenharmony_ci *
7e509ee18Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8e509ee18Sopenharmony_ci *
9e509ee18Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10e509ee18Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11e509ee18Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12e509ee18Sopenharmony_ci * See the License for the specific language governing permissions and
13e509ee18Sopenharmony_ci * limitations under the License.
14e509ee18Sopenharmony_ci */
15e509ee18Sopenharmony_ci
16e509ee18Sopenharmony_ci#include "library_loader.h"
17e509ee18Sopenharmony_ci
18e509ee18Sopenharmony_ci#include "common/log_wrapper.h"
19e509ee18Sopenharmony_ci
20e509ee18Sopenharmony_ci#if defined(UNIX_PLATFORM)
21e509ee18Sopenharmony_ci#include <dlfcn.h>
22e509ee18Sopenharmony_ci#elif defined(WINDOWS_PLATFORM)
23e509ee18Sopenharmony_ci#include <windows.h>
24e509ee18Sopenharmony_ci#ifdef ERROR
25e509ee18Sopenharmony_ci#undef ERROR
26e509ee18Sopenharmony_ci#endif
27e509ee18Sopenharmony_ci#else
28e509ee18Sopenharmony_ci#error "Unsupported platform"
29e509ee18Sopenharmony_ci#endif
30e509ee18Sopenharmony_ci
31e509ee18Sopenharmony_ci#include <string>
32e509ee18Sopenharmony_ci
33e509ee18Sopenharmony_cinamespace OHOS::ArkCompiler::Toolchain {
34e509ee18Sopenharmony_ci#ifdef WINDOWS_PLATFORM
35e509ee18Sopenharmony_civoid* Load(std::string_view libraryName)
36e509ee18Sopenharmony_ci{
37e509ee18Sopenharmony_ci    HMODULE module = LoadLibrary(libraryName.data());
38e509ee18Sopenharmony_ci    void* handle = reinterpret_cast<void*>(module);
39e509ee18Sopenharmony_ci    if (handle != nullptr) {
40e509ee18Sopenharmony_ci        return handle;
41e509ee18Sopenharmony_ci    }
42e509ee18Sopenharmony_ci
43e509ee18Sopenharmony_ci    LOGE("Failed to open %{public}s, reason:%{public}sn", libraryName.data(),
44e509ee18Sopenharmony_ci        std::to_string(GetLastError()).c_str());
45e509ee18Sopenharmony_ci    return nullptr;
46e509ee18Sopenharmony_ci}
47e509ee18Sopenharmony_ci
48e509ee18Sopenharmony_civoid* ResolveSymbol(void* handle, std::string_view symbol)
49e509ee18Sopenharmony_ci{
50e509ee18Sopenharmony_ci    HMODULE module = reinterpret_cast<HMODULE>(handle);
51e509ee18Sopenharmony_ci    void* addr = reinterpret_cast<void*>(GetProcAddress(module, symbol.data()));
52e509ee18Sopenharmony_ci    if (addr != nullptr) {
53e509ee18Sopenharmony_ci        return addr;
54e509ee18Sopenharmony_ci    }
55e509ee18Sopenharmony_ci    LOGE("Failed to get symbol:%{public}s, reason:%{public}s", symbol.data(),
56e509ee18Sopenharmony_ci        std::to_string(GetLastError()).c_str());
57e509ee18Sopenharmony_ci    return nullptr;
58e509ee18Sopenharmony_ci}
59e509ee18Sopenharmony_ci
60e509ee18Sopenharmony_civoid CloseHandle(void* handle)
61e509ee18Sopenharmony_ci{
62e509ee18Sopenharmony_ci    if (handle != nullptr) {
63e509ee18Sopenharmony_ci        FreeLibrary(reinterpret_cast<HMODULE>(handle));
64e509ee18Sopenharmony_ci    }
65e509ee18Sopenharmony_ci}
66e509ee18Sopenharmony_ci#else // UNIX_PLATFORM
67e509ee18Sopenharmony_civoid* Load(std::string_view libraryName)
68e509ee18Sopenharmony_ci{
69e509ee18Sopenharmony_ci    void* handle = dlopen(libraryName.data(), RTLD_LAZY);
70e509ee18Sopenharmony_ci    if (handle != nullptr) {
71e509ee18Sopenharmony_ci        return handle;
72e509ee18Sopenharmony_ci    }
73e509ee18Sopenharmony_ci    LOGE("Failed to open %{public}s, reason:%{public}sn", libraryName.data(), dlerror());
74e509ee18Sopenharmony_ci    return nullptr;
75e509ee18Sopenharmony_ci}
76e509ee18Sopenharmony_ci
77e509ee18Sopenharmony_civoid* ResolveSymbol(void* handle, std::string_view symbol)
78e509ee18Sopenharmony_ci{
79e509ee18Sopenharmony_ci    void* addr = dlsym(handle, symbol.data());
80e509ee18Sopenharmony_ci    if (addr != nullptr) {
81e509ee18Sopenharmony_ci        return addr;
82e509ee18Sopenharmony_ci    }
83e509ee18Sopenharmony_ci    LOGE("Failed to get symbol:%{public}s, reason:%{public}sn", symbol.data(), dlerror());
84e509ee18Sopenharmony_ci    return nullptr;
85e509ee18Sopenharmony_ci}
86e509ee18Sopenharmony_ci
87e509ee18Sopenharmony_civoid CloseHandle(void* handle)
88e509ee18Sopenharmony_ci{
89e509ee18Sopenharmony_ci    if (handle != nullptr) {
90e509ee18Sopenharmony_ci        dlclose(handle);
91e509ee18Sopenharmony_ci    }
92e509ee18Sopenharmony_ci}
93e509ee18Sopenharmony_ci#endif
94e509ee18Sopenharmony_ci}