From afd3a3b70d5357badd182525d1feddd03ec46b26 Mon Sep 17 00:00:00 2001 From: openharmony_ci <120357966@qq.com> Date: Tue, 7 Feb 2023 02:02:23 +0000 Subject: [PATCH] =?UTF-8?q?=E5=9B=9E=E9=80=80=20'Pull=20Request=20!789=20:?= =?UTF-8?q?=20hook=20upload'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- musl_template.gni | 7 ---- porting/linux/user/src/hook/malloc_common.c | 40 +++++-------------- porting/linux/user/src/hook/musl_malloc.h | 11 +---- porting/linux/user/src/hook/musl_preinit.c | 4 +- .../linux/user/src/hook/musl_preinit_common.c | 4 +- porting/linux/user/src/malloc/malloc.c | 13 ++++-- 6 files changed, 26 insertions(+), 53 deletions(-) diff --git a/musl_template.gni b/musl_template.gni index 41863ae0..0c34ffdc 100644 --- a/musl_template.gni +++ b/musl_template.gni @@ -730,13 +730,6 @@ template("musl_libs") { "//build/config/compiler:compiler", ":soft_hook", ] - - cflags = [ - "-mllvm", - "--instcombine-max-iterations=0", - "-ffp-contract=fast", - "-O3", - ] } source_set("soft_musl_jemalloc") { diff --git a/porting/linux/user/src/hook/malloc_common.c b/porting/linux/user/src/hook/malloc_common.c index 39fb2215..9107075d 100644 --- a/porting/linux/user/src/hook/malloc_common.c +++ b/porting/linux/user/src/hook/malloc_common.c @@ -9,44 +9,26 @@ void* malloc(size_t bytes) { - struct MallocDispatchType* dispatch_table = (struct MallocDispatchType *)atomic_load_explicit( - &__musl_libc_globals.current_dispatch_table, memory_order_acquire); + volatile const struct MallocDispatchType* dispatch_table = get_current_dispatch_table(); if (__predict_false(dispatch_table != NULL)) { - if (__get_memleak_hook_flag()) { - return dispatch_table->malloc(bytes); - } - if (!__get_global_hook_flag()) { - return MuslFunc(malloc)(bytes); - } - if (!__get_hook_flag()) { - return MuslFunc(malloc)(bytes); - } - return dispatch_table->malloc(bytes); + void*ret = dispatch_table->malloc(bytes); + return ret; + } + void* result = MuslMalloc(malloc)(bytes); + if (__predict_false(result == NULL)) { + //__musl_log(__MUSL_LOG_WARN, "malloc(%zu) failed: returning null pointer\n", bytes); } - return MuslFunc(malloc)(bytes); + return result; } void free(void* mem) { - struct MallocDispatchType* dispatch_table = (struct MallocDispatchType *)atomic_load_explicit( - &__musl_libc_globals.current_dispatch_table, memory_order_acquire); + volatile const struct MallocDispatchType* dispatch_table = get_current_dispatch_table(); if (__predict_false(dispatch_table != NULL)) { - if (__get_memleak_hook_flag()) { - dispatch_table->free(mem); - return; - } - if (!__get_global_hook_flag()) { - MuslFunc(free)(mem); - return; - } - if (!__get_hook_flag()) { - MuslFunc(free)(mem); - return; - } dispatch_table->free(mem); - return; + } else { + MuslMalloc(free)(mem); } - MuslFunc(free)(mem); } void* mmap(void* addr, size_t length, int prot, int flags, int fd, off_t offset) diff --git a/porting/linux/user/src/hook/musl_malloc.h b/porting/linux/user/src/hook/musl_malloc.h index 8320ae00..9bcc1de5 100644 --- a/porting/linux/user/src/hook/musl_malloc.h +++ b/porting/linux/user/src/hook/musl_malloc.h @@ -13,19 +13,12 @@ extern "C" { #define MuslMalloc(func) func #endif -#ifdef USE_JEMALLOC -#define MuslFunc(func) je_ ## func -#else -#define MuslFunc(func) internal_ ## func -#endif - -extern void *internal_malloc(size_t); -extern void internal_free(void*); - void *__libc_mmap(void*, size_t, int, int, int, off_t); int __libc_munmap(void*, size_t); +void *__libc_malloc(size_t); void *__libc_calloc(size_t, size_t); void *__libc_realloc(void *, size_t); +void __libc_free(void *); void *__libc_valloc(size_t); void *__libc_memalign(size_t, size_t); size_t __libc_malloc_usable_size(void *); diff --git a/porting/linux/user/src/hook/musl_preinit.c b/porting/linux/user/src/hook/musl_preinit.c index 46f93967..66a668c6 100644 --- a/porting/linux/user/src/hook/musl_preinit.c +++ b/porting/linux/user/src/hook/musl_preinit.c @@ -40,7 +40,7 @@ void* ohos_malloc_hook_init_function(size_t bytes); static struct MallocDispatchType __ohos_malloc_hook_init_dispatch = { .malloc = ohos_malloc_hook_init_function, - .free = MuslFunc(free), + .free = MuslMalloc(free), .mmap = MuslMalloc(mmap), .munmap = MuslMalloc(munmap), .calloc = MuslMalloc(calloc), @@ -459,7 +459,7 @@ void* ohos_malloc_hook_init_function(size_t bytes) // __musl_log(__MUSL_LOG_ERROR, "%s: ohos_malloc_hook: failed to pthread_detach\n", getprogname()); } } - void*ptr = MuslFunc(malloc)(bytes); + void*ptr = MuslMalloc(malloc)(bytes); return ptr; } diff --git a/porting/linux/user/src/hook/musl_preinit_common.c b/porting/linux/user/src/hook/musl_preinit_common.c index 00ad18f3..936c51d8 100644 --- a/porting/linux/user/src/hook/musl_preinit_common.c +++ b/porting/linux/user/src/hook/musl_preinit_common.c @@ -8,8 +8,8 @@ struct musl_libc_globals __musl_libc_globals; struct MallocDispatchType __libc_malloc_default_dispatch = { - .malloc = MuslFunc(malloc), - .free = MuslFunc(free), + .malloc = MuslMalloc(malloc), + .free = MuslMalloc(free), .mmap = MuslMalloc(mmap), .munmap = MuslMalloc(munmap), .calloc = MuslMalloc(calloc), diff --git a/porting/linux/user/src/malloc/malloc.c b/porting/linux/user/src/malloc/malloc.c index b357628f..63cd4c12 100644 --- a/porting/linux/user/src/malloc/malloc.c +++ b/porting/linux/user/src/malloc/malloc.c @@ -30,6 +30,11 @@ extern int je_mallopt(int param, int value); #define inline inline __attribute__((always_inline)) #endif +#ifdef HOOK_ENABLE +void *__libc_malloc(size_t); +void __libc_free(void *p); +#endif + static struct { volatile uint64_t binmap; struct bin bins[BINS_COUNT]; @@ -623,16 +628,16 @@ static void trim(struct chunk *self, size_t n) } #ifdef HOOK_ENABLE - +void *__libc_malloc(size_t n) #else void *malloc(size_t n) +#endif { #ifdef USE_JEMALLOC return je_malloc(n); #endif return internal_malloc(n); } -#endif void *internal_malloc(size_t n) { @@ -1240,16 +1245,16 @@ static void quarantine_bin(struct chunk *self) #endif #ifdef HOOK_ENABLE - +void __libc_free(void *p) #else void free(void *p) +#endif { #ifdef USE_JEMALLOC return je_free(p); #endif return internal_free(p); } -#endif void internal_free(void *p) { -- GitLab