X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=src%2Fldso%2Fdynlink.c;h=1ef981ae9b8fbbeeeb855aa67b19c50e5a3ae327;hb=77830507bed92a62ab230b499d5b38ae45d208a4;hp=f4c32ffea52828b8095439c343bc92ab47d446eb;hpb=e152ee9778846c1f233641b2d3562ccdb081c6a9;p=musl diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index f4c32ffe..1ef981ae 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -458,6 +458,18 @@ static struct dso *load_library(const char *name) size_t l = z-name; for (rp=reserved; *rp && memcmp(name+3, rp, l-3); rp+=strlen(rp)+1); if (*rp) { + if (ldd_mode) { + /* Track which names have been resolved + * and only report each one once. */ + static unsigned reported; + unsigned mask = 1U<<(rp-reserved); + if (!(reported & mask)) { + reported |= mask; + dprintf(1, "\t%s => %s (%p)\n", + name, ldso->name, + ldso->base); + } + } if (!ldso->prev) { tail->next = ldso; ldso->prev = tail; @@ -940,9 +952,17 @@ void *__dynlink(int argc, char **argv) close(fd); lib->name = ldname; app->name = argv[0]; - app->phnum = ehdr->e_phnum; - app->phdr = (void *)(app->base + ehdr->e_phoff); - aux[AT_ENTRY] = ehdr->e_entry; + aux[AT_ENTRY] = (size_t)app->base + ehdr->e_entry; + /* Find the name that would have been used for the dynamic + * linker had ldd not taken its place. */ + if (ldd_mode) { + for (i=0; iphnum; i++) { + if (app->phdr[i].p_type == PT_INTERP) + lib->name = (void *)(app->base + + app->phdr[i].p_vaddr); + } + dprintf(1, "\t%s (%p)\n", lib->name, lib->base); + } } if (app->tls_size) { app->tls_id = tls_cnt = 1;