From: Rich Felker Date: Sat, 20 Oct 2012 01:41:30 +0000 (-0400) Subject: fix breakage in dlsym for looking up RTLD_DEFAULT, etc. X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=commitdiff_plain;h=deb15b3cf23cb6093f439f7b37eaeb1263df5399;hp=dde325d7b3ff6332dc0c24e29f8827b1b16bdd92 fix breakage in dlsym for looking up RTLD_DEFAULT, etc. this was broken during the early dynamic-linked TLS commits, which rearranged some of the code for handling new relocation types. --- diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index 2ec8fb8c..39a27608 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -1080,11 +1080,14 @@ static void *do_dlsym(struct dso *p, const char *s, void *ra) uint32_t h = 0, gh = 0; Sym *sym; if (p == head || p == RTLD_DEFAULT || p == RTLD_NEXT) { - if (p == RTLD_NEXT) { + if (p == RTLD_DEFAULT) { + p = head; + } else if (p == RTLD_NEXT) { for (p=head; p && (unsigned char *)ra-p->map>p->map_len; p=p->next); if (!p) p=head; + p = p->next; } - struct symdef def = find_sym(p->next, s, 0); + struct symdef def = find_sym(p, s, 0); if (!def.sym) goto failed; return def.dso->base + def.sym->st_value; }