Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Musl
提交
e13a2b89
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,发现更多精彩内容 >>
提交
e13a2b89
编写于
3月 25, 2014
作者:
T
Timo Teräs
提交者:
Rich Felker
3月 25, 2014
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
implement PT_GNU_RELRO support
上级
689e0e6b
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
37 addition
and
15 deletion
+37
-15
src/ldso/dynlink.c
src/ldso/dynlink.c
+37
-15
未找到文件。
src/ldso/dynlink.c
浏览文件 @
e13a2b89
...
...
@@ -74,6 +74,7 @@ struct dso {
char
*
rpath_orig
,
*
rpath
;
void
*
tls_image
;
size_t
tls_len
,
tls_size
,
tls_align
,
tls_id
,
tls_offset
;
size_t
relro_start
,
relro_end
;
void
**
new_dtv
;
unsigned
char
*
new_tls
;
int
new_dtv_idx
,
new_tls_idx
;
...
...
@@ -281,27 +282,29 @@ static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stri
* and "donate" them to the heap by setting up minimal malloc
* structures and then freeing them. */
static
void
reclaim
(
unsigned
char
*
base
,
size_t
start
,
size_t
end
)
static
void
reclaim
(
struct
dso
*
dso
,
size_t
start
,
size_t
end
)
{
size_t
*
a
,
*
z
;
if
(
start
>=
dso
->
relro_start
&&
start
<
dso
->
relro_end
)
start
=
dso
->
relro_end
;
if
(
end
>=
dso
->
relro_start
&&
end
<
dso
->
relro_end
)
end
=
dso
->
relro_start
;
start
=
start
+
6
*
sizeof
(
size_t
)
-
1
&
-
4
*
sizeof
(
size_t
);
end
=
(
end
&
-
4
*
sizeof
(
size_t
))
-
2
*
sizeof
(
size_t
);
if
(
start
>
end
||
end
-
start
<
4
*
sizeof
(
size_t
))
return
;
a
=
(
size_t
*
)(
base
+
start
);
z
=
(
size_t
*
)(
base
+
end
);
a
=
(
size_t
*
)(
dso
->
base
+
start
);
z
=
(
size_t
*
)(
dso
->
base
+
end
);
a
[
-
2
]
=
1
;
a
[
-
1
]
=
z
[
0
]
=
end
-
start
+
2
*
sizeof
(
size_t
)
|
1
;
z
[
1
]
=
1
;
free
(
a
);
}
static
void
reclaim_gaps
(
unsigned
char
*
base
,
Phdr
*
ph
,
size_t
phent
,
size_t
phcnt
)
static
void
reclaim_gaps
(
struct
dso
*
dso
,
Phdr
*
ph
,
size_t
phent
,
size_t
phcnt
)
{
for
(;
phcnt
--
;
ph
=
(
void
*
)((
char
*
)
ph
+
phent
))
{
if
(
ph
->
p_type
!=
PT_LOAD
)
continue
;
if
((
ph
->
p_flags
&
(
PF_R
|
PF_W
))
!=
(
PF_R
|
PF_W
))
continue
;
reclaim
(
base
,
ph
->
p_vaddr
&
-
PAGE_SIZE
,
ph
->
p_vaddr
);
reclaim
(
base
,
ph
->
p_vaddr
+
ph
->
p_memsz
,
reclaim
(
dso
,
ph
->
p_vaddr
&
-
PAGE_SIZE
,
ph
->
p_vaddr
);
reclaim
(
dso
,
ph
->
p_vaddr
+
ph
->
p_memsz
,
ph
->
p_vaddr
+
ph
->
p_memsz
+
PAGE_SIZE
-
1
&
-
PAGE_SIZE
);
}
}
...
...
@@ -346,11 +349,14 @@ static void *map_library(int fd, struct dso *dso)
for
(
i
=
eh
->
e_phnum
;
i
;
i
--
,
ph
=
(
void
*
)((
char
*
)
ph
+
eh
->
e_phentsize
))
{
if
(
ph
->
p_type
==
PT_DYNAMIC
)
dyn
=
ph
->
p_vaddr
;
if
(
ph
->
p_type
==
PT_TLS
)
{
else
if
(
ph
->
p_type
==
PT_TLS
)
{
tls_image
=
ph
->
p_vaddr
;
dso
->
tls_align
=
ph
->
p_align
;
dso
->
tls_len
=
ph
->
p_filesz
;
dso
->
tls_size
=
ph
->
p_memsz
;
}
else
if
(
ph
->
p_type
==
PT_GNU_RELRO
)
{
dso
->
relro_start
=
ph
->
p_vaddr
&
-
PAGE_SIZE
;
dso
->
relro_end
=
(
ph
->
p_vaddr
+
ph
->
p_memsz
)
&
-
PAGE_SIZE
;
}
if
(
ph
->
p_type
!=
PT_LOAD
)
continue
;
if
(
ph
->
p_vaddr
<
addr_min
)
{
...
...
@@ -419,12 +425,12 @@ static void *map_library(int fd, struct dso *dso)
goto
error
;
break
;
}
if
(
!
runtime
)
reclaim_gaps
(
base
,
ph0
,
eh
->
e_phentsize
,
eh
->
e_phnum
);
dso
->
map
=
map
;
dso
->
map_len
=
map_len
;
dso
->
base
=
base
;
dso
->
dynv
=
(
void
*
)(
base
+
dyn
);
if
(
dso
->
tls_size
)
dso
->
tls_image
=
(
void
*
)(
base
+
tls_image
);
if
(
!
runtime
)
reclaim_gaps
(
dso
,
ph0
,
eh
->
e_phentsize
,
eh
->
e_phnum
);
free
(
allocated_buf
);
return
map
;
noexec:
...
...
@@ -766,6 +772,17 @@ static void reloc_all(struct dso *p)
2
+
(
dyn
[
DT_PLTREL
]
==
DT_RELA
));
do_relocs
(
p
,
(
void
*
)(
p
->
base
+
dyn
[
DT_REL
]),
dyn
[
DT_RELSZ
],
2
);
do_relocs
(
p
,
(
void
*
)(
p
->
base
+
dyn
[
DT_RELA
]),
dyn
[
DT_RELASZ
],
3
);
if
(
p
->
relro_start
!=
p
->
relro_end
&&
mprotect
(
p
->
base
+
p
->
relro_start
,
p
->
relro_end
-
p
->
relro_start
,
PROT_READ
)
<
0
)
{
snprintf
(
errbuf
,
sizeof
errbuf
,
"Error relocating %s: RELRO protection failed"
,
p
->
name
);
if
(
runtime
)
longjmp
(
*
rtld_fail
,
1
);
dprintf
(
2
,
"%s
\n
"
,
errbuf
);
ldso_fail
=
1
;
}
p
->
relocated
=
1
;
}
}
...
...
@@ -782,6 +799,10 @@ static void find_map_range(Phdr *ph, size_t cnt, size_t stride, struct dso *p)
{
size_t
min_addr
=
-
1
,
max_addr
=
0
;
for
(;
cnt
--
;
ph
=
(
void
*
)((
char
*
)
ph
+
stride
))
{
if
(
ph
->
p_type
==
PT_GNU_RELRO
)
{
p
->
relro_start
=
ph
->
p_vaddr
&
-
PAGE_SIZE
;
p
->
relro_end
=
(
ph
->
p_vaddr
+
ph
->
p_memsz
)
&
-
PAGE_SIZE
;
}
if
(
ph
->
p_type
!=
PT_LOAD
)
continue
;
if
(
ph
->
p_vaddr
<
min_addr
)
min_addr
=
ph
->
p_vaddr
;
...
...
@@ -1133,9 +1154,9 @@ void *__dynlink(int argc, char **argv)
/* PAST THIS POINT, ALL LIBC INTERFACES ARE FULLY USABLE. */
/* Donate unused parts of app and library mapping to malloc */
reclaim_gaps
(
app
->
base
,
(
void
*
)
aux
[
AT_PHDR
],
aux
[
AT_PHENT
],
aux
[
AT_PHNUM
]);
reclaim_gaps
(
app
,
(
void
*
)
aux
[
AT_PHDR
],
aux
[
AT_PHENT
],
aux
[
AT_PHNUM
]);
ehdr
=
(
void
*
)
lib
->
base
;
reclaim_gaps
(
lib
->
base
,
(
void
*
)(
lib
->
base
+
ehdr
->
e_phoff
),
reclaim_gaps
(
lib
,
(
void
*
)(
lib
->
base
+
ehdr
->
e_phoff
),
ehdr
->
e_phentsize
,
ehdr
->
e_phnum
);
/* Load preload/needed libraries, add their symbols to the global
...
...
@@ -1146,6 +1167,12 @@ void *__dynlink(int argc, char **argv)
load_deps
(
app
);
make_global
(
app
);
#ifndef DYNAMIC_IS_RO
for
(
i
=
0
;
app
->
dynv
[
i
];
i
+=
2
)
if
(
app
->
dynv
[
i
]
==
DT_DEBUG
)
app
->
dynv
[
i
+
1
]
=
(
size_t
)
&
debug
;
#endif
reloc_all
(
app
->
next
);
reloc_all
(
app
);
...
...
@@ -1174,11 +1201,6 @@ void *__dynlink(int argc, char **argv)
* all memory used by the dynamic linker. */
runtime
=
1
;
#ifndef DYNAMIC_IS_RO
for
(
i
=
0
;
app
->
dynv
[
i
];
i
+=
2
)
if
(
app
->
dynv
[
i
]
==
DT_DEBUG
)
app
->
dynv
[
i
+
1
]
=
(
size_t
)
&
debug
;
#endif
debug
.
ver
=
1
;
debug
.
bp
=
_dl_debug_state
;
debug
.
head
=
head
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录