Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Musl
提交
e93def3a
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看板
未验证
提交
e93def3a
编写于
6月 21, 2022
作者:
O
openharmony_ci
提交者:
Gitee
6月 21, 2022
浏览文件
操作
浏览文件
下载
差异文件
!337 移动预留主线程信号栈代码到libc
Merge pull request !337 from klcf0220/master
上级
1a82d74c
57c508e9
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
114 addition
and
3 deletion
+114
-3
musl_src.gni
musl_src.gni
+1
-0
porting/linux/user/src/env/__libc_start_main.c
porting/linux/user/src/env/__libc_start_main.c
+100
-0
porting/linux/user/src/internal/pthread_impl.h
porting/linux/user/src/internal/pthread_impl.h
+5
-0
porting/linux/user/src/thread/pthread_create.c
porting/linux/user/src/thread/pthread_create.c
+8
-3
未找到文件。
musl_src.gni
浏览文件 @
e93def3a
...
@@ -1876,6 +1876,7 @@ musl_src_porting_file = [
...
@@ -1876,6 +1876,7 @@ musl_src_porting_file = [
"src/info/device_api_version.c",
"src/info/device_api_version.c",
"src/info/fatal_message.c",
"src/info/fatal_message.c",
"src/env/__init_tls.c",
"src/env/__init_tls.c",
"src/env/__libc_start_main.c",
"src/internal/pthread_impl.h",
"src/internal/pthread_impl.h",
"src/internal/syscall.h",
"src/internal/syscall.h",
"ldso/namespace.h",
"ldso/namespace.h",
...
...
porting/linux/user/src/env/__libc_start_main.c
0 → 100644
浏览文件 @
e93def3a
#include <elf.h>
#include <poll.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#include "syscall.h"
#include "atomic.h"
#include "libc.h"
#include "pthread_impl.h"
static
void
dummy
(
void
)
{}
weak_alias
(
dummy
,
_init
);
extern
weak
hidden
void
(
*
const
__init_array_start
)(
void
),
(
*
const
__init_array_end
)(
void
);
static
void
dummy1
(
void
*
p
)
{}
weak_alias
(
dummy1
,
__init_ssp
);
#define AUX_CNT 38
#ifdef __GNUC__
__attribute__
((
__noinline__
))
#endif
void
__init_libc
(
char
**
envp
,
char
*
pn
)
{
size_t
i
,
*
auxv
,
aux
[
AUX_CNT
]
=
{
0
};
__environ
=
envp
;
for
(
i
=
0
;
envp
[
i
];
i
++
);
libc
.
auxv
=
auxv
=
(
void
*
)(
envp
+
i
+
1
);
for
(
i
=
0
;
auxv
[
i
];
i
+=
2
)
if
(
auxv
[
i
]
<
AUX_CNT
)
aux
[
auxv
[
i
]]
=
auxv
[
i
+
1
];
__hwcap
=
aux
[
AT_HWCAP
];
if
(
aux
[
AT_SYSINFO
])
__sysinfo
=
aux
[
AT_SYSINFO
];
libc
.
page_size
=
aux
[
AT_PAGESZ
];
if
(
!
pn
)
pn
=
(
void
*
)
aux
[
AT_EXECFN
];
if
(
!
pn
)
pn
=
""
;
__progname
=
__progname_full
=
pn
;
for
(
i
=
0
;
pn
[
i
];
i
++
)
if
(
pn
[
i
]
==
'/'
)
__progname
=
pn
+
i
+
1
;
__init_tls
(
aux
);
__init_ssp
((
void
*
)
aux
[
AT_RANDOM
]);
if
(
aux
[
AT_UID
]
==
aux
[
AT_EUID
]
&&
aux
[
AT_GID
]
==
aux
[
AT_EGID
]
&&
!
aux
[
AT_SECURE
])
return
;
struct
pollfd
pfd
[
3
]
=
{
{.
fd
=
0
},
{.
fd
=
1
},
{.
fd
=
2
}
};
int
r
=
#ifdef SYS_poll
__syscall
(
SYS_poll
,
pfd
,
3
,
0
);
#else
__syscall
(
SYS_ppoll
,
pfd
,
3
,
&
(
struct
timespec
){
0
},
0
,
_NSIG
/
8
);
#endif
if
(
r
<
0
)
a_crash
();
for
(
i
=
0
;
i
<
3
;
i
++
)
if
(
pfd
[
i
].
revents
&
POLLNVAL
)
if
(
__sys_open
(
"/dev/null"
,
O_RDWR
)
<
0
)
a_crash
();
libc
.
secure
=
1
;
}
static
void
libc_start_init
(
void
)
{
_init
();
uintptr_t
a
=
(
uintptr_t
)
&
__init_array_start
;
for
(;
a
<
(
uintptr_t
)
&
__init_array_end
;
a
+=
sizeof
(
void
(
*
)()))
(
*
(
void
(
**
)(
void
))
a
)();
}
weak_alias
(
libc_start_init
,
__libc_start_init
);
typedef
int
lsm2_fn
(
int
(
*
)(
int
,
char
**
,
char
**
),
int
,
char
**
);
static
lsm2_fn
libc_start_main_stage2
;
int
__libc_start_main
(
int
(
*
main
)(
int
,
char
**
,
char
**
),
int
argc
,
char
**
argv
)
{
char
**
envp
=
argv
+
argc
+
1
;
/* External linkage, and explicit noinline attribute if available,
* are used to prevent the stack frame used during init from
* persisting for the entire process lifetime. */
__init_libc
(
envp
,
argv
[
0
]);
/* Barrier against hoisting application code or anything using ssp
* or thread pointer prior to its initialization above. */
lsm2_fn
*
stage2
=
libc_start_main_stage2
;
__asm__
(
""
:
"+r"
(
stage2
)
:
:
"memory"
);
return
stage2
(
main
,
argc
,
argv
);
}
static
int
libc_start_main_stage2
(
int
(
*
main
)(
int
,
char
**
,
char
**
),
int
argc
,
char
**
argv
)
{
char
**
envp
=
argv
+
argc
+
1
;
__libc_start_init
();
#ifdef RESERVE_SIGNAL_STACK
pthread_reserve_signal_stack
();
#endif
/* Pass control to the application */
exit
(
main
(
argc
,
argv
,
envp
));
return
0
;
}
porting/linux/user/src/internal/pthread_impl.h
浏览文件 @
e93def3a
...
@@ -223,6 +223,11 @@ static inline void __absolute_timespec_from_timespec(struct timespec *abs_ts,
...
@@ -223,6 +223,11 @@ static inline void __absolute_timespec_from_timespec(struct timespec *abs_ts,
}
}
}
}
#ifdef RESERVE_SIGNAL_STACK
hidden
void
pthread_reserve_signal_stack
();
hidden
void
pthread_release_signal_stack
();
#endif
hidden
void
__acquire_ptc
(
void
);
hidden
void
__acquire_ptc
(
void
);
hidden
void
__release_ptc
(
void
);
hidden
void
__release_ptc
(
void
);
hidden
void
__inhibit_ptc
(
void
);
hidden
void
__inhibit_ptc
(
void
);
...
...
porting/linux/user/src/thread/pthread_create.c
浏览文件 @
e93def3a
...
@@ -42,7 +42,7 @@ void stack_naming(struct pthread *new){
...
@@ -42,7 +42,7 @@ void stack_naming(struct pthread *new){
#else
#else
#define RESERVE_SIGNAL_STACK_SIZE (20 * 1024)
#define RESERVE_SIGNAL_STACK_SIZE (20 * 1024)
#endif
#endif
static
void
__pthread_reserve_signal_stack
()
void
__pthread_reserve_signal_stack
()
{
{
void
*
stack
=
mmap
(
NULL
,
RESERVE_SIGNAL_STACK_SIZE
,
PROT_READ
|
PROT_WRITE
,
MAP_PRIVATE
|
MAP_ANONYMOUS
,
-
1
,
0
);
void
*
stack
=
mmap
(
NULL
,
RESERVE_SIGNAL_STACK_SIZE
,
PROT_READ
|
PROT_WRITE
,
MAP_PRIVATE
|
MAP_ANONYMOUS
,
-
1
,
0
);
if
(
stack
!=
MAP_FAILED
)
{
if
(
stack
!=
MAP_FAILED
)
{
...
@@ -60,11 +60,13 @@ static void __pthread_reserve_signal_stack()
...
@@ -60,11 +60,13 @@ static void __pthread_reserve_signal_stack()
pthread_t
self
=
__pthread_self
();
pthread_t
self
=
__pthread_self
();
self
->
signal_stack
=
stack
;
self
->
signal_stack
=
stack
;
prctl
(
PR_SET_VMA
,
PR_SET_VMA_ANON_NAME
,
signal_stack
.
ss_sp
,
signal_stack
.
ss_size
,
"signal_stack:musl"
);
char
name
[
ANON_STACK_NAME_SIZE
];
snprintf
(
name
,
ANON_STACK_NAME_SIZE
,
"signal_stack:%d"
,
__pthread_self
()
->
tid
);
prctl
(
PR_SET_VMA
,
PR_SET_VMA_ANON_NAME
,
signal_stack
.
ss_sp
,
signal_stack
.
ss_size
,
name
);
return
;
return
;
}
}
static
void
__pthread_release_signal_stack
()
void
__pthread_release_signal_stack
()
{
{
pthread_t
self
=
__pthread_self
();
pthread_t
self
=
__pthread_self
();
if
(
self
->
signal_stack
==
NULL
)
{
if
(
self
->
signal_stack
==
NULL
)
{
...
@@ -78,6 +80,9 @@ static void __pthread_release_signal_stack()
...
@@ -78,6 +80,9 @@ static void __pthread_release_signal_stack()
munmap
(
self
->
signal_stack
,
RESERVE_SIGNAL_STACK_SIZE
);
munmap
(
self
->
signal_stack
,
RESERVE_SIGNAL_STACK_SIZE
);
self
->
signal_stack
=
NULL
;
self
->
signal_stack
=
NULL
;
}
}
weak_alias
(
__pthread_reserve_signal_stack
,
pthread_reserve_signal_stack
);
weak_alias
(
__pthread_release_signal_stack
,
pthread_release_signal_stack
);
#endif
#endif
static
void
dummy_0
()
static
void
dummy_0
()
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录