Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Musl
提交
35f35e18
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看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
35f35e18
编写于
12月 28, 2022
作者:
O
openharmony_ci
提交者:
Gitee
12月 28, 2022
浏览文件
操作
浏览文件
下载
差异文件
!762 规避dlclose中删除tls的问题-同步到3.1release
Merge pull request !762 from dhy308/gl-fix_tls_issue
上级
0315b6d6
d5798ba0
变更
3
隐藏空白更改
内联
并排
Showing
3 changed file
with
166 addition
and
1 deletion
+166
-1
musl_src.gni
musl_src.gni
+1
-0
porting/linux/user/ldso/dynlink.c
porting/linux/user/ldso/dynlink.c
+8
-1
porting/linux/user/src/env/__init_tls.c
porting/linux/user/src/env/__init_tls.c
+157
-0
未找到文件。
musl_src.gni
浏览文件 @
35f35e18
...
...
@@ -1834,6 +1834,7 @@ musl_src_porting_file = [
"src/internal/dynlink.h",
"include/unistd.h",
"include/dlfcn.h",
"src/env/__init_tls.c",
"src/internal/pthread_impl.h",
"src/internal/syscall.h",
"src/legacy/ulimit.c",
...
...
porting/linux/user/ldso/dynlink.c
浏览文件 @
35f35e18
...
...
@@ -2261,6 +2261,11 @@ static int do_dlclose(struct dso *p)
d
->
fini_next
=
p
->
fini_next
;
}
/* empty tls image */
if
(
p
->
tls
.
size
!=
0
)
{
p
->
tls
.
image
=
NULL
;
}
/* remove dso from global dso list */
if
(
p
==
tail
)
{
tail
=
p
->
prev
;
...
...
@@ -2275,7 +2280,9 @@ static int do_dlclose(struct dso *p)
if
(
p
->
deps
!=
no_deps
)
free
(
p
->
deps
);
unmap_library
(
p
);
free
(
p
);
if
(
p
->
tls
.
size
==
0
)
{
free
(
p
);
}
return
0
;
}
...
...
porting/linux/user/src/env/__init_tls.c
0 → 100644
浏览文件 @
35f35e18
#define SYSCALL_NO_TLS 1
#include <elf.h>
#include <limits.h>
#include <sys/mman.h>
#include <string.h>
#include <stddef.h>
#include "pthread_impl.h"
#include "libc.h"
#include "atomic.h"
#include "syscall.h"
volatile
int
__thread_list_lock
;
int
__init_tp
(
void
*
p
)
{
pthread_t
td
=
p
;
td
->
self
=
td
;
int
r
=
__set_thread_area
(
TP_ADJ
(
p
));
if
(
r
<
0
)
return
-
1
;
if
(
!
r
)
libc
.
can_do_threads
=
1
;
td
->
detach_state
=
DT_JOINABLE
;
td
->
tid
=
__syscall
(
SYS_set_tid_address
,
&
__thread_list_lock
);
td
->
locale
=
&
libc
.
global_locale
;
td
->
robust_list
.
head
=
&
td
->
robust_list
.
head
;
td
->
sysinfo
=
__sysinfo
;
td
->
next
=
td
->
prev
=
td
;
return
0
;
}
static
struct
builtin_tls
{
char
c
;
struct
pthread
pt
;
void
*
space
[
16
];
}
builtin_tls
[
1
];
#define MIN_TLS_ALIGN offsetof(struct builtin_tls, pt)
static
struct
tls_module
main_tls
;
void
*
__copy_tls
(
unsigned
char
*
mem
)
{
pthread_t
td
;
struct
tls_module
*
p
;
size_t
i
;
uintptr_t
*
dtv
;
#ifdef TLS_ABOVE_TP
dtv
=
(
uintptr_t
*
)(
mem
+
libc
.
tls_size
)
-
(
libc
.
tls_cnt
+
1
);
mem
+=
-
((
uintptr_t
)
mem
+
sizeof
(
struct
pthread
))
&
(
libc
.
tls_align
-
1
);
td
=
(
pthread_t
)
mem
;
mem
+=
sizeof
(
struct
pthread
);
for
(
i
=
1
,
p
=
libc
.
tls_head
;
p
;
i
++
,
p
=
p
->
next
)
{
dtv
[
i
]
=
(
uintptr_t
)(
mem
+
p
->
offset
)
+
DTP_OFFSET
;
if
(
p
->
image
)
{
memcpy
(
mem
+
p
->
offset
,
p
->
image
,
p
->
len
);
}
}
#else
dtv
=
(
uintptr_t
*
)
mem
;
mem
+=
libc
.
tls_size
-
sizeof
(
struct
pthread
);
mem
-=
(
uintptr_t
)
mem
&
(
libc
.
tls_align
-
1
);
td
=
(
pthread_t
)
mem
;
for
(
i
=
1
,
p
=
libc
.
tls_head
;
p
;
i
++
,
p
=
p
->
next
)
{
dtv
[
i
]
=
(
uintptr_t
)(
mem
-
p
->
offset
)
+
DTP_OFFSET
;
if
(
p
->
image
)
{
memcpy
(
mem
-
p
->
offset
,
p
->
image
,
p
->
len
);
}
}
#endif
dtv
[
0
]
=
libc
.
tls_cnt
;
td
->
dtv
=
td
->
dtv_copy
=
dtv
;
return
td
;
}
#if ULONG_MAX == 0xffffffff
typedef
Elf32_Phdr
Phdr
;
#else
typedef
Elf64_Phdr
Phdr
;
#endif
extern
weak
hidden
const
size_t
_DYNAMIC
[];
static
void
static_init_tls
(
size_t
*
aux
)
{
unsigned
char
*
p
;
size_t
n
;
Phdr
*
phdr
,
*
tls_phdr
=
0
;
size_t
base
=
0
;
void
*
mem
;
for
(
p
=
(
void
*
)
aux
[
AT_PHDR
],
n
=
aux
[
AT_PHNUM
];
n
;
n
--
,
p
+=
aux
[
AT_PHENT
])
{
phdr
=
(
void
*
)
p
;
if
(
phdr
->
p_type
==
PT_PHDR
)
base
=
aux
[
AT_PHDR
]
-
phdr
->
p_vaddr
;
if
(
phdr
->
p_type
==
PT_DYNAMIC
&&
_DYNAMIC
)
base
=
(
size_t
)
_DYNAMIC
-
phdr
->
p_vaddr
;
if
(
phdr
->
p_type
==
PT_TLS
)
tls_phdr
=
phdr
;
if
(
phdr
->
p_type
==
PT_GNU_STACK
&&
phdr
->
p_memsz
>
__default_stacksize
)
__default_stacksize
=
phdr
->
p_memsz
<
DEFAULT_STACK_MAX
?
phdr
->
p_memsz
:
DEFAULT_STACK_MAX
;
}
if
(
tls_phdr
)
{
main_tls
.
image
=
(
void
*
)(
base
+
tls_phdr
->
p_vaddr
);
main_tls
.
len
=
tls_phdr
->
p_filesz
;
main_tls
.
size
=
tls_phdr
->
p_memsz
;
main_tls
.
align
=
tls_phdr
->
p_align
;
libc
.
tls_cnt
=
1
;
libc
.
tls_head
=
&
main_tls
;
}
main_tls
.
size
+=
(
-
main_tls
.
size
-
(
uintptr_t
)
main_tls
.
image
)
&
(
main_tls
.
align
-
1
);
#ifdef TLS_ABOVE_TP
main_tls
.
offset
=
GAP_ABOVE_TP
;
main_tls
.
offset
+=
(
-
GAP_ABOVE_TP
+
(
uintptr_t
)
main_tls
.
image
)
&
(
main_tls
.
align
-
1
);
#else
main_tls
.
offset
=
main_tls
.
size
;
#endif
if
(
main_tls
.
align
<
MIN_TLS_ALIGN
)
main_tls
.
align
=
MIN_TLS_ALIGN
;
libc
.
tls_align
=
main_tls
.
align
;
libc
.
tls_size
=
2
*
sizeof
(
void
*
)
+
sizeof
(
struct
pthread
)
#ifdef TLS_ABOVE_TP
+
main_tls
.
offset
#endif
+
main_tls
.
size
+
main_tls
.
align
+
MIN_TLS_ALIGN
-
1
&
-
MIN_TLS_ALIGN
;
if
(
libc
.
tls_size
>
sizeof
builtin_tls
)
{
#ifndef SYS_mmap2
#define SYS_mmap2 SYS_mmap
#endif
mem
=
(
void
*
)
__syscall
(
SYS_mmap2
,
0
,
libc
.
tls_size
,
PROT_READ
|
PROT_WRITE
,
MAP_ANONYMOUS
|
MAP_PRIVATE
,
-
1
,
0
);
/* -4095...-1 cast to void * will crash on dereference anyway,
* so don't bloat the init code checking for error codes and
* explicitly calling a_crash(). */
}
else
{
mem
=
builtin_tls
;
}
/* Failure to initialize thread pointer is always fatal. */
if
(
__init_tp
(
__copy_tls
(
mem
))
<
0
)
a_crash
();
}
weak_alias
(
static_init_tls
,
__init_tls
);
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录