X-Git-Url: http://nsz.repo.hu/git/?p=musl;a=blobdiff_plain;f=src%2Fldso%2Fdynlink.c;h=a6dbaf0187c1dce0a40c1afceea7f01e0f05c6c2;hp=39a276088fe106c8f33e653bb2eae4918adb756e;hb=0a1c2c1c1755d03d7d3db11df612bbe7c5b69c46;hpb=deb15b3cf23cb6093f439f7b37eaeb1263df5399 diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c index 39a27608..a6dbaf01 100644 --- a/src/ldso/dynlink.c +++ b/src/ldso/dynlink.c @@ -1089,6 +1089,8 @@ static void *do_dlsym(struct dso *p, const char *s, void *ra) } struct symdef def = find_sym(p, s, 0); if (!def.sym) goto failed; + if ((def.sym->st_info&0xf) == STT_TLS) + return __tls_get_addr((size_t []){def.dso->tls_id, def.sym->st_value}); return def.dso->base + def.sym->st_value; } if (p->ghashtab) { @@ -1098,6 +1100,8 @@ static void *do_dlsym(struct dso *p, const char *s, void *ra) h = sysv_hash(s); sym = sysv_lookup(s, h, p); } + if (sym && (sym->st_info&0xf) == STT_TLS) + return __tls_get_addr((size_t []){p->tls_id, sym->st_value}); if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES)) return p->base + sym->st_value; if (p->deps) for (i=0; p->deps[i]; i++) { @@ -1108,6 +1112,8 @@ static void *do_dlsym(struct dso *p, const char *s, void *ra) if (!h) h = sysv_hash(s); sym = sysv_lookup(s, h, p->deps[i]); } + if (sym && (sym->st_info&0xf) == STT_TLS) + return __tls_get_addr((size_t []){p->deps[i]->tls_id, sym->st_value}); if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES)) return p->deps[i]->base + sym->st_value; }