Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Musl
提交
d8740645
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看板
提交
d8740645
编写于
9月 21, 2015
作者:
R
Rich Felker
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
simplify dlstart code by using integer type for base address
上级
2a547338
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
7 addition
and
8 deletion
+7
-8
src/ldso/dlstart.c
src/ldso/dlstart.c
+7
-8
未找到文件。
src/ldso/dlstart.c
浏览文件 @
d8740645
...
...
@@ -21,6 +21,7 @@ __attribute__((__visibility__("hidden")))
void
_dlstart_c
(
size_t
*
sp
,
size_t
*
dynv
)
{
size_t
i
,
aux
[
AUX_CNT
],
dyn
[
DYN_CNT
];
size_t
*
rel
,
rel_size
,
base
;
int
argc
=
*
sp
;
char
**
argv
=
(
void
*
)(
sp
+
1
);
...
...
@@ -40,14 +41,14 @@ void _dlstart_c(size_t *sp, size_t *dynv)
* address is not available in the aux vector. Instead, compute
* the load address as the difference between &_DYNAMIC and the
* virtual address in the PT_DYNAMIC program header. */
unsigned
char
*
base
=
(
void
*
)
aux
[
AT_BASE
];
base
=
aux
[
AT_BASE
];
if
(
!
base
)
{
size_t
phnum
=
aux
[
AT_PHNUM
];
size_t
phentsize
=
aux
[
AT_PHENT
];
Phdr
*
ph
=
(
void
*
)
aux
[
AT_PHDR
];
for
(
i
=
phnum
;
i
--
;
ph
=
(
void
*
)((
char
*
)
ph
+
phentsize
))
{
if
(
ph
->
p_type
==
PT_DYNAMIC
)
{
base
=
(
void
*
)((
size_t
)
dynv
-
ph
->
p_vaddr
)
;
base
=
(
size_t
)
dynv
-
ph
->
p_vaddr
;
break
;
}
}
...
...
@@ -61,17 +62,15 @@ void _dlstart_c(size_t *sp, size_t *dynv)
size_t
*
got
=
(
void
*
)(
base
+
dyn
[
DT_PLTGOT
]);
for
(
i
=
0
;
dynv
[
i
];
i
+=
2
)
if
(
dynv
[
i
]
==
DT_MIPS_LOCAL_GOTNO
)
local_cnt
=
dynv
[
i
+
1
];
for
(
i
=
0
;
i
<
local_cnt
;
i
++
)
got
[
i
]
+=
(
size_t
)
base
;
for
(
i
=
0
;
i
<
local_cnt
;
i
++
)
got
[
i
]
+=
base
;
}
size_t
*
rel
,
rel_size
;
rel
=
(
void
*
)(
base
+
dyn
[
DT_REL
]);
rel_size
=
dyn
[
DT_RELSZ
];
for
(;
rel_size
;
rel
+=
2
,
rel_size
-=
2
*
sizeof
(
size_t
))
{
if
(
!
IS_RELATIVE
(
rel
[
1
]))
continue
;
size_t
*
rel_addr
=
(
void
*
)(
base
+
rel
[
0
]);
*
rel_addr
+=
(
size_t
)
base
;
*
rel_addr
+=
base
;
}
rel
=
(
void
*
)(
base
+
dyn
[
DT_RELA
]);
...
...
@@ -79,12 +78,12 @@ void _dlstart_c(size_t *sp, size_t *dynv)
for
(;
rel_size
;
rel
+=
3
,
rel_size
-=
3
*
sizeof
(
size_t
))
{
if
(
!
IS_RELATIVE
(
rel
[
1
]))
continue
;
size_t
*
rel_addr
=
(
void
*
)(
base
+
rel
[
0
]);
*
rel_addr
=
(
size_t
)
base
+
rel
[
2
];
*
rel_addr
=
base
+
rel
[
2
];
}
stage2_func
dls2
;
GETFUNCSYM
(
&
dls2
,
__dls2
,
base
+
dyn
[
DT_PLTGOT
]);
dls2
(
base
,
sp
);
dls2
(
(
void
*
)
base
,
sp
);
}
#endif
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录