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.
This commit is contained in:
parent
dde325d7b3
commit
deb15b3cf2
1 changed files with 5 additions and 2 deletions
|
|
@ -1080,11 +1080,14 @@ static void *do_dlsym(struct dso *p, const char *s, void *ra)
|
||||||
uint32_t h = 0, gh = 0;
|
uint32_t h = 0, gh = 0;
|
||||||
Sym *sym;
|
Sym *sym;
|
||||||
if (p == head || p == RTLD_DEFAULT || p == RTLD_NEXT) {
|
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);
|
for (p=head; p && (unsigned char *)ra-p->map>p->map_len; p=p->next);
|
||||||
if (!p) p=head;
|
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;
|
if (!def.sym) goto failed;
|
||||||
return def.dso->base + def.sym->st_value;
|
return def.dso->base + def.sym->st_value;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue