make ldd report the libc/dynamic linker itself
authorRich Felker <dalias@aerifal.cx>
Fri, 26 Jul 2013 18:41:12 +0000 (14:41 -0400)
committerRich Felker <dalias@aerifal.cx>
Fri, 26 Jul 2013 18:41:12 +0000 (14:41 -0400)
src/ldso/dynlink.c

index ff416838a65caba4d6493db0729c38303fae1f32..1ef981ae9b8fbbeeeb855aa67b19c50e5a3ae327 100644 (file)
@@ -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;
@@ -941,6 +953,16 @@ void *__dynlink(int argc, char **argv)
                lib->name = ldname;
                app->name = argv[0];
                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; i<app->phnum; 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;