summaryrefslogtreecommitdiffstats
path: root/libexec/rtld-elf/rtld.c
diff options
context:
space:
mode:
authorkib <kib@FreeBSD.org>2012-03-29 10:32:34 +0000
committerkib <kib@FreeBSD.org>2012-03-29 10:32:34 +0000
commit81a11f565514daa971880607e39b7665d02b5c91 (patch)
tree65be9b6f62c387e35eb0384f32b391fe0d7aaef5 /libexec/rtld-elf/rtld.c
parent0c8f817a7485d420698eeb115e8f4e757ab34029 (diff)
downloadFreeBSD-src-81a11f565514daa971880607e39b7665d02b5c91.zip
FreeBSD-src-81a11f565514daa971880607e39b7665d02b5c91.tar.gz
Import DragonFly BSD commit
From: Sascha Wildner <saw@online.de> Date: Fri, 2 Mar 2012 09:15:56 +0000 (+0100) Subject: rtld: Add a special case in do_dlsym() for TLS stored symbols. X-Git-Url: http://gitweb.dragonflybsd.org/dragonfly.git/commitdiff_plain/1388aaafe730c85693936aaf9bc6d83fc2d981be?hp=bca4412595a8979ab9f1bf36068c806ce88a667a rtld: Add a special case in do_dlsym() for TLS stored symbols. Submitted-by: Markus Pfeiffer <markus.pfeiffer@morphism.de> Discussed with: kan MFC after: 1 week
Diffstat (limited to 'libexec/rtld-elf/rtld.c')
-rw-r--r--libexec/rtld-elf/rtld.c7
1 files changed, 6 insertions, 1 deletions
diff --git a/libexec/rtld-elf/rtld.c b/libexec/rtld-elf/rtld.c
index c4607b2..828b8b4 100644
--- a/libexec/rtld-elf/rtld.c
+++ b/libexec/rtld-elf/rtld.c
@@ -2618,6 +2618,7 @@ do_dlsym(void *handle, const char *name, void *retaddr, const Ver_Entry *ve,
const Elf_Sym *def;
SymLook req;
RtldLockState lockstate;
+ tls_index ti;
int res;
def = NULL;
@@ -2732,7 +2733,11 @@ do_dlsym(void *handle, const char *name, void *retaddr, const Ver_Entry *ve,
return (make_function_pointer(def, defobj));
else if (ELF_ST_TYPE(def->st_info) == STT_GNU_IFUNC)
return (rtld_resolve_ifunc(defobj, def));
- else
+ else if (ELF_ST_TYPE(def->st_info) == STT_TLS) {
+ ti.ti_module = defobj->tlsindex;
+ ti.ti_offset = def->st_value;
+ return (__tls_get_addr(&ti));
+ } else
return (defobj->relocbase + def->st_value);
}
OpenPOWER on IntegriCloud