projects
/
musl
/ commitdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
| commitdiff |
tree
raw
|
patch
|
inline
| side by side (parent:
deb15b3
)
support looking up thread-local objects with dlsym
author
Rich Felker
<dalias@aerifal.cx>
Sat, 20 Oct 2012 01:57:56 +0000
(21:57 -0400)
committer
Rich Felker
<dalias@aerifal.cx>
Sat, 20 Oct 2012 01:57:56 +0000
(21:57 -0400)
src/ldso/dynlink.c
patch
|
blob
|
history
diff --git
a/src/ldso/dynlink.c
b/src/ldso/dynlink.c
index
39a2760
..
a6dbaf0
100644
(file)
--- 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;
}
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) {
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);
}
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++) {
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 (!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;
}
if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES))
return p->deps[i]->base + sym->st_value;
}