projects
/
musl
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
876748e
)
make ldd report the libc/dynamic linker itself
author
Rich Felker
<dalias@aerifal.cx>
Fri, 26 Jul 2013 18:41:12 +0000
(14:41 -0400)
committer
Rich Felker
<dalias@aerifal.cx>
Fri, 26 Jul 2013 18:41:12 +0000
(14:41 -0400)
src/ldso/dynlink.c
patch
|
blob
|
history
diff --git
a/src/ldso/dynlink.c
b/src/ldso/dynlink.c
index
ff41683
..
1ef981a
100644
(file)
--- 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) {
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;
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;
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;
}
if (app->tls_size) {
app->tls_id = tls_cnt = 1;