10826e83eSopenharmony_ci/* 20826e83eSopenharmony_ci * Copyright (c) 2024 Huawei Device Co., Ltd. 30826e83eSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 40826e83eSopenharmony_ci * you may not use this file except in compliance with the License. 50826e83eSopenharmony_ci * You may obtain a copy of the License at 60826e83eSopenharmony_ci * 70826e83eSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 80826e83eSopenharmony_ci * 90826e83eSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 100826e83eSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 110826e83eSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 120826e83eSopenharmony_ci * See the License for the specific language governing permissions and 130826e83eSopenharmony_ci * limitations under the License. 140826e83eSopenharmony_ci */ 150826e83eSopenharmony_ci 160826e83eSopenharmony_ci#include <dlfcn.h> 170826e83eSopenharmony_ci#include <string> 180826e83eSopenharmony_ci 190826e83eSopenharmony_ci#include "nweb_log.h" 200826e83eSopenharmony_ci 210826e83eSopenharmony_cinamespace { 220826e83eSopenharmony_ci#if defined(webview_arm64) 230826e83eSopenharmony_ciconst std::string CRASHPAD_HANDLER_PATH = "/data/storage/el1/bundle/nweb/libs/arm64"; 240826e83eSopenharmony_ci#elif defined(webview_x86_64) 250826e83eSopenharmony_ciconst std::string CRASHPAD_HANDLER_PATH = "/data/storage/el1/bundle/nweb/libs/x86_64"; 260826e83eSopenharmony_ci#elif defined(webview_arm) 270826e83eSopenharmony_ciconst std::string CRASHPAD_HANDLER_PATH = "/data/storage/el1/bundle/nweb/libs/arm"; 280826e83eSopenharmony_ci#else 290826e83eSopenharmony_ciconst std::string CRASHPAD_HANDLER_PATH = "unsupport"; 300826e83eSopenharmony_ci#endif 310826e83eSopenharmony_ci 320826e83eSopenharmony_ciconst std::string LIB_CRASHPAD_HANDLER = "libchrome_crashpad_handler.so"; 330826e83eSopenharmony_ci} 340826e83eSopenharmony_ci 350826e83eSopenharmony_ciint main(int argc, char* argv[]) 360826e83eSopenharmony_ci{ 370826e83eSopenharmony_ci const std::string libCrashpadHandler = std::string(WEBVIEW_SANDBOX_LIB_PATH) + "/" 380826e83eSopenharmony_ci + std::string(WEBVIEW_CRASHPAD_HANDLER_SO); 390826e83eSopenharmony_ci void *handle = dlopen(libCrashpadHandler.c_str(), RTLD_NOW | RTLD_GLOBAL); 400826e83eSopenharmony_ci if (handle == nullptr) { 410826e83eSopenharmony_ci const std::string libCrashpadHandler2 = CRASHPAD_HANDLER_PATH + "/" + LIB_CRASHPAD_HANDLER; 420826e83eSopenharmony_ci handle = dlopen(libCrashpadHandler2.c_str(), RTLD_NOW | RTLD_GLOBAL); 430826e83eSopenharmony_ci if (handle == nullptr) { 440826e83eSopenharmony_ci WVLOG_E("crashpad, fail to dlopen %{public}s, errmsg=%{public}s", libCrashpadHandler2.c_str(), dlerror()); 450826e83eSopenharmony_ci return -1; 460826e83eSopenharmony_ci } 470826e83eSopenharmony_ci } 480826e83eSopenharmony_ci 490826e83eSopenharmony_ci using FuncType = int (*)(int argc, char* argv[]); 500826e83eSopenharmony_ci FuncType crashpadHandlerFunc = reinterpret_cast<FuncType>(dlsym(handle, "CrashpadHandlerMain")); 510826e83eSopenharmony_ci if (crashpadHandlerFunc == nullptr) { 520826e83eSopenharmony_ci WVLOG_E("crashpad, fail to dlsym CrashpadHandlerMain, errmsg=%{public}s", dlerror()); 530826e83eSopenharmony_ci int ret = dlclose(handle); 540826e83eSopenharmony_ci if (ret != 0) { 550826e83eSopenharmony_ci WVLOG_E("crashped, fail to dlclose, errmsg=%{public}s", dlerror()); 560826e83eSopenharmony_ci } 570826e83eSopenharmony_ci return -1; 580826e83eSopenharmony_ci } 590826e83eSopenharmony_ci 600826e83eSopenharmony_ci WVLOG_I("crashpad, success to dlopen and dlsym, enter CrashpadHandlerMain"); 610826e83eSopenharmony_ci return crashpadHandlerFunc(argc, argv); 620826e83eSopenharmony_ci} 63