|
|
@ -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) |
|
|
} 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) |
|
|
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) |
|
|
*deps = tmp; |
|
|
*deps = tmp; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
r_path = 0; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|