diff options
author | Mike Frysinger <vapier@gentoo.org> | 2009-10-15 16:15:59 -0400 |
---|---|---|
committer | Mike Frysinger <vapier@gentoo.org> | 2009-10-15 17:09:23 -0400 |
commit | 1f5e333a158f4398437287b8b64260371422194f (patch) | |
tree | 93d3ccf85cd0e03d9d534a615af1646123e433ec /ldso/libdl/libdl.c | |
parent | 21cec43543081b47f9f7d5860af44d04c92746cd (diff) |
ldso: clean up breakage in tls merge
The TLS merge 534661b91c9849 introduced multiple style problems as well as
random breakage:
- missing _dl_free
- incomplete parametrization of _dl_lookup_hash
- restore FDPIC handling in _dl_lookup_hash
Signed-off-by: Mike Frysinger <vapier@gentoo.org>
Diffstat (limited to 'ldso/libdl/libdl.c')
-rw-r--r-- | ldso/libdl/libdl.c | 39 |
1 files changed, 14 insertions, 25 deletions
diff --git a/ldso/libdl/libdl.c b/ldso/libdl/libdl.c index d1c61f744..22b622d28 100644 --- a/ldso/libdl/libdl.c +++ b/ldso/libdl/libdl.c @@ -671,7 +671,7 @@ void *dlsym(void *vhandle, const char *name) ret = _dl_find_hash(name2, handle, NULL, 0, &tls_tpnt); #if defined USE_TLS && defined SHARED - if(tls_tpnt) { + if (tls_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 *)tls_tpnt, (Elf32_Addr)ret); @@ -776,8 +776,7 @@ static int do_dlclose(void *vhandle, int need_fini) tls_lmap = (struct link_map *) tpnt; /* Remove the object from the dtv slotinfo array if it uses TLS. */ - if (__builtin_expect (tls_lmap->l_tls_blocksize > 0, 0)) - { + if (__builtin_expect (tls_lmap->l_tls_blocksize > 0, 0)) { any_tls = true; if (_dl_tls_dtv_slotinfo_list != NULL @@ -787,8 +786,7 @@ static int do_dlclose(void *vhandle, int need_fini) /* All dynamically loaded modules with TLS are unloaded. */ _dl_tls_max_dtv_idx = _dl_tls_static_nelem; - if (tls_lmap->l_tls_offset != NO_TLS_OFFSET) - { + if (tls_lmap->l_tls_offset != NO_TLS_OFFSET) { /* * Collect a contiguous chunk built from the objects in * this search list, going in either direction. When the @@ -797,8 +795,7 @@ static int do_dlclose(void *vhandle, int need_fini) */ # if defined(TLS_TCB_AT_TP) if (tls_free_start == NO_TLS_OFFSET - || (size_t) tls_lmap->l_tls_offset == tls_free_start) - { + || (size_t) tls_lmap->l_tls_offset == tls_free_start) { /* Extend the contiguous chunk being reclaimed. */ tls_free_start = tls_lmap->l_tls_offset - @@ -806,31 +803,26 @@ static int do_dlclose(void *vhandle, int need_fini) if (tls_free_end == NO_TLS_OFFSET) tls_free_end = tls_lmap->l_tls_offset; - } - else if (tls_lmap->l_tls_offset - tls_lmap->l_tls_blocksize + } else if (tls_lmap->l_tls_offset - tls_lmap->l_tls_blocksize == tls_free_end) /* Extend the chunk backwards. */ tls_free_end = tls_lmap->l_tls_offset; - else - { + else { /* * This isn't contiguous with the last chunk freed. * One of them will be leaked unless we can free * one block right away. */ - if (tls_free_end == _dl_tls_static_used) - { + if (tls_free_end == _dl_tls_static_used) { _dl_tls_static_used = tls_free_start; tls_free_end = tls_lmap->l_tls_offset; tls_free_start = tls_free_end - tls_lmap->l_tls_blocksize; - } - else if ((size_t) tls_lmap->l_tls_offset + } else if ((size_t) tls_lmap->l_tls_offset == _dl_tls_static_used) _dl_tls_static_used = tls_lmap->l_tls_offset - tls_lmap->l_tls_blocksize; - else if (tls_free_end < (size_t) tls_lmap->l_tls_offset) - { + else if (tls_free_end < (size_t) tls_lmap->l_tls_offset) { /* * We pick the later block. It has a chance * to be freed. @@ -848,8 +840,7 @@ static int do_dlclose(void *vhandle, int need_fini) == tls_free_start) /* Extend the chunk backwards. */ tls_free_start = tls_lmap->l_tls_offset; - else - { + else { /* * This isn't contiguous with the last chunk * freed. One of them will be leaked. @@ -870,7 +861,7 @@ static int do_dlclose(void *vhandle, int need_fini) dtv_t *dtv = THREAD_DTV (); _dl_assert(!(dtv[tls_lmap->l_tls_modid].pointer.is_static)); - if(dtv[tls_lmap->l_tls_modid].pointer.val != TLS_DTV_UNALLOCATED) { + if (dtv[tls_lmap->l_tls_modid].pointer.val != TLS_DTV_UNALLOCATED) { /* Note that free is called for NULL is well. We deallocate even if it is this dtv entry we are supposed to load. The reason is that we call @@ -935,11 +926,9 @@ static int do_dlclose(void *vhandle, int need_fini) #if USE_TLS /* If we removed any object which uses TLS bump the generation counter. */ - if (any_tls) - { - if (__builtin_expect (++_dl_tls_generation == 0, 0)) - { - _dl_debug_early ("TLS generation counter wrapped! Please report to the uClibc mailing list.\n"); + if (any_tls) { + if (__builtin_expect(++_dl_tls_generation == 0, 0)) { + _dl_debug_early("TLS generation counter wrapped! Please report to the uClibc mailing list.\n"); _dl_exit(30); } |