diff --git a/porting/linux/user/ldso/dynlink.c b/porting/linux/user/ldso/dynlink.c index 95516fb09bef50f37f67ecc5a5173562f8723122..99fad6b7afed35c5c005a12852f36eeacc0a893c 100644 --- a/porting/linux/user/ldso/dynlink.c +++ b/porting/linux/user/ldso/dynlink.c @@ -1229,12 +1229,21 @@ static void unmap_library(struct dso *dso) for (i=0; iloadmap->nsegs; i++) { if (!dso->loadmap->segs[i].p_memsz) continue; - munmap((void *)dso->loadmap->segs[i].addr, - dso->loadmap->segs[i].p_memsz); + if (!is_dlclose_debug_enable()) { + munmap((void *)dso->loadmap->segs[i].addr, + dso->loadmap->segs[i].p_memsz); + } else { + (void)mprotect((void *)dso->loadmap->segs[i].addr, + dso->loadmap->segs[i].p_memsz, PROT_NONE); + } } internal_free(dso->loadmap); } else if (dso->map && dso->map_len) { - munmap(dso->map, dso->map_len); + if (!is_dlclose_debug_enable()) { + munmap(dso->map, dso->map_len); + } else { + mprotect(dso->map, dso->map_len, PROT_NONE); + } } } diff --git a/porting/linux/user/ldso/ld_log.c b/porting/linux/user/ldso/ld_log.c index bd1c54929738c542a0a94533208275567d3befe5..26d9d93461a61d157339b61fd971915afe08d3f0 100644 --- a/porting/linux/user/ldso/ld_log.c +++ b/porting/linux/user/ldso/ld_log.c @@ -16,6 +16,7 @@ #include "ld_log.h" static bool ld_log_enable = false; +static bool ld_dlclose_debug = false; #ifdef OHOS_ENABLE_PARAMETER #include @@ -73,11 +74,21 @@ static bool get_ld_log_value() } return (get_bool_sysparam(app_param_handle) || get_bool_sysparam(all_param_handle)); } + +static bool get_ld_debug_dlclose_value() +{ + static CachedHandle param_handle = NULL; + if (param_handle == NULL) { + param_handle = CachedParameterCreate("musl.ld.debug.dlclose", "false"); + } + return get_bool_sysparam(param_handle); +} #endif void ld_log_reset() { #if (defined(OHOS_ENABLE_PARAMETER)) + ld_dlclose_debug = get_ld_debug_dlclose_value(); if (!is_musl_log_enable()) { ld_log_enable = false; return; @@ -92,3 +103,8 @@ bool get_ld_log_enable() { return ld_log_enable; } + +bool is_dlclose_debug_enable() +{ + return ld_dlclose_debug; +} diff --git a/porting/linux/user/ldso/ld_log.h b/porting/linux/user/ldso/ld_log.h index 9c51975cde25026f95e772f62fa21226cfe8ecf1..697a01a008459ba9951bb73ae1571a4656b1eff0 100644 --- a/porting/linux/user/ldso/ld_log.h +++ b/porting/linux/user/ldso/ld_log.h @@ -34,6 +34,8 @@ extern "C" { hidden bool get_ld_log_enable(); hidden void ld_log_reset(); +hidden bool is_dlclose_debug_enable(); + #if ((LD_LOG_LEVEL & LD_LOG_ERROR) && (defined(OHOS_ENABLE_PARAMETER) || defined(ENABLE_MUSL_LOG))) #define LD_LOGE(...) if (get_ld_log_enable()) { \ (void)HiLogAdapterPrint(MUSL_LOG_TYPE, LOG_ERROR, MUSL_LOG_DOMAIN, LD_LOG_TAG, __VA_ARGS__); \