Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Musl
提交
da950515
T
Third Party Musl
项目概览
OpenHarmony
/
Third Party Musl
1 年多 前同步成功
通知
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看板
未验证
提交
da950515
编写于
12月 19, 2022
作者:
O
openharmony_ci
提交者:
Gitee
12月 19, 2022
浏览文件
操作
浏览文件
下载
差异文件
!748 Optimize dlopen performance by reducing search so range(pick 747)
Merge pull request !748 from yinchuang/cherry-pick-1671154249
上级
293eb68c
bb2f9edf
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
70 addition
and
9 deletion
+70
-9
porting/linux/user/ldso/dynlink.c
porting/linux/user/ldso/dynlink.c
+70
-9
未找到文件。
porting/linux/user/ldso/dynlink.c
浏览文件 @
da950515
...
...
@@ -172,6 +172,8 @@ struct dso {
struct
dso
**
parents
;
size_t
parents_count
;
size_t
parents_capacity
;
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
;
...
...
@@ -766,14 +768,48 @@ static void free_reloc_can_search_dso(struct dso *p)
}
}
static
void
add_can_search_so_list_in_dso
(
struct
dso
*
dso
,
struct
dso
*
start_check_dso
)
{
struct
dso
*
check_dso
=
start_check_dso
;
while
(
check_dso
)
{
if
(
dso
->
namespace
&&
check_sym_accessible
(
check_dso
,
dso
->
namespace
))
{
add_reloc_can_search_dso
(
dso
,
check_dso
);
static
char
*
reloc_white_list
[]
=
{
"/usr/lib/libace_lite.so"
,
"/usr/lib/libsec_shared.so"
,
"/usr/lib/libisp.so"
,
"/usr/lib/lib_hiae.so"
,
"/usr/lib/lib_hiawb.so"
,
"/usr/lib/libmedia_hal_common.so"
,
"/usr/lib/libhi_osal.so"
,
"/usr/lib/libmpi.so"
};
/* The list of so that can be accessed during relocation include:
* - The is_global flag of the so is true which means accessible by default.
* Global so includes exe, ld preload so and ldso.
* - We only check whether ns is accessible for the so if is_reloc_head_so_dep is true.
*
* How to set is_reloc_head_so_dep:
* When dlopen A, we set is_reloc_head_so_dep to true for
* all direct and indirect dependent sos of A, including A itself. */
static
void
add_can_search_so_list_in_dso
(
struct
dso
*
dso_relocating
,
struct
dso
*
start_check_dso
)
{
struct
dso
*
p
=
start_check_dso
;
for
(;
p
;
p
=
p
->
syms_next
)
{
if
(
p
->
is_global
)
{
add_reloc_can_search_dso
(
dso_relocating
,
p
);
continue
;
}
if
(
p
->
is_reloc_head_so_dep
)
{
if
(
dso_relocating
->
namespace
&&
check_sym_accessible
(
p
,
dso_relocating
->
namespace
))
{
add_reloc_can_search_dso
(
dso_relocating
,
p
);
continue
;
}
}
for
(
size_t
i
=
0
;
i
<
sizeof
(
reloc_white_list
)
/
sizeof
(
char
*
);
i
++
)
{
if
(
strcmp
(
reloc_white_list
[
i
],
p
->
name
)
==
0
)
{
add_reloc_can_search_dso
(
dso_relocating
,
p
);
break
;
}
}
check_dso
=
check_dso
->
syms_next
;
}
return
;
}
...
...
@@ -2227,7 +2263,9 @@ static void reloc_all(struct dso *p, const dl_extinfo *extinfo)
size_t
dyn
[
DYN_CNT
];
for
(;
p
;
p
=
p
->
next
)
{
if
(
p
->
relocated
)
continue
;
if
(
p
!=
&
ldso
)
{
add_can_search_so_list_in_dso
(
p
,
head
);
}
decode_vec
(
p
->
dynv
,
dyn
,
DYN_CNT
);
if
(
NEED_MIPS_GOT_RELOCS
)
do_mips_relocs
(
p
,
laddr
(
p
,
dyn
[
DT_PLTGOT
]));
...
...
@@ -2534,6 +2572,7 @@ hidden void __dls2(unsigned char *base, size_t *sp)
ldso
.
phnum
=
ehdr
->
e_phnum
;
ldso
.
phdr
=
laddr
(
&
ldso
,
ehdr
->
e_phoff
);
ldso
.
phentsize
=
ehdr
->
e_phentsize
;
ldso
.
is_global
=
true
;
kernel_mapped_dso
(
&
ldso
);
decode_dyn
(
&
ldso
);
...
...
@@ -2751,6 +2790,7 @@ void __dls3(size_t *sp, size_t *auxv)
}
argv
[
-
3
]
=
(
void
*
)
app
.
loadmap
;
}
app
.
is_global
=
true
;
/* Initial dso chain consists only of the app. */
head
=
tail
=
syms_tail
=
&
app
;
...
...
@@ -2780,6 +2820,9 @@ void __dls3(size_t *sp, size_t *auxv)
if
(
env_preload
)
{
load_preload
(
env_preload
,
get_default_ns
(),
tasks
);
}
for
(
struct
dso
*
q
=
head
;
q
;
q
=
q
->
next
)
{
q
->
is_global
=
true
;
}
preload_deps
(
&
app
,
tasks
);
unmap_preloaded_sections
(
tasks
);
shuffle_loadtasks
(
tasks
);
...
...
@@ -2788,11 +2831,17 @@ void __dls3(size_t *sp, size_t *auxv)
assign_tls
(
app
.
next
);
#else
if
(
env_preload
)
load_preload
(
env_preload
,
get_default_ns
());
for
(
struct
dso
*
q
=
head
;
q
;
q
=
q
->
next
)
{
q
->
is_global
=
true
;
}
load_deps
(
&
app
,
NULL
);
#endif
for
(
struct
dso
*
p
=
head
;
p
;
p
=
p
->
next
)
/* Set is_reloc_head_so_dep to true for all direct and indirect dependent sos of app, including app self. */
for
(
struct
dso
*
p
=
head
;
p
;
p
=
p
->
next
)
{
p
->
is_reloc_head_so_dep
=
true
;
add_syms
(
p
);
}
/* Attach to vdso, if provided by the kernel, last so that it does
* not become part of the global namespace. */
...
...
@@ -2854,6 +2903,9 @@ void __dls3(size_t *sp, size_t *auxv)
* copy relocations which depend on libraries' relocations. */
reloc_all
(
app
.
next
,
NULL
);
reloc_all
(
&
app
,
NULL
);
for
(
struct
dso
*
q
=
head
;
q
;
q
=
q
->
next
)
{
q
->
is_reloc_head_so_dep
=
false
;
}
/* Actual copying to new TLS needs to happen after relocations,
* since the TLS images might have contained relocated addresses. */
...
...
@@ -3144,12 +3196,21 @@ static void *dlopen_impl(
/* Make new symbols global, at least temporarily, so we can do
* relocations. If not RTLD_GLOBAL, this is reverted below. */
add_syms
(
p
);
for
(
i
=
0
;
p
->
deps
[
i
];
i
++
)
/* Set is_reloc_head_so_dep to true for all direct and indirect dependent sos of p, including p self. */
p
->
is_reloc_head_so_dep
=
true
;
for
(
i
=
0
;
p
->
deps
[
i
];
i
++
)
{
p
->
deps
[
i
]
->
is_reloc_head_so_dep
=
true
;
add_syms
(
p
->
deps
[
i
]);
}
}
struct
dso
*
reloc_head_so
=
p
;
if
(
!
p
->
relocated
)
{
reloc_all
(
p
,
extinfo
);
}
reloc_head_so
->
is_reloc_head_so_dep
=
false
;
for
(
size_t
i
=
0
;
reloc_head_so
->
deps
[
i
];
i
++
)
{
reloc_head_so
->
deps
[
i
]
->
is_reloc_head_so_dep
=
false
;
}
/* If RTLD_GLOBAL was not specified, undo any new additions
* to the global symbol table. This is a nop if the library was
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录