From b47e84464758c3af10a99fa544057c2ba3a454af Mon Sep 17 00:00:00 2001 From: yh Date: Tue, 19 Nov 2024 16:49:10 +0800 Subject: [PATCH] add dlopen Signed-off-by: yh Change-Id: Ie2a01076f047c71519761bbf425f9daf207d647a --- appspawn_systemLib.json | 4 ++++ etc/BUILD.gn | 7 ++++++ modules/ace_adapter/ace_adapter.cpp | 35 +++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+) create mode 100644 appspawn_systemLib.json diff --git a/appspawn_systemLib.json b/appspawn_systemLib.json new file mode 100644 index 00000000..05e42a8f --- /dev/null +++ b/appspawn_systemLib.json @@ -0,0 +1,4 @@ +{ + "systemLib" : [ + ] +} diff --git a/etc/BUILD.gn b/etc/BUILD.gn index 512c2133..501ff37f 100644 --- a/etc/BUILD.gn +++ b/etc/BUILD.gn @@ -66,11 +66,18 @@ ohos_prebuilt_etc("appspawn_preload.json") { module_install_dir = "etc/appspawn" } +ohos_prebuilt_etc("appspawn_systemLib.json") { + source = "../appspawn_systemLib.json" + part_name = "${part_name}" + module_install_dir = "etc/appspawn" +} + group("etc_files") { deps = [ ":appdata-sandbox-isolated.json", ":appdata-sandbox.json", ":appspawn_preload.json", + ":appspawn_systemLib.json", ] if (defined(appspawn_sandbox_new) && appspawn_sandbox_new) { deps += [ ":appdata-sandbox-nweb.json" ] diff --git a/modules/ace_adapter/ace_adapter.cpp b/modules/ace_adapter/ace_adapter.cpp index 08286378..559814e9 100644 --- a/modules/ace_adapter/ace_adapter.cpp +++ b/modules/ace_adapter/ace_adapter.cpp @@ -43,6 +43,7 @@ using namespace OHOS::AppSpawn; using namespace OHOS::Global; +#define SYSTEMLIB_JSON "/appspawn_systemLib.json" #ifdef ASAN_DETECTOR static const bool DEFAULT_PRELOAD_VALUE = false; #else @@ -266,8 +267,42 @@ static int PreLoadAppSpawn(AppSpawnMgr *content) return 0; } +APPSPAWN_STATIC int DoDlopenLibs(const cJSON *root, ParseJsonContext *context) +{ + cJSON *systemLibs = cJSON_GetObjectItemCaseSensitive(root, "systemLib"); + if (systemLibs == nullptr) { + return 0; + } + + uint32_t libsCount = (uint32_t)cJSON_GetArraySize(systemLibs); + for (uint32_t i = 0; i < libsCount; ++i) { + const char *libName = cJSON_GetStringValue(cJSON_GetArrayItem(systemLibs, i)); + char reaLibPath[PATH_MAX] = {0}; + if (libName == nullptr || realpath(libName, reaLibPath) == nullptr) { + continue; + } + APPSPAWN_LOGV("reaLibPath %{public}s", reaLibPath); + void *lib = dlopen(reaLibPath, RTLD_LAZY); + if (lib == nullptr) { + APPSPAWN_LOGE("FAILED to dlopen %{public}s %{public}s", libName, dlerror()); + } + } + return 0; +} + +APPSPAWN_STATIC int DlopenAppSpawn(AppSpawnMgr *content) +{ + if (!IsAppSpawnMode(content)) { + return 0; + } + + (void)ParseJsonConfig("etc/appspawn", SYSTEMLIB_JSON, DoDlopenLibs, nullptr); + return 0; +} + MODULE_CONSTRUCTOR(void) { APPSPAWN_LOGV("Load ace module ..."); AddPreloadHook(HOOK_PRIO_HIGHEST, PreLoadAppSpawn); + AddPreloadHook(HOOK_PRIO_HIGHEST, DlopenAppSpawn); } -- Gitee