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}