summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFilippo Arcidiacono <filippo.arcidiacono@st.com>2011-01-25 10:49:27 +0100
committerCarmelo Amoroso <carmelo.amoroso@st.com>2011-01-25 13:31:21 +0100
commitc0e02109219a857fc94a26a9eb07d60527730073 (patch)
tree3124e689de52f4911d29927803997ead3c2cbaca
parent2aee0efdec50321ffbe6891c593611461cc7b16e (diff)
libdl: fix tls symbol lookup in dlsym
Due to merge with prelink, the sym_ref.tpnt is always set when the symbol is found, so it needs to call the _dl_tls_symaddr only for tls symbols. Signed-off-by: Filippo Arcidiacono <filippo.arcidiacono@st.com> Signed-off-by: Carmelo Amoroso <carmelo.amoroso@st.com>
-rw-r--r--ldso/libdl/libdl.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/ldso/libdl/libdl.c b/ldso/libdl/libdl.c
index f95341be7..5007a7e65 100644
--- a/ldso/libdl/libdl.c
+++ b/ldso/libdl/libdl.c
@@ -710,7 +710,7 @@ void *dlsym(void *vhandle, const char *name)
ret = _dl_find_hash(name2, &handle->dyn->symbol_scope, tpnt, 0, &sym_ref);
#if defined(USE_TLS) && USE_TLS && defined SHARED
- if (sym_ref.tpnt) {
+ if (sym_ref.sym && (ELF_ST_TYPE(sym_ref.sym->st_info) == STT_TLS) && (sym_ref.tpnt)) {
/* The found symbol is a thread-local storage variable.
Return the address for to the current thread. */
ret = _dl_tls_symaddr ((struct link_map *)sym_ref.tpnt, (Elf32_Addr)ret);