Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Third Party Musl
提交
c82f4a32
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,发现更多精彩内容 >>
提交
c82f4a32
编写于
1月 23, 2012
作者:
R
Rich Felker
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
cleanup dynamic linker, removing some code duplication
上级
35620515
变更
1
显示空白变更内容
内联
并排
Showing
1 changed file
with
66 addition
and
80 deletion
+66
-80
src/ldso/dynlink.c
src/ldso/dynlink.c
+66
-80
未找到文件。
src/ldso/dynlink.c
浏览文件 @
c82f4a32
...
@@ -286,12 +286,20 @@ static int path_open(const char *name, const char *search)
...
@@ -286,12 +286,20 @@ static int path_open(const char *name, const char *search)
}
}
}
}
static
void
decode_dyn
(
struct
dso
*
p
)
{
size_t
dyn
[
DYN_CNT
]
=
{
0
};
decode_vec
(
p
->
dynv
,
dyn
,
DYN_CNT
);
p
->
syms
=
(
void
*
)(
p
->
base
+
dyn
[
DT_SYMTAB
]);
p
->
hashtab
=
(
void
*
)(
p
->
base
+
dyn
[
DT_HASH
]);
p
->
strings
=
(
void
*
)(
p
->
base
+
dyn
[
DT_STRTAB
]);
}
static
struct
dso
*
load_library
(
const
char
*
name
)
static
struct
dso
*
load_library
(
const
char
*
name
)
{
{
unsigned
char
*
base
,
*
map
;
unsigned
char
*
base
,
*
map
;
size_t
dyno
,
map_len
;
size_t
dyno
,
map_len
;
struct
dso
*
p
;
struct
dso
*
p
;
size_t
dyn
[
DYN_CNT
]
=
{
0
};
int
fd
;
int
fd
;
struct
stat
st
;
struct
stat
st
;
...
@@ -365,11 +373,8 @@ static struct dso *load_library(const char *name)
...
@@ -365,11 +373,8 @@ static struct dso *load_library(const char *name)
p
->
map_len
=
map_len
;
p
->
map_len
=
map_len
;
p
->
base
=
base
;
p
->
base
=
base
;
p
->
dynv
=
(
void
*
)(
base
+
dyno
);
p
->
dynv
=
(
void
*
)(
base
+
dyno
);
decode_
vec
(
p
->
dynv
,
dyn
,
DYN_CNT
);
decode_
dyn
(
p
);
p
->
syms
=
(
void
*
)(
base
+
dyn
[
DT_SYMTAB
]);
p
->
hashtab
=
(
void
*
)(
base
+
dyn
[
DT_HASH
]);
p
->
strings
=
(
void
*
)(
base
+
dyn
[
DT_STRTAB
]);
p
->
dev
=
st
.
st_dev
;
p
->
dev
=
st
.
st_dev
;
p
->
ino
=
st
.
st_ino
;
p
->
ino
=
st
.
st_ino
;
p
->
refcnt
=
1
;
p
->
refcnt
=
1
;
...
@@ -458,21 +463,24 @@ static void free_all(struct dso *p)
...
@@ -458,21 +463,24 @@ static void free_all(struct dso *p)
}
}
}
}
void
*
__dynlink
(
int
argc
,
char
**
argv
,
size_t
*
got
)
static
size_t
find_dyn
(
Phdr
*
ph
,
size_t
cnt
,
size_t
stride
)
{
for
(;
cnt
--
;
ph
=
(
void
*
)((
char
*
)
ph
+
stride
))
if
(
ph
->
p_type
==
PT_DYNAMIC
)
return
ph
->
p_vaddr
;
return
0
;
}
void
*
__dynlink
(
int
argc
,
char
**
argv
)
{
{
size_t
*
auxv
,
aux
[
AUX_CNT
]
=
{
0
};
size_t
*
auxv
,
aux
[
AUX_CNT
]
=
{
0
};
size_t
app_dyn
[
DYN_CNT
]
=
{
0
};
size_t
lib_dyn
[
DYN_CNT
]
=
{
0
};
size_t
vdso_dyn
[
DYN_CNT
]
=
{
0
};
size_t
i
;
size_t
i
;
Phdr
*
phdr
;
Phdr
*
phdr
;
Ehdr
*
ehdr
;
Ehdr
*
ehdr
;
size_t
*
lib_dynv
;
static
struct
dso
builtin_dsos
[
3
];
static
struct
dso
builtin_dsos
[
3
];
struct
dso
*
const
app
=
builtin_dsos
+
0
;
struct
dso
*
const
app
=
builtin_dsos
+
0
;
struct
dso
*
const
lib
=
builtin_dsos
+
1
;
struct
dso
*
const
lib
=
builtin_dsos
+
1
;
struct
dso
*
const
vdso
=
builtin_dsos
+
2
;
struct
dso
*
const
vdso
=
builtin_dsos
+
2
;
size_t
vdso_base
=
0
;
char
*
env_preload
=
0
;
char
*
env_preload
=
0
;
/* Find aux vector just past environ[] */
/* Find aux vector just past environ[] */
...
@@ -492,56 +500,31 @@ void *__dynlink(int argc, char **argv, size_t *got)
...
@@ -492,56 +500,31 @@ void *__dynlink(int argc, char **argv, size_t *got)
env_preload
=
0
;
env_preload
=
0
;
}
}
/* The dynamic linker load address is passed by the kernel
* in the AUX vector, so this is easy. */
lib
->
base
=
(
void
*
)
aux
[
AT_BASE
];
lib
->
name
=
"libc.so"
;
lib
->
global
=
1
;
ehdr
=
(
void
*
)
lib
->
base
;
lib
->
dynv
=
(
void
*
)(
lib
->
base
+
find_dyn
(
(
void
*
)(
aux
[
AT_BASE
]
+
ehdr
->
e_phoff
),
ehdr
->
e_phnum
,
ehdr
->
e_phentsize
));
decode_dyn
(
lib
);
/* Assume base address of 0 for the main program. This is not
* valid for PIE code; we will have to search the PHDR to get
* the correct load address in the PIE case (not yet supported). */
app
->
base
=
0
;
app
->
name
=
argv
[
0
];
app
->
global
=
1
;
app
->
dynv
=
(
void
*
)(
app
->
base
+
find_dyn
(
(
void
*
)
aux
[
AT_PHDR
],
aux
[
AT_PHNUM
],
aux
[
AT_PHENT
]));
decode_dyn
(
app
);
/* Attach to vdso, if provided by the kernel */
for
(
i
=
0
;
auxv
[
i
];
i
+=
2
)
{
for
(
i
=
0
;
auxv
[
i
];
i
+=
2
)
{
if
(
auxv
[
i
]
==
AT_SYSINFO_EHDR
)
{
size_t
vdso_base
=
auxv
[
i
+
1
];
vdso_base
=
auxv
[
i
+
1
];
if
(
auxv
[
i
]
!=
AT_SYSINFO_EHDR
)
continue
;
break
;
}
}
/* Find the dynamic linker's DYNAMIC section and decode it */
ehdr
=
(
void
*
)
aux
[
AT_BASE
];
phdr
=
(
void
*
)(
aux
[
AT_BASE
]
+
ehdr
->
e_phoff
);
for
(
i
=
ehdr
->
e_phnum
;
i
--
;
phdr
=
(
void
*
)((
char
*
)
phdr
+
ehdr
->
e_phentsize
))
{
if
(
phdr
->
p_type
==
PT_DYNAMIC
)
{
lib_dynv
=
(
void
*
)(
aux
[
AT_BASE
]
+
phdr
->
p_vaddr
);
decode_vec
(
lib_dynv
,
lib_dyn
,
DYN_CNT
);
break
;
}
}
/* Find the program image's DYNAMIC section and decode it */
phdr
=
(
void
*
)
aux
[
AT_PHDR
];
for
(
i
=
aux
[
AT_PHNUM
];
i
--
;
phdr
=
(
void
*
)((
char
*
)
phdr
+
aux
[
AT_PHENT
]))
{
if
(
phdr
->
p_type
==
PT_DYNAMIC
)
{
decode_vec
((
void
*
)
phdr
->
p_vaddr
,
app_dyn
,
DYN_CNT
);
break
;
}
}
*
app
=
(
struct
dso
){
.
base
=
0
,
.
strings
=
(
void
*
)(
app_dyn
[
DT_STRTAB
]),
.
hashtab
=
(
void
*
)(
app_dyn
[
DT_HASH
]),
.
syms
=
(
void
*
)(
app_dyn
[
DT_SYMTAB
]),
.
dynv
=
(
void
*
)(
phdr
->
p_vaddr
),
.
name
=
argv
[
0
],
.
global
=
1
,
.
next
=
lib
};
*
lib
=
(
struct
dso
){
.
base
=
(
void
*
)
aux
[
AT_BASE
],
.
strings
=
(
void
*
)(
aux
[
AT_BASE
]
+
lib_dyn
[
DT_STRTAB
]),
.
hashtab
=
(
void
*
)(
aux
[
AT_BASE
]
+
lib_dyn
[
DT_HASH
]),
.
syms
=
(
void
*
)(
aux
[
AT_BASE
]
+
lib_dyn
[
DT_SYMTAB
]),
.
dynv
=
lib_dynv
,
.
name
=
"libc.so"
,
.
global
=
1
,
.
relocated
=
1
};
if
(
vdso_base
)
{
ehdr
=
(
void
*
)
vdso_base
;
ehdr
=
(
void
*
)
vdso_base
;
phdr
=
(
void
*
)(
vdso_base
+
ehdr
->
e_phoff
);
phdr
=
(
void
*
)(
vdso_base
+
ehdr
->
e_phoff
);
for
(
i
=
ehdr
->
e_phnum
;
i
;
i
--
,
phdr
=
(
void
*
)((
char
*
)
phdr
+
ehdr
->
e_phentsize
))
{
for
(
i
=
ehdr
->
e_phnum
;
i
;
i
--
,
phdr
=
(
void
*
)((
char
*
)
phdr
+
ehdr
->
e_phentsize
))
{
...
@@ -550,40 +533,43 @@ void *__dynlink(int argc, char **argv, size_t *got)
...
@@ -550,40 +533,43 @@ void *__dynlink(int argc, char **argv, size_t *got)
if
(
phdr
->
p_type
==
PT_LOAD
)
if
(
phdr
->
p_type
==
PT_LOAD
)
vdso
->
base
=
(
void
*
)(
vdso_base
-
phdr
->
p_vaddr
+
phdr
->
p_offset
);
vdso
->
base
=
(
void
*
)(
vdso_base
-
phdr
->
p_vaddr
+
phdr
->
p_offset
);
}
}
decode_vec
(
vdso
->
dynv
,
vdso_dyn
,
DYN_CNT
);
vdso
->
syms
=
(
void
*
)(
vdso
->
base
+
vdso_dyn
[
DT_SYMTAB
]);
vdso
->
hashtab
=
(
void
*
)(
vdso
->
base
+
vdso_dyn
[
DT_HASH
]);
vdso
->
strings
=
(
void
*
)(
vdso
->
base
+
vdso_dyn
[
DT_STRTAB
]);
vdso
->
name
=
"linux-gate.so.1"
;
vdso
->
name
=
"linux-gate.so.1"
;
vdso
->
global
=
1
;
vdso
->
global
=
1
;
decode_dyn
(
vdso
);
vdso
->
prev
=
lib
;
vdso
->
prev
=
lib
;
lib
->
next
=
vdso
;
lib
->
next
=
vdso
;
break
;
}
}
/* Relocate the dynamic linker/libc */
/* Initial dso chain consists only of the app. We temporarily
do_relocs
((
void
*
)
aux
[
AT_BASE
],
(
void
*
)(
aux
[
AT_BASE
]
+
lib_dyn
[
DT_REL
]),
* append the dynamic linker/libc so we can relocate it, then
lib_dyn
[
DT_RELSZ
],
2
,
lib
->
syms
,
lib
->
strings
,
app
);
* restore the initial chain in preparation for loading third
do_relocs
((
void
*
)
aux
[
AT_BASE
],
(
void
*
)(
aux
[
AT_BASE
]
+
lib_dyn
[
DT_RELA
]),
* party libraries (preload/needed). */
lib_dyn
[
DT_RELASZ
],
3
,
lib
->
syms
,
lib
->
strings
,
app
);
head
=
tail
=
app
;
libc
=
lib
;
app
->
next
=
lib
;
reloc_all
(
lib
);
app
->
next
=
0
;
/*
At this point the standard library is fully functional
*/
/*
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
->
base
,
(
void
*
)
aux
[
AT_PHDR
],
aux
[
AT_PHENT
],
aux
[
AT_PHNUM
]);
ehdr
=
(
void
*
)
lib
->
base
;
ehdr
=
(
void
*
)
lib
->
base
;
reclaim_gaps
(
lib
->
base
,
(
void
*
)(
lib
->
base
+
ehdr
->
e_phoff
),
reclaim_gaps
(
lib
->
base
,
(
void
*
)(
lib
->
base
+
ehdr
->
e_phoff
),
ehdr
->
e_phentsize
,
ehdr
->
e_phnum
);
ehdr
->
e_phentsize
,
ehdr
->
e_phnum
);
head
=
tail
=
app
;
/* Load preload/needed libraries, add their symbols to the global
libc
=
lib
;
* namespace, and perform all remaining relocations. */
app
->
next
=
0
;
if
(
env_preload
)
load_preload
(
env_preload
);
if
(
env_preload
)
load_preload
(
env_preload
);
load_deps
(
head
);
load_deps
(
app
);
make_global
(
app
);
make_global
(
head
);
reloc_all
(
app
);
reloc_all
(
head
->
next
);
reloc_all
(
head
);
/* Switch to runtime mode: any further failures in the dynamic
* linker are a reportable failure rather than a fatal startup
* error. If the dynamic loader (dlopen) will not be used, free
* all memory used by the dynamic linker. */
runtime
=
1
;
runtime
=
1
;
if
(
!
rtld_used
)
{
if
(
!
rtld_used
)
{
free_all
(
head
);
free_all
(
head
);
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录