Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Musl
提交
8ea3bcda
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看板
提交
8ea3bcda
编写于
3月 29, 2023
作者:
Y
yinchuang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Optimize linker memory by reduce struct size
Issue:I6SL6I Signed-off-by:
N
yinchuang
<
yinchuang@huawei.com
>
上级
c8802e86
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
76 addition
and
28 deletion
+76
-28
porting/linux/user/ldso/dynlink.c
porting/linux/user/ldso/dynlink.c
+47
-2
porting/linux/user/ldso/namespace.h
porting/linux/user/ldso/namespace.h
+7
-6
porting/linux/user/src/internal/dynlink.h
porting/linux/user/src/internal/dynlink.h
+18
-20
porting/linux/user/src/malloc/mallocng/malloc.c
porting/linux/user/src/malloc/mallocng/malloc.c
+4
-0
未找到文件。
porting/linux/user/ldso/dynlink.c
浏览文件 @
8ea3bcda
...
...
@@ -77,6 +77,7 @@ static void error(const char *, ...);
#define PARENTS_BASE_CAPACITY 8
#define RELOC_CAN_SEARCH_DSO_BASE_CAPACITY 32
#define ANON_NAME_MAX_LEN 70
struct
debug
{
int
ver
;
...
...
@@ -174,6 +175,10 @@ static void handle_relro_sharing(struct dso *p, const dl_extinfo *extinfo, ssize
/* asan path open */
int
handle_asan_path_open
(
int
fd
,
const
char
*
name
,
ns_t
*
namespace
,
char
*
buf
,
size_t
buf_size
);
static
void
set_bss_vma_name
(
char
*
path_name
,
void
*
addr
,
size_t
zeromap_size
);
static
void
find_and_set_bss_name
(
struct
dso
*
p
);
/* add namespace function */
static
void
get_sys_path
(
ns_configor
*
conf
);
static
void
dlclose_ns
(
struct
dso
*
p
);
...
...
@@ -1438,9 +1443,11 @@ static void *map_library(int fd, struct dso *dso, struct reserved_address_params
if
(
ph
->
p_memsz
>
ph
->
p_filesz
&&
(
ph
->
p_flags
&
PF_W
))
{
size_t
brk
=
(
size_t
)
base
+
ph
->
p_vaddr
+
ph
->
p_filesz
;
size_t
pgbrk
=
brk
+
PAGE_SIZE
-
1
&
-
PAGE_SIZE
;
size_t
zeromap_size
=
(
size_t
)
base
+
this_max
-
pgbrk
;
memset
((
void
*
)
brk
,
0
,
pgbrk
-
brk
&
PAGE_SIZE
-
1
);
if
(
pgbrk
-
(
size_t
)
base
<
this_max
&&
mmap_fixed
((
void
*
)
pgbrk
,
(
size_t
)
base
+
this_max
-
pgbrk
,
prot
,
MAP_PRIVATE
|
MAP_FIXED
|
MAP_ANONYMOUS
,
-
1
,
0
)
==
MAP_FAILED
)
if
(
pgbrk
-
(
size_t
)
base
<
this_max
&&
mmap_fixed
((
void
*
)
pgbrk
,
zeromap_size
,
prot
,
MAP_PRIVATE
|
MAP_FIXED
|
MAP_ANONYMOUS
,
-
1
,
0
)
==
MAP_FAILED
)
goto
error
;
set_bss_vma_name
(
dso
->
name
,
(
void
*
)
pgbrk
,
zeromap_size
);
}
}
for
(
i
=
0
;
((
size_t
*
)(
base
+
dyn
))[
i
];
i
+=
2
)
...
...
@@ -2797,6 +2804,9 @@ void __dls3(size_t *sp, size_t *auxv)
reclaim_gaps
(
&
app
);
reclaim_gaps
(
&
ldso
);
find_and_set_bss_name
(
&
app
);
find_and_set_bss_name
(
&
ldso
);
/* Load preload/needed libraries, add symbols to global namespace. */
ldso
.
deps
=
(
struct
dso
**
)
no_deps
;
/* Init g_is_asan */
...
...
@@ -4506,10 +4516,11 @@ static bool task_map_library(struct loadtask *task, struct reserved_address_para
if
(
ph
->
p_memsz
>
ph
->
p_filesz
&&
(
ph
->
p_flags
&
PF_W
))
{
size_t
brk
=
(
size_t
)
base
+
ph
->
p_vaddr
+
ph
->
p_filesz
;
size_t
pgbrk
=
brk
+
PAGE_SIZE
-
1
&
-
PAGE_SIZE
;
size_t
zeromap_size
=
(
size_t
)
base
+
this_max
-
pgbrk
;
memset
((
void
*
)
brk
,
0
,
pgbrk
-
brk
&
PAGE_SIZE
-
1
);
if
(
pgbrk
-
(
size_t
)
base
<
this_max
&&
mmap_fixed
(
(
void
*
)
pgbrk
,
(
size_t
)
base
+
this_max
-
pgbrk
,
zeromap_size
,
prot
,
MAP_PRIVATE
|
MAP_FIXED
|
MAP_ANONYMOUS
,
-
1
,
...
...
@@ -4517,6 +4528,7 @@ static bool task_map_library(struct loadtask *task, struct reserved_address_para
LD_LOGE
(
"Error mapping library: mmap fix failed"
);
goto
error
;
}
set_bss_vma_name
(
task
->
p
->
name
,
(
void
*
)
pgbrk
,
zeromap_size
);
}
}
for
(
i
=
0
;
((
size_t
*
)(
base
+
task
->
dyn
))[
i
];
i
+=
NEXT_DYNAMIC_INDEX
)
{
...
...
@@ -5130,3 +5142,36 @@ static void handle_relro_sharing(struct dso *p, const dl_extinfo *extinfo, ssize
}
}
}
static
void
set_bss_vma_name
(
char
*
path_name
,
void
*
addr
,
size_t
zeromap_size
)
{
char
so_bss_name
[
ANON_NAME_MAX_LEN
];
if
(
path_name
==
NULL
)
{
snprintf
(
so_bss_name
,
ANON_NAME_MAX_LEN
,
".bss"
);
}
else
{
char
*
t
=
strrchr
(
path_name
,
'/'
);
if
(
t
)
{
snprintf
(
so_bss_name
,
ANON_NAME_MAX_LEN
,
"%s.bss"
,
++
t
);
}
else
{
snprintf
(
so_bss_name
,
ANON_NAME_MAX_LEN
,
"%s.bss"
,
path_name
);
}
}
prctl
(
PR_SET_VMA
,
PR_SET_VMA_ANON_NAME
,
addr
,
zeromap_size
,
so_bss_name
);
}
static
void
find_and_set_bss_name
(
struct
dso
*
p
)
{
size_t
cnt
;
Phdr
*
ph
=
p
->
phdr
;
for
(
cnt
=
p
->
phnum
;
cnt
--
;
ph
=
(
void
*
)((
char
*
)
ph
+
p
->
phentsize
))
{
if
(
ph
->
p_type
!=
PT_LOAD
)
continue
;
size_t
seg_start
=
p
->
base
+
ph
->
p_vaddr
;
size_t
seg_file_end
=
seg_start
+
ph
->
p_filesz
+
PAGE_SIZE
-
1
&
-
PAGE_SIZE
;
size_t
seg_max_addr
=
seg_start
+
ph
->
p_memsz
+
PAGE_SIZE
-
1
&
-
PAGE_SIZE
;
size_t
zeromap_size
=
seg_max_addr
-
seg_file_end
;
if
(
zeromap_size
>
0
&&
(
ph
->
p_flags
&
PF_W
))
{
set_bss_vma_name
(
p
->
name
,
(
void
*
)
seg_file_end
,
zeromap_size
);
}
}
}
porting/linux/user/ldso/namespace.h
浏览文件 @
8ea3bcda
...
...
@@ -21,14 +21,15 @@ extern "C" {
#endif
#include <stdbool.h>
#include <stdint.h>
#include "strops.h"
#define NS_DEFAULT_NAME "default"
struct
dso
;
/* define dso list */
typedef
struct
_dso_list_
{
size
_t
num
;
size
_t
size
;
uint16
_t
num
;
uint16
_t
size
;
struct
dso
**
dsos
;
}
dsolist
;
/* define namespace struct */
...
...
@@ -49,8 +50,8 @@ typedef struct _namespace_t_ {
}
ns_t
;
/* define namespace list */
typedef
struct
_namespaces_list_
{
size
_t
num
;
size
_t
size
;
uint16
_t
num
;
uint16
_t
size
;
ns_t
**
nss
;
}
nslist
;
/* define namespace inherit */
...
...
@@ -60,8 +61,8 @@ typedef struct _namespace_inherit_ {
}
ns_inherit
;
/* define namespace inherit list */
typedef
struct
_ns_inherit_list_
{
size
_t
num
;
size
_t
size
;
uint16
_t
num
;
uint16
_t
size
;
ns_inherit
**
inherits
;
}
ns_inherit_list
;
...
...
porting/linux/user/src/internal/dynlink.h
浏览文件 @
8ea3bcda
...
...
@@ -86,13 +86,9 @@ struct dso {
struct
dso
*
next
,
*
prev
;
/* add namespace */
ns_t
*
namespace
;
/* mark the dso status */
unsigned
int
flags
;
int
cache_sym_index
;
struct
dso
*
cache_dso
;
Sym
*
cache_sym
;
Phdr
*
phdr
;
int
phnum
;
size_t
phentsize
;
...
...
@@ -110,18 +106,7 @@ struct dso {
dev_t
dev
;
ino_t
ino
;
uint64_t
file_offset
;
char
relocated
;
char
constructed
;
char
kernel_mapped
;
char
mark
;
char
bfs_built
;
char
runtime_loaded
;
char
by_dlopen
;
struct
dso
**
deps
,
*
needed_by
;
size_t
ndeps_direct
;
size_t
next_dep
;
int
ctor_visitor
;
int
nr_dlopen
;
char
*
rpath_orig
,
*
rpath
;
struct
tls_module
tls
;
size_t
tls_id
;
...
...
@@ -141,14 +126,27 @@ struct dso {
size_t
*
got
;
}
*
funcdescs
;
size_t
*
got
;
struct
dso
**
deps
,
*
needed_by
;
uint16_t
ndeps_direct
;
uint16_t
next_dep
;
uint16_t
parents_count
;
uint16_t
parents_capacity
;
struct
dso
**
parents
;
size_t
parents_count
;
size_t
parents_capacity
;
struct
dso
**
reloc_can_search_dso_list
;
uint16_t
reloc_can_search_dso_count
;
uint16_t
reloc_can_search_dso_capacity
;
/* mark the dso status */
uint32_t
flags
;
uint8_t
nr_dlopen
;
bool
is_global
;
bool
is_reloc_head_so_dep
;
struct
dso
**
reloc_can_search_dso_list
;
size_t
reloc_can_search_dso_count
;
size_t
reloc_can_search_dso_capacity
;
char
relocated
;
char
constructed
;
char
kernel_mapped
;
char
mark
;
char
bfs_built
;
char
runtime_loaded
;
char
by_dlopen
;
bool
is_mapped_to_shadow
;
char
buf
[];
};
...
...
porting/linux/user/src/malloc/mallocng/malloc.c
浏览文件 @
8ea3bcda
...
...
@@ -3,6 +3,7 @@
#include <limits.h>
#include <string.h>
#include <sys/mman.h>
#include <sys/prctl.h>
#include <errno.h>
#include "meta.h"
...
...
@@ -125,6 +126,7 @@ struct meta *alloc_meta(void)
if
(
brk
(
new
)
!=
new
)
{
ctx
.
brk
=
-
1
;
}
else
{
prctl
(
PR_SET_VMA
,
PR_SET_VMA_ANON_NAME
,
ctx
.
brk
,
new
-
ctx
.
brk
,
"heap:meta"
);
if
(
need_guard
)
mmap
((
void
*
)
ctx
.
brk
,
pagesize
,
PROT_NONE
,
MAP_ANON
|
MAP_PRIVATE
|
MAP_FIXED
,
-
1
,
0
);
ctx
.
brk
=
new
;
...
...
@@ -313,6 +315,7 @@ static struct meta *alloc_group(int sc, size_t req)
free_meta
(
m
);
return
0
;
}
prctl
(
PR_SET_VMA
,
PR_SET_VMA_ANON_NAME
,
p
,
needed
,
"heap:brk"
);
m
->
maplen
=
needed
>>
12
;
ctx
.
mmap_counter
++
;
active_idx
=
(
4096
-
UNIT
)
/
size
-
1
;
...
...
@@ -373,6 +376,7 @@ void *malloc(size_t n)
MAP_PRIVATE
|
MAP_ANON
,
-
1
,
0
);
if
(
p
==
MAP_FAILED
)
return
0
;
wrlock
();
prctl
(
PR_SET_VMA
,
PR_SET_VMA_ANON_NAME
,
p
,
needed
,
"heap:mmap"
);
step_seq
();
g
=
alloc_meta
();
if
(
!
g
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录