record preloaded libraries as direct pseudo-dependencies of main app

this makes calling dlsym on the main app more consistent with the
global symbol table (load order), and is a prerequisite for
dependency-order ctor execution to work correctly with LD_PRELOAD.
This commit is contained in:
Rich Felker 2019-03-01 15:09:16 -05:00
parent 0c5c8f5da6
commit 88207361ea
1 changed files with 11 additions and 4 deletions

View File

@ -1146,16 +1146,23 @@ static struct dso *load_library(const char *name, struct dso *needed_by)
static void load_direct_deps(struct dso *p)
{
size_t i, cnt;
size_t i, cnt=0;
if (p->deps) return;
for (i=cnt=0; p->dynv[i]; i+=2)
/* For head, all preloads are direct pseudo-dependencies.
* Count and include them now to avoid realloc later. */
if (p==head) for (struct dso *q=p->next; q; q=q->next)
cnt++;
for (i=0; p->dynv[i]; i+=2)
if (p->dynv[i] == DT_NEEDED) cnt++;
p->deps = calloc(cnt+1, sizeof *p->deps);
if (!p->deps) {
error("Error loading dependencies for %s", p->name);
if (runtime) longjmp(*rtld_fail, 1);
}
for (i=cnt=0; p->dynv[i]; i+=2) {
cnt=0;
if (p==head) for (struct dso *q=p->next; q; q=q->next)
p->deps[cnt++] = q;
for (i=0; p->dynv[i]; i+=2) {
if (p->dynv[i] != DT_NEEDED) continue;
struct dso *dep = load_library(p->strings + p->dynv[i+1], p);
if (!dep) {
@ -1165,8 +1172,8 @@ static void load_direct_deps(struct dso *p)
continue;
}
p->deps[cnt++] = dep;
p->deps[cnt] = 0;
}
p->deps[cnt] = 0;
p->ndeps_direct = cnt;
}