提交 191ebcac 编写于 作者: R Rich Felker

simple rpath support (no token expansion yet) for dynamic linker

上级 17be8291
...@@ -53,7 +53,7 @@ struct dso ...@@ -53,7 +53,7 @@ struct dso
}; };
static struct dso *head, *tail, *libc; static struct dso *head, *tail, *libc;
static char *env_path, *sys_path; static char *env_path, *sys_path, *r_path;
static int rtld_used; static int rtld_used;
static int runtime; static int runtime;
static jmp_buf rtld_fail; static jmp_buf rtld_fail;
...@@ -316,7 +316,8 @@ static struct dso *load_library(const char *name) ...@@ -316,7 +316,8 @@ static struct dso *load_library(const char *name)
} else { } else {
if (strlen(name) > NAME_MAX) return 0; if (strlen(name) > NAME_MAX) return 0;
fd = -1; fd = -1;
if (env_path) fd = path_open(name, env_path); if (r_path) fd = path_open(name, r_path);
if (fd < 0 && env_path) fd = path_open(name, env_path);
if (fd < 0) { if (fd < 0) {
if (!sys_path) { if (!sys_path) {
FILE *f = fopen(ETC_LDSO_PATH, "r"); FILE *f = fopen(ETC_LDSO_PATH, "r");
...@@ -378,6 +379,10 @@ static void load_deps(struct dso *p) ...@@ -378,6 +379,10 @@ static void load_deps(struct dso *p)
size_t i, ndeps=0; size_t i, ndeps=0;
struct dso ***deps = &p->deps, **tmp, *dep; struct dso ***deps = &p->deps, **tmp, *dep;
for (; p; p=p->next) { for (; p; p=p->next) {
for (i=0; p->dynv[i]; i+=2) {
if (p->dynv[i] != DT_RPATH) continue;
r_path = (void *)(p->strings + p->dynv[i+1]);
}
for (i=0; p->dynv[i]; i+=2) { for (i=0; p->dynv[i]; i+=2) {
if (p->dynv[i] != DT_NEEDED) continue; if (p->dynv[i] != DT_NEEDED) continue;
dep = load_library(p->strings + p->dynv[i+1]); dep = load_library(p->strings + p->dynv[i+1]);
...@@ -395,6 +400,7 @@ static void load_deps(struct dso *p) ...@@ -395,6 +400,7 @@ static void load_deps(struct dso *p)
*deps = tmp; *deps = tmp;
} }
} }
r_path = 0;
} }
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册