Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Musl
提交
daae01b0
T
Third Party Musl
项目概览
OpenHarmony
/
Third Party Musl
接近 2 年 前同步成功
通知
37
Star
125
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
Third Party Musl
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
daae01b0
编写于
6月 28, 2022
作者:
O
openharmony_ci
提交者:
Gitee
6月 28, 2022
浏览文件
操作
浏览文件
下载
差异文件
!354 增加 mmap hook 的能力
Merge pull request !354 from shuxinyiA/master
上级
202a730e
01ca53e9
变更
11
隐藏空白更改
内联
并排
Showing
11 changed file
with
106 addition
and
1 deletion
+106
-1
musl_src.gni
musl_src.gni
+1
-0
musl_template.gni
musl_template.gni
+1
-0
porting/linux/user/src/hook/malloc_common.c
porting/linux/user/src/hook/malloc_common.c
+20
-0
porting/linux/user/src/hook/memory_tag.c
porting/linux/user/src/hook/memory_tag.c
+3
-0
porting/linux/user/src/hook/memory_tag.h
porting/linux/user/src/hook/memory_tag.h
+14
-0
porting/linux/user/src/hook/musl_malloc.h
porting/linux/user/src/hook/musl_malloc.h
+2
-0
porting/linux/user/src/hook/musl_malloc_dispatch.h
porting/linux/user/src/hook/musl_malloc_dispatch.h
+4
-0
porting/linux/user/src/hook/musl_preinit.c
porting/linux/user/src/hook/musl_preinit.c
+46
-0
porting/linux/user/src/hook/musl_preinit_common.c
porting/linux/user/src/hook/musl_preinit_common.c
+2
-0
src/mman/mmap.c
src/mman/mmap.c
+8
-1
src/mman/munmap.c
src/mman/munmap.c
+5
-0
未找到文件。
musl_src.gni
浏览文件 @
daae01b0
...
...
@@ -1942,6 +1942,7 @@ musl_src_porting_file = [
]
musl_inc_hook_files = [
"porting/linux/user/src/hook/memory_tag.h",
"porting/linux/user/src/hook/musl_malloc_dispatch_table.h",
"porting/linux/user/src/hook/musl_malloc_dispatch.h",
"porting/linux/user/src/hook/musl_preinit_common.h",
...
...
musl_template.gni
浏览文件 @
daae01b0
...
...
@@ -370,6 +370,7 @@ template("musl_libs") {
source_set("${abi_prefix}_musl_hook") {
sources = [
"./porting/linux/user/src/hook/malloc_common.c",
"./porting/linux/user/src/hook/memory_tag.c",
"./porting/linux/user/src/hook/musl_preinit.c",
"./porting/linux/user/src/hook/musl_preinit_common.c",
]
...
...
porting/linux/user/src/hook/malloc_common.c
浏览文件 @
daae01b0
...
...
@@ -30,4 +30,24 @@ void free(void* mem)
MuslMalloc
(
free
)(
mem
);
}
}
void
*
mmap
(
void
*
addr
,
size_t
length
,
int
prot
,
int
flags
,
int
fd
,
off_t
offset
)
{
volatile
const
struct
MallocDispatchType
*
dispatch_table
=
get_current_dispatch_table
();
if
(
__predict_false
(
dispatch_table
!=
NULL
))
{
return
dispatch_table
->
mmap
(
addr
,
length
,
prot
,
flags
,
fd
,
offset
);
}
else
{
return
MuslMalloc
(
mmap
)(
addr
,
length
,
prot
,
flags
,
fd
,
offset
);
}
}
int
munmap
(
void
*
addr
,
size_t
length
)
{
volatile
const
struct
MallocDispatchType
*
dispatch_table
=
get_current_dispatch_table
();
if
(
__predict_false
(
dispatch_table
!=
NULL
))
{
return
dispatch_table
->
munmap
(
addr
,
length
);
}
else
{
return
MuslMalloc
(
munmap
)(
addr
,
length
);
}
}
#endif
porting/linux/user/src/hook/memory_tag.c
0 → 100644
浏览文件 @
daae01b0
#include "memory_tag.h"
mtypeset
__mem_typeset
=
NULL
;
\ No newline at end of file
porting/linux/user/src/hook/memory_tag.h
0 → 100644
浏览文件 @
daae01b0
#ifndef _MEMORY_TAG_H
#define _MEMORY_TAG_H
#include <unistd.h>
typedef
int
(
*
mtypeset
)(
const
void
*
addr
,
size_t
addrlen
,
const
char
*
tag
,
size_t
tagLen
);
extern
mtypeset
__mem_typeset
;
#define MEM_TYPESET(addr, addrlen, tag, tagLen) \
do { \
if (__mem_typeset != NULL) { \
__mem_typeset(addr, addrlen, tag, tagLen); \
} \
} while (0)
#endif
\ No newline at end of file
porting/linux/user/src/hook/musl_malloc.h
浏览文件 @
daae01b0
...
...
@@ -11,6 +11,8 @@ extern "C" {
#define MuslMalloc(func) func
#endif
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
);
...
...
porting/linux/user/src/hook/musl_malloc_dispatch.h
浏览文件 @
daae01b0
...
...
@@ -9,6 +9,8 @@
#ifdef __cplusplus
extern
"C"
{
#endif
typedef
void
*
(
*
MallocMmapType
)
(
void
*
,
size_t
,
int
,
int
,
int
,
off_t
);
typedef
int
(
*
MallocMunmapType
)
(
void
*
,
size_t
);
typedef
void
*
(
*
MallocMallocType
)(
size_t
);
typedef
void
*
(
*
MallocReallocType
)(
void
*
,
size_t
);
typedef
void
*
(
*
MallocCallocType
)(
size_t
,
size_t
);
...
...
@@ -20,6 +22,8 @@ typedef bool (*GetHookFlagType)();
typedef
bool
(
*
SetHookFlagType
)(
bool
);
struct
MallocDispatchType
{
MallocMmapType
mmap
;
MallocMunmapType
munmap
;
MallocMallocType
malloc
;
MallocCallocType
calloc
;
MallocReallocType
realloc
;
...
...
porting/linux/user/src/hook/musl_preinit.c
浏览文件 @
daae01b0
...
...
@@ -19,6 +19,7 @@ which need be escaped.
#include <signal.h>
#include "musl_malloc_dispatch_table.h"
#include "musl_malloc.h"
#include "memory_tag.h"
#include "musl_preinit_common.h"
#include <pthread.h>
#include <stdlib.h>
...
...
@@ -35,6 +36,8 @@ void* ohos_malloc_hook_init_function(size_t bytes);
static
struct
MallocDispatchType
__ohos_malloc_hook_init_dispatch
=
{
.
malloc
=
ohos_malloc_hook_init_function
,
.
free
=
MuslMalloc
(
free
),
.
mmap
=
MuslMalloc
(
mmap
),
.
munmap
=
MuslMalloc
(
munmap
),
};
#define MAX_SYM_NAME_SIZE 1000
static
char
*
__malloc_hook_shared_lib
=
"libnative_hook.z.so"
;
...
...
@@ -152,6 +155,40 @@ static bool init_free_function(void* malloc_shared_library_handler, MallocFreeTy
return
true
;
}
static
bool
init_mmap_function
(
void
*
malloc_shared_library_handler
,
MallocMmapType
*
func
,
const
char
*
prefix
)
{
char
symbol
[
MAX_SYM_NAME_SIZE
];
snprintf
(
symbol
,
sizeof
(
symbol
),
"%s_%s"
,
prefix
,
"mmap"
);
*
func
=
(
MallocMmapType
)(
dlsym
(
malloc_shared_library_handler
,
symbol
));
if
(
*
func
==
NULL
)
{
return
false
;
}
return
true
;
}
static
bool
init_munmap_function
(
void
*
malloc_shared_library_handler
,
MallocMunmapType
*
func
,
const
char
*
prefix
)
{
char
symbol
[
MAX_SYM_NAME_SIZE
];
snprintf
(
symbol
,
sizeof
(
symbol
),
"%s_%s"
,
prefix
,
"munmap"
);
*
func
=
(
MallocMunmapType
)(
dlsym
(
malloc_shared_library_handler
,
symbol
));
if
(
*
func
==
NULL
)
{
return
false
;
}
return
true
;
}
static
bool
init_memorytag_function
(
void
*
malloc_shared_library_handler
,
const
char
*
prefix
)
{
char
symbol
[
MAX_SYM_NAME_SIZE
];
snprintf
(
symbol
,
sizeof
(
symbol
),
"%s_%s"
,
prefix
,
"memtag"
);
__mem_typeset
=
(
mtypeset
)(
dlsym
(
malloc_shared_library_handler
,
symbol
));
if
(
__mem_typeset
==
NULL
)
{
return
false
;
}
return
true
;
}
static
bool
init_hook_functions
(
void
*
shared_library_handler
,
struct
MallocDispatchType
*
table
,
const
char
*
prefix
)
{
if
(
!
init_malloc_function
(
shared_library_handler
,
&
table
->
malloc
,
prefix
))
{
...
...
@@ -160,6 +197,15 @@ static bool init_hook_functions(void* shared_library_handler, struct MallocDispa
if
(
!
init_free_function
(
shared_library_handler
,
&
table
->
free
,
prefix
))
{
return
false
;
}
if
(
!
init_mmap_function
(
shared_library_handler
,
&
table
->
mmap
,
prefix
))
{
return
false
;
}
if
(
!
init_munmap_function
(
shared_library_handler
,
&
table
->
munmap
,
prefix
))
{
return
false
;
}
if
(
!
init_memorytag_function
(
shared_library_handler
,
prefix
))
{
return
false
;
}
return
true
;
}
...
...
porting/linux/user/src/hook/musl_preinit_common.c
浏览文件 @
daae01b0
...
...
@@ -10,6 +10,8 @@ struct musl_libc_globals __musl_libc_globals;
struct
MallocDispatchType
__libc_malloc_default_dispatch
=
{
.
malloc
=
MuslMalloc
(
malloc
),
.
free
=
MuslMalloc
(
free
),
.
mmap
=
MuslMalloc
(
mmap
),
.
munmap
=
MuslMalloc
(
munmap
),
};
volatile
atomic_bool
__hook_enable_hook_flag
;
...
...
src/mman/mmap.c
浏览文件 @
daae01b0
...
...
@@ -40,6 +40,13 @@ void *__mmap(void *start, size_t len, int prot, int flags, int fd, off_t off)
return
(
void
*
)
__syscall_ret
(
ret
);
}
weak_alias
(
__mmap
,
mmap
);
#ifdef HOOK_ENABLE
void
*
__libc_mmap
(
void
*
,
size_t
,
int
,
int
,
int
,
off_t
);
weak_alias
(
__mmap
,
__libc_mmap
);
weak_alias
(
__libc_mmap
,
mmap64
);
#else
weak_alias
(
__mmap
,
mmap
);
weak_alias
(
mmap
,
mmap64
);
#endif // HOOK_ENABLE
src/mman/munmap.c
浏览文件 @
daae01b0
...
...
@@ -10,4 +10,9 @@ int __munmap(void *start, size_t len)
return
syscall
(
SYS_munmap
,
start
,
len
);
}
#ifdef HOOK_ENABLE
int
__libc_munmap
(
void
*
,
size_t
);
weak_alias
(
__munmap
,
__libc_munmap
);
#else
weak_alias
(
__munmap
,
munmap
);
#endif
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录