diff options
author | Waldemar Brodkorb <wbx@openadk.org> | 2014-07-05 13:20:23 +0200 |
---|---|---|
committer | Waldemar Brodkorb <wbx@openadk.org> | 2014-07-05 13:21:37 +0200 |
commit | 5ce7c00aadc63e34d8629b36b8c7cf3c9ee0c380 (patch) | |
tree | 665868894292c3e90a7af5d8778da6a631fc8223 /toolchain/uclibc | |
parent | f5332c1a325054bec10a11a42b6f0456ad2dea27 (diff) |
remove addon patches
Diffstat (limited to 'toolchain/uclibc')
-rw-r--r-- | toolchain/uclibc/patches/xxx-origin.patch | 177 | ||||
-rw-r--r-- | toolchain/uclibc/patches/xxx-sparc-wait4.patch | 12 | ||||
-rw-r--r-- | toolchain/uclibc/patches/xxx-xtensa-nptl.patch | 3515 |
3 files changed, 0 insertions, 3704 deletions
diff --git a/toolchain/uclibc/patches/xxx-origin.patch b/toolchain/uclibc/patches/xxx-origin.patch deleted file mode 100644 index 42b524017..000000000 --- a/toolchain/uclibc/patches/xxx-origin.patch +++ /dev/null @@ -1,177 +0,0 @@ -diff -Nur uClibc-git/ldso/ldso/dl-elf.c uClibc-origin/ldso/ldso/dl-elf.c ---- uClibc-git/ldso/ldso/dl-elf.c 2014-02-03 12:32:56.000000000 +0100 -+++ uClibc-origin/ldso/ldso/dl-elf.c 2014-02-17 14:44:13.000000000 +0100 -@@ -133,56 +133,59 @@ - * in uClibc/ldso/util/ldd.c */ - static struct elf_resolve * - search_for_named_library(const char *name, unsigned rflags, const char *path_list, -- struct dyn_elf **rpnt) -+ struct dyn_elf **rpnt, const char *origin) - { -- char *path, *path_n, *mylibname; -+ char *mylibname; -+ const char *p, *pn; - struct elf_resolve *tpnt; -- int done; -+ int plen; - - if (path_list==NULL) - return NULL; - -- /* We need a writable copy of this string, but we don't -- * need this allocated permanently since we don't want -- * to leak memory, so use alloca to put path on the stack */ -- done = _dl_strlen(path_list); -- path = alloca(done + 1); -- - /* another bit of local storage */ - mylibname = alloca(2050); - -- _dl_memcpy(path, path_list, done+1); -- - /* Unlike ldd.c, don't bother to eliminate double //s */ - - /* Replace colons with zeros in path_list */ - /* : at the beginning or end of path maps to CWD */ - /* :: anywhere maps CWD */ - /* "" maps to CWD */ -- done = 0; -- path_n = path; -- do { -- if (*path == 0) { -- *path = ':'; -- done = 1; -+ for (p = path_list; p != NULL; p = pn) { -+ pn = _dl_strchr(p + 1, ':'); -+ if (pn != NULL) { -+ plen = pn - p; -+ pn++; -+ } else -+ plen = _dl_strlen(p); -+ -+ if (plen >= 7 && _dl_memcmp(p, "$ORIGIN", 7) == 0) { -+ int olen; -+ if (rflags && plen != 7) -+ continue; -+ if (origin == NULL) -+ continue; -+ for (olen = _dl_strlen(origin) - 1; olen >= 0 && origin[olen] != '/'; olen--) -+ ; -+ if (olen <= 0) -+ continue; -+ _dl_memcpy(&mylibname[0], origin, olen); -+ _dl_memcpy(&mylibname[olen], p + 7, plen - 7); -+ mylibname[olen + plen - 7] = 0; -+ } else if (plen != 0) { -+ _dl_memcpy(mylibname, p, plen); -+ mylibname[plen] = 0; -+ } else { -+ _dl_strcpy(mylibname, "."); - } -- if (*path == ':') { -- *path = 0; -- if (*path_n) -- _dl_strcpy(mylibname, path_n); -- else -- _dl_strcpy(mylibname, "."); /* Assume current dir if empty path */ -- _dl_strcat(mylibname, "/"); -- _dl_strcat(mylibname, name); --#ifdef __LDSO_SAFE_RUNPATH__ -- if (*mylibname == '/') --#endif -- if ((tpnt = _dl_load_elf_shared_library(rflags, rpnt, mylibname)) != NULL) -- return tpnt; -- path_n = path+1; -- } -- path++; -- } while (!done); -+ _dl_strcat(mylibname, "/"); -+ _dl_strcat(mylibname, name); -+ -+ tpnt = _dl_load_elf_shared_library(rflags, rpnt, mylibname); -+ if (tpnt != NULL) -+ return tpnt; -+ } - return NULL; - } - -@@ -234,7 +237,7 @@ - if (pnt) { - pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB]; - _dl_if_debug_dprint("\tsearching RPATH='%s'\n", pnt); -- if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt)) != NULL) -+ if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt, tpnt->libname)) != NULL) - return tpnt1; - } - #endif -@@ -243,7 +246,7 @@ - /* Check in LD_{ELF_}LIBRARY_PATH, if specified and allowed */ - if (_dl_library_path) { - _dl_if_debug_dprint("\tsearching LD_LIBRARY_PATH='%s'\n", _dl_library_path); -- if ((tpnt1 = search_for_named_library(libname, rflags, _dl_library_path, rpnt)) != NULL) -+ if ((tpnt1 = search_for_named_library(libname, rflags, _dl_library_path, rpnt, NULL)) != NULL) - { - return tpnt1; - } -@@ -257,7 +260,7 @@ - if (pnt) { - pnt += (unsigned long) tpnt->dynamic_info[DT_STRTAB]; - _dl_if_debug_dprint("\tsearching RUNPATH='%s'\n", pnt); -- if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt)) != NULL) -+ if ((tpnt1 = search_for_named_library(libname, rflags, pnt, rpnt, NULL)) != NULL) - return tpnt1; - } - #endif -@@ -291,7 +294,7 @@ - /* Look for libraries wherever the shared library loader - * was installed */ - _dl_if_debug_dprint("\tsearching ldso dir='%s'\n", _dl_ldsopath); -- tpnt1 = search_for_named_library(libname, rflags, _dl_ldsopath, rpnt); -+ tpnt1 = search_for_named_library(libname, rflags, _dl_ldsopath, rpnt, NULL); - if (tpnt1 != NULL) - return tpnt1; - #endif -@@ -304,7 +307,7 @@ - #ifndef __LDSO_CACHE_SUPPORT__ - ":" UCLIBC_RUNTIME_PREFIX "usr/X11R6/lib" - #endif -- , rpnt); -+ , rpnt, NULL); - if (tpnt1 != NULL) - return tpnt1; - -diff -Nur uClibc-git/ldso/ldso/ldso.c uClibc-origin/ldso/ldso/ldso.c ---- uClibc-git/ldso/ldso/ldso.c 2014-02-03 12:32:56.000000000 +0100 -+++ uClibc-origin/ldso/ldso/ldso.c 2014-02-17 12:34:00.000000000 +0100 -@@ -403,6 +403,20 @@ - return p - list; - } - -+static void _dl_setup_progname(const char *argv0) -+{ -+ char image[PATH_MAX]; -+ ssize_t s; -+ -+ s = _dl_readlink("/proc/self/exe", image, sizeof(image)); -+ if (s > 0 && image[0] == '/') { -+ image[s] = 0; -+ _dl_progname = _dl_strdup(image); -+ } else if (argv0) { -+ _dl_progname = argv0; -+ } -+} -+ - void *_dl_get_ready_to_run(struct elf_resolve *tpnt, DL_LOADADDR_TYPE load_addr, - ElfW(auxv_t) auxvt[AT_EGID + 1], char **envp, char **argv - DL_GET_READY_TO_RUN_EXTRA_PARMS) -@@ -454,9 +468,7 @@ - * been fixed up by now. Still no function calls outside of this - * library, since the dynamic resolver is not yet ready. - */ -- if (argv[0]) { -- _dl_progname = argv[0]; -- } -+ _dl_setup_progname(argv[0]); - - #ifdef __DSBT__ - _dl_ldso_dsbt = (void *)tpnt->dynamic_info[DT_DSBT_BASE_IDX]; diff --git a/toolchain/uclibc/patches/xxx-sparc-wait4.patch b/toolchain/uclibc/patches/xxx-sparc-wait4.patch deleted file mode 100644 index e219ed773..000000000 --- a/toolchain/uclibc/patches/xxx-sparc-wait4.patch +++ /dev/null @@ -1,12 +0,0 @@ -diff -Nur uClibc-0.9.33.2.orig/include/sys/wait.h uClibc-0.9.33.2/include/sys/wait.h ---- uClibc-0.9.33.2.orig/include/sys/wait.h 2014-03-01 19:15:53.000000000 +0100 -+++ uClibc-0.9.33.2/include/sys/wait.h 2014-03-01 19:16:42.000000000 +0100 -@@ -176,7 +176,7 @@ - #endif /* Use BSD. */ - - #ifdef _LIBC --extern __pid_t __wait4_nocancel(__pid_t, __WAIT_STATUS, int, struct rusage *) attribute_hidden; -+extern __pid_t __wait4_nocancel(__pid_t, __WAIT_STATUS, int, struct rusage *); - #endif - - diff --git a/toolchain/uclibc/patches/xxx-xtensa-nptl.patch b/toolchain/uclibc/patches/xxx-xtensa-nptl.patch deleted file mode 100644 index 16241e161..000000000 --- a/toolchain/uclibc/patches/xxx-xtensa-nptl.patch +++ /dev/null @@ -1,3515 +0,0 @@ -diff -Nur uClibc-git/include/elf.h uClibc-xtensa/include/elf.h ---- uClibc-git/include/elf.h 2014-06-02 17:40:33.826710944 +0200 -+++ uClibc-xtensa/include/elf.h 2014-06-03 16:03:19.065886532 +0200 -@@ -3072,8 +3071,11 @@ - #define R_XTENSA_SLOT12_ALT 47 - #define R_XTENSA_SLOT13_ALT 48 - #define R_XTENSA_SLOT14_ALT 49 -+#define R_XTENSA_TLSDESC_FN 50 -+#define R_XTENSA_TLSDESC_ARG 51 -+#define R_XTENSA_TLS_TPOFF 53 - /* Keep this the last entry. */ --#define R_XTENSA_NUM 50 -+#define R_XTENSA_NUM 54 - - /* C6X specific relocs */ - #define R_C6000_NONE 0 -diff -Nur uClibc-git/include/link.h uClibc-xtensa/include/link.h ---- uClibc-git/include/link.h 2014-06-02 17:40:33.846711055 +0200 -+++ uClibc-xtensa/include/link.h 2014-06-03 15:28:27.185347373 +0200 -@@ -132,6 +132,8 @@ - size_t l_tls_modid; - /* Nonzero if _dl_init_static_tls should be called for this module */ - unsigned int l_need_tls_init:1; -+ /* Address of TLS descriptor hash table. */ -+ void *l_tlsdesc_table; - #endif - #endif - }; -diff -Nur uClibc-git/ldso/include/dl-hash.h uClibc-xtensa/ldso/include/dl-hash.h ---- uClibc-git/ldso/include/dl-hash.h 2014-06-02 17:40:33.902711365 +0200 -+++ uClibc-xtensa/ldso/include/dl-hash.h 2014-06-03 15:29:09.505536959 +0200 -@@ -70,6 +70,8 @@ - size_t l_tls_modid; - /* Nonzero if _dl_init_static_tls should be called for this module */ - unsigned int l_need_tls_init:1; -+ /* Address of TLS descriptor hash table. */ -+ void *l_tlsdesc_table; - #endif - - ElfW(Addr) mapaddr; -diff -Nur uClibc-git/ldso/include/inline-hashtab.h uClibc-xtensa/ldso/include/inline-hashtab.h ---- uClibc-git/ldso/include/inline-hashtab.h 1970-01-01 01:00:00.000000000 +0100 -+++ uClibc-xtensa/ldso/include/inline-hashtab.h 2014-06-03 11:57:42.031052092 +0200 -@@ -0,0 +1,265 @@ -+/* -+ * The hashcode handling code below is heavily inspired in libiberty's -+ * hashtab code, but with most adaptation points and support for -+ * deleting elements removed. -+ * -+ * Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. -+ * Contributed by Vladimir Makarov (vmakarov@cygnus.com). -+ */ -+ -+#ifndef INLINE_HASHTAB_H -+# define INLINE_HASHTAB_H 1 -+ -+static __always_inline unsigned long -+higher_prime_number(unsigned long n) -+{ -+ /* These are primes that are near, but slightly smaller than, a power of two. */ -+ static const unsigned long primes[] = { -+ 7, -+ 13, -+ 31, -+ 61, -+ 127, -+ 251, -+ 509, -+ 1021, -+ 2039, -+ 4093, -+ 8191, -+ 16381, -+ 32749, -+ 65521, -+ 131071, -+ 262139, -+ 524287, -+ 1048573, -+ 2097143, -+ 4194301, -+ 8388593, -+ 16777213, -+ 33554393, -+ 67108859, -+ 134217689, -+ 268435399, -+ 536870909, -+ 1073741789, -+ /* 4294967291 */ -+ ((unsigned long) 2147483647) + ((unsigned long) 2147483644), -+ }; -+ const unsigned long *low = &primes[0]; -+ const unsigned long *high = &primes[ARRAY_SIZE(primes)]; -+ -+ while (low != high) { -+ const unsigned long *mid = low + (high - low) / 2; -+ if (n > *mid) -+ low = mid + 1; -+ else -+ high = mid; -+ } -+ -+#if 0 -+ /* If we've run out of primes, abort. */ -+ if (n > *low) { -+ fprintf(stderr, "Cannot find prime bigger than %lu\n", n); -+ abort(); -+ } -+#endif -+ -+ return *low; -+} -+ -+struct funcdesc_ht -+{ -+ /* Table itself */ -+ void **entries; -+ -+ /* Current size (in entries) of the hash table */ -+ size_t size; -+ -+ /* Current number of elements */ -+ size_t n_elements; -+}; -+ -+static __always_inline struct funcdesc_ht * -+htab_create(void) -+{ -+ struct funcdesc_ht *ht = _dl_malloc(sizeof(*ht)); -+ size_t ent_size; -+ -+ if (!ht) -+ return NULL; -+ ht->size = 3; -+ ent_size = sizeof(void *) * ht->size; -+ ht->entries = _dl_malloc(ent_size); -+ if (!ht->entries) -+ return NULL; -+ -+ ht->n_elements = 0; -+ _dl_memset(ht->entries, 0, ent_size); -+ -+ return ht; -+} -+ -+/* -+ * This is only called from _dl_loadaddr_unmap, so it's safe to call -+ * _dl_free(). See the discussion below. -+ */ -+static __always_inline void -+htab_delete(struct funcdesc_ht *htab) -+{ -+ size_t i; -+ -+ for (i = htab->size - 1; i >= 0; i--) -+ if (htab->entries[i]) -+ _dl_free(htab->entries[i]); -+ -+ _dl_free(htab->entries); -+ _dl_free(htab); -+} -+ -+/* -+ * Similar to htab_find_slot, but without several unwanted side effects: -+ * - Does not call htab->eq_f when it finds an existing entry. -+ * - Does not change the count of elements/searches/collisions in the -+ * hash table. -+ * This function also assumes there are no deleted entries in the table. -+ * HASH is the hash value for the element to be inserted. -+ */ -+static __always_inline void ** -+find_empty_slot_for_expand(struct funcdesc_ht *htab, int hash) -+{ -+ size_t size = htab->size; -+ unsigned int index = hash % size; -+ void **slot = htab->entries + index; -+ int hash2; -+ -+ if (!*slot) -+ return slot; -+ -+ hash2 = 1 + hash % (size - 2); -+ for (;;) { -+ index += hash2; -+ if (index >= size) -+ index -= size; -+ -+ slot = htab->entries + index; -+ if (!*slot) -+ return slot; -+ } -+} -+ -+/* -+ * The following function changes size of memory allocated for the -+ * entries and repeatedly inserts the table elements. The occupancy -+ * of the table after the call will be about 50%. Naturally the hash -+ * table must already exist. Remember also that the place of the -+ * table entries is changed. If memory allocation failures are allowed, -+ * this function will return zero, indicating that the table could not be -+ * expanded. If all goes well, it will return a non-zero value. -+ */ -+static __always_inline int -+htab_expand(struct funcdesc_ht *htab, int (*hash_fn) (void *)) -+{ -+ void **oentries; -+ void **olimit; -+ void **p; -+ void **nentries; -+ size_t nsize; -+ -+ oentries = htab->entries; -+ olimit = oentries + htab->size; -+ -+ /* -+ * Resize only when table after removal of unused elements is either -+ * too full or too empty. -+ */ -+ if (htab->n_elements * 2 > htab->size) -+ nsize = higher_prime_number(htab->n_elements * 2); -+ else -+ nsize = htab->size; -+ -+ nentries = _dl_malloc(sizeof(*nentries) * nsize); -+ _dl_memset(nentries, 0, sizeof(*nentries) * nsize); -+ if (nentries == NULL) -+ return 0; -+ htab->entries = nentries; -+ htab->size = nsize; -+ -+ p = oentries; -+ do { -+ if (*p) -+ *find_empty_slot_for_expand(htab, hash_fn(*p)) = *p; -+ p++; -+ } while (p < olimit); -+ -+#if 0 -+ /* -+ * We can't tell whether this was allocated by the _dl_malloc() -+ * built into ld.so or malloc() in the main executable or libc, -+ * and calling free() for something that wasn't malloc()ed could -+ * do Very Bad Things (TM). Take the conservative approach -+ * here, potentially wasting as much memory as actually used by -+ * the hash table, even if multiple growths occur. That's not -+ * so bad as to require some overengineered solution that would -+ * enable us to keep track of how it was allocated. -+ */ -+ _dl_free(oentries); -+#endif -+ return 1; -+} -+ -+/* -+ * This function searches for a hash table slot containing an entry -+ * equal to the given element. To delete an entry, call this with -+ * INSERT = 0, then call htab_clear_slot on the slot returned (possibly -+ * after doing some checks). To insert an entry, call this with -+ * INSERT = 1, then write the value you want into the returned slot. -+ * When inserting an entry, NULL may be returned if memory allocation -+ * fails. -+ */ -+static __always_inline void ** -+htab_find_slot(struct funcdesc_ht *htab, void *ptr, int insert, -+ int (*hash_fn)(void *), int (*eq_fn)(void *, void *)) -+{ -+ unsigned int index; -+ int hash, hash2; -+ size_t size; -+ void **entry; -+ -+ if (htab->size * 3 <= htab->n_elements * 4 && -+ htab_expand(htab, hash_fn) == 0) -+ return NULL; -+ -+ hash = hash_fn(ptr); -+ -+ size = htab->size; -+ index = hash % size; -+ -+ entry = &htab->entries[index]; -+ if (!*entry) -+ goto empty_entry; -+ else if (eq_fn(*entry, ptr)) -+ return entry; -+ -+ hash2 = 1 + hash % (size - 2); -+ for (;;) { -+ index += hash2; -+ if (index >= size) -+ index -= size; -+ -+ entry = &htab->entries[index]; -+ if (!*entry) -+ goto empty_entry; -+ else if (eq_fn(*entry, ptr)) -+ return entry; -+ } -+ -+ empty_entry: -+ if (!insert) -+ return NULL; -+ -+ htab->n_elements++; -+ return entry; -+} -+ -+#endif -diff -Nur uClibc-git/ldso/include/ldsodefs.h uClibc-xtensa/ldso/include/ldsodefs.h ---- uClibc-git/ldso/include/ldsodefs.h 2014-06-02 17:40:33.922711475 +0200 -+++ uClibc-xtensa/ldso/include/ldsodefs.h 2014-06-03 16:10:51.175659505 +0200 -@@ -62,13 +62,18 @@ - - extern void _dl_allocate_static_tls (struct link_map *map) - internal_function attribute_hidden; -+extern int _dl_try_allocate_static_tls (struct link_map* map) -+ internal_function attribute_hidden; - - /* Taken from glibc/elf/dl-reloc.c */ - #define CHECK_STATIC_TLS(sym_map) \ - do { \ -- if (unlikely((sym_map)->l_tls_offset == NO_TLS_OFFSET)) \ -+ if (__builtin_expect ((sym_map)->l_tls_offset == NO_TLS_OFFSET, 0)) \ - _dl_allocate_static_tls (sym_map); \ - } while (0) -+#define TRY_STATIC_TLS(sym_map) \ -+ (__builtin_expect ((sym_map)->l_tls_offset != NO_TLS_OFFSET, 1) \ -+ || _dl_try_allocate_static_tls (sym_map) == 0) - - /* These are internal entry points to the two halves of _dl_allocate_tls, - only used within rtld.c itself at startup time. */ -diff -Nur uClibc-git/ldso/include/tlsdeschtab.h uClibc-xtensa/ldso/include/tlsdeschtab.h ---- uClibc-git/ldso/include/tlsdeschtab.h 1970-01-01 01:00:00.000000000 +0100 -+++ uClibc-xtensa/ldso/include/tlsdeschtab.h 2014-06-03 14:58:29.681335708 +0200 -@@ -0,0 +1,119 @@ -+/* Hash table for TLS descriptors. -+ Copyright (C) 2005-2013 Free Software Foundation, Inc. -+ This file is part of the GNU C Library. -+ Contributed by Alexandre Oliva <aoliva@redhat.com> -+ -+ uClibc port by Baruch Siach <baruch@tkos.co.il> -+ -+ The GNU C Library is free software; you can redistribute it and/or -+ modify it under the terms of the GNU Lesser General Public -+ License as published by the Free Software Foundation; either -+ version 2.1 of the License, or (at your option) any later version. -+ -+ The GNU C Library is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+ Lesser General Public License for more details. -+ -+ You should have received a copy of the GNU Lesser General Public -+ License along with the GNU C Library; if not, see -+ <http://www.gnu.org/licenses/>. */ -+ -+#ifndef TLSDESCHTAB_H -+# define TLSDESCHTAB_H 1 -+ -+# ifdef SHARED -+ -+# include <inline-hashtab.h> -+ -+inline static int -+hash_tlsdesc (void *p) -+{ -+ struct tlsdesc_dynamic_arg *td = p; -+ -+ /* We know all entries are for the same module, so ti_offset is the -+ only distinguishing entry. */ -+ return td->tlsinfo.ti_offset; -+} -+ -+inline static int -+eq_tlsdesc (void *p, void *q) -+{ -+ struct tlsdesc_dynamic_arg *tdp = p, *tdq = q; -+ -+ return tdp->tlsinfo.ti_offset == tdq->tlsinfo.ti_offset; -+} -+ -+inline static int -+map_generation (struct link_map *map) -+{ -+ size_t idx = map->l_tls_modid; -+ struct dtv_slotinfo_list *listp = GL(dl_tls_dtv_slotinfo_list); -+ -+ /* Find the place in the dtv slotinfo list. */ -+ do -+ { -+ /* Does it fit in the array of this list element? */ -+ if (idx < listp->len) -+ { -+ /* We should never get here for a module in static TLS, so -+ we can assume that, if the generation count is zero, we -+ still haven't determined the generation count for this -+ module. */ -+ if (listp->slotinfo[idx].gen) -+ return listp->slotinfo[idx].gen; -+ else -+ break; -+ } -+ idx -= listp->len; -+ listp = listp->next; -+ } -+ while (listp != NULL); -+ -+ /* If we get to this point, the module still hasn't been assigned an -+ entry in the dtv slotinfo data structures, and it will when we're -+ done with relocations. At that point, the module will get a -+ generation number that is one past the current generation, so -+ return exactly that. */ -+ return GL(dl_tls_generation) + 1; -+} -+ -+void * -+internal_function -+_dl_make_tlsdesc_dynamic (struct link_map *map, size_t ti_offset) -+{ -+ struct funcdesc_ht *ht; -+ void **entry; -+ struct tlsdesc_dynamic_arg *td, test; -+ -+ ht = map->l_tlsdesc_table; -+ if (! ht) -+ { -+ ht = htab_create (); -+ if (! ht) -+ return 0; -+ map->l_tlsdesc_table = ht; -+ } -+ -+ test.tlsinfo.ti_module = map->l_tls_modid; -+ test.tlsinfo.ti_offset = ti_offset; -+ entry = htab_find_slot (ht, &test, 1, hash_tlsdesc, eq_tlsdesc); -+ if (*entry) -+ { -+ td = *entry; -+ return td; -+ } -+ -+ *entry = td = _dl_malloc (sizeof (struct tlsdesc_dynamic_arg)); -+ /* This may be higher than the map's generation, but it doesn't -+ matter much. Worst case, we'll have one extra DTV update per -+ thread. */ -+ td->gen_count = map_generation (map); -+ td->tlsinfo = test.tlsinfo; -+ -+ return td; -+} -+ -+# endif /* SHARED */ -+ -+#endif -diff -Nur uClibc-git/ldso/ldso/dl-tls.c uClibc-xtensa/ldso/ldso/dl-tls.c ---- uClibc-git/ldso/ldso/dl-tls.c 2014-06-02 17:40:33.946711608 +0200 -+++ uClibc-xtensa/ldso/ldso/dl-tls.c 2014-06-03 16:10:28.547570023 +0200 -@@ -100,20 +100,16 @@ - * the static TLS area already allocated for each running thread. If this - * object's TLS segment is too big to fit, we fail. If it fits, - * we set MAP->l_tls_offset and return. -- * This function intentionally does not return any value but signals error -- * directly, as static TLS should be rare and code handling it should -- * not be inlined as much as possible. - */ --void --internal_function __attribute_noinline__ --_dl_allocate_static_tls (struct link_map *map) -+int -+internal_function -+_dl_try_allocate_static_tls (struct link_map* map) - { - /* If the alignment requirements are too high fail. */ - if (map->l_tls_align > _dl_tls_static_align) - { - fail: -- _dl_dprintf(2, "cannot allocate memory in static TLS block"); -- _dl_exit(30); -+ return -1; - } - - # ifdef TLS_TCB_AT_TP -@@ -169,6 +165,23 @@ - } - else - map->l_need_tls_init = 1; -+ -+ return 0; -+} -+ -+/* -+ * This function intentionally does not return any value but signals error -+ * directly, as static TLS should be rare and code handling it should -+ * not be inlined as much as possible. -+ */ -+void -+internal_function __attribute_noinline__ -+_dl_allocate_static_tls (struct link_map *map) -+{ -+ if (_dl_try_allocate_static_tls (map)) { -+ _dl_dprintf(2, "cannot allocate memory in static TLS block"); -+ _dl_exit(30); -+ } - } - - #ifdef SHARED -diff -Nur uClibc-git/ldso/ldso/fdpic/dl-inlines.h uClibc-xtensa/ldso/ldso/fdpic/dl-inlines.h ---- uClibc-git/ldso/ldso/fdpic/dl-inlines.h 2014-06-02 17:40:33.950711630 +0200 -+++ uClibc-xtensa/ldso/ldso/fdpic/dl-inlines.h 2014-06-03 11:57:43.263058897 +0200 -@@ -5,6 +5,8 @@ - * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. - */ - -+#include <inline-hashtab.h> -+ - /* Initialize a DL_LOADADDR_TYPE given a got pointer and a complete load map. */ - static __always_inline void - __dl_init_loadaddr_map(struct elf32_fdpic_loadaddr *loadaddr, Elf32_Addr dl_boot_got_pointer, -@@ -143,269 +145,18 @@ - return 0; - } - --/* -- * The hashcode handling code below is heavily inspired in libiberty's -- * hashtab code, but with most adaptation points and support for -- * deleting elements removed. -- * -- * Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. -- * Contributed by Vladimir Makarov (vmakarov@cygnus.com). -- */ --static __always_inline unsigned long --higher_prime_number(unsigned long n) --{ -- /* These are primes that are near, but slightly smaller than, a power of two. */ -- static const unsigned long primes[] = { -- 7, -- 13, -- 31, -- 61, -- 127, -- 251, -- 509, -- 1021, -- 2039, -- 4093, -- 8191, -- 16381, -- 32749, -- 65521, -- 131071, -- 262139, -- 524287, -- 1048573, -- 2097143, -- 4194301, -- 8388593, -- 16777213, -- 33554393, -- 67108859, -- 134217689, -- 268435399, -- 536870909, -- 1073741789, -- /* 4294967291 */ -- ((unsigned long) 2147483647) + ((unsigned long) 2147483644), -- }; -- const unsigned long *low = &primes[0]; -- const unsigned long *high = &primes[ARRAY_SIZE(primes)]; -- -- while (low != high) { -- const unsigned long *mid = low + (high - low) / 2; -- if (n > *mid) -- low = mid + 1; -- else -- high = mid; -- } -- --#if 0 -- /* If we've run out of primes, abort. */ -- if (n > *low) { -- fprintf(stderr, "Cannot find prime bigger than %lu\n", n); -- abort(); -- } --#endif -- -- return *low; --} -- --struct funcdesc_ht --{ -- /* Table itself */ -- struct funcdesc_value **entries; -- -- /* Current size (in entries) of the hash table */ -- size_t size; -- -- /* Current number of elements */ -- size_t n_elements; --}; -- --static __always_inline int --hash_pointer(const void *p) -+static int -+hash_pointer(void *p) - { - return (int) ((long)p >> 3); - } - --static __always_inline struct funcdesc_ht * --htab_create(void) --{ -- struct funcdesc_ht *ht = _dl_malloc(sizeof(*ht)); -- size_t ent_size; -- -- if (!ht) -- return NULL; -- ht->size = 3; -- ent_size = sizeof(struct funcdesc_ht_value *) * ht->size; -- ht->entries = _dl_malloc(ent_size); -- if (!ht->entries) -- return NULL; -- -- ht->n_elements = 0; -- _dl_memset(ht->entries, 0, ent_size); -- -- return ht; --} -- --/* -- * This is only called from _dl_loadaddr_unmap, so it's safe to call -- * _dl_free(). See the discussion below. -- */ --static __always_inline void --htab_delete(struct funcdesc_ht *htab) --{ -- size_t i; -- -- for (i = htab->size - 1; i >= 0; i--) -- if (htab->entries[i]) -- _dl_free(htab->entries[i]); -- -- _dl_free(htab->entries); -- _dl_free(htab); --} -- --/* -- * Similar to htab_find_slot, but without several unwanted side effects: -- * - Does not call htab->eq_f when it finds an existing entry. -- * - Does not change the count of elements/searches/collisions in the -- * hash table. -- * This function also assumes there are no deleted entries in the table. -- * HASH is the hash value for the element to be inserted. -- */ --static __always_inline struct funcdesc_value ** --find_empty_slot_for_expand(struct funcdesc_ht *htab, int hash) -+static int -+eq_pointer(void *p, void *q) - { -- size_t size = htab->size; -- unsigned int index = hash % size; -- struct funcdesc_value **slot = htab->entries + index; -- int hash2; -- -- if (!*slot) -- return slot; -- -- hash2 = 1 + hash % (size - 2); -- for (;;) { -- index += hash2; -- if (index >= size) -- index -= size; -- -- slot = htab->entries + index; -- if (!*slot) -- return slot; -- } --} -- --/* -- * The following function changes size of memory allocated for the -- * entries and repeatedly inserts the table elements. The occupancy -- * of the table after the call will be about 50%. Naturally the hash -- * table must already exist. Remember also that the place of the -- * table entries is changed. If memory allocation failures are allowed, -- * this function will return zero, indicating that the table could not be -- * expanded. If all goes well, it will return a non-zero value. -- */ --static __always_inline int --htab_expand(struct funcdesc_ht *htab) --{ -- struct funcdesc_value **oentries; -- struct funcdesc_value **olimit; -- struct funcdesc_value **p; -- struct funcdesc_value **nentries; -- size_t nsize; -- -- oentries = htab->entries; -- olimit = oentries + htab->size; -- -- /* -- * Resize only when table after removal of unused elements is either -- * too full or too empty. -- */ -- if (htab->n_elements * 2 > htab->size) -- nsize = higher_prime_number(htab->n_elements * 2); -- else -- nsize = htab->size; -- -- nentries = _dl_malloc(sizeof(*nentries) * nsize); -- _dl_memset(nentries, 0, sizeof(*nentries) * nsize); -- if (nentries == NULL) -- return 0; -- htab->entries = nentries; -- htab->size = nsize; -- -- p = oentries; -- do { -- if (*p) -- *find_empty_slot_for_expand(htab, hash_pointer((*p)->entry_point)) = *p; -- p++; -- } while (p < olimit); -- --#if 0 -- /* -- * We can't tell whether this was allocated by the _dl_malloc() -- * built into ld.so or malloc() in the main executable or libc, -- * and calling free() for something that wasn't malloc()ed could -- * do Very Bad Things (TM). Take the conservative approach -- * here, potentially wasting as much memory as actually used by -- * the hash table, even if multiple growths occur. That's not -- * so bad as to require some overengineered solution that would -- * enable us to keep track of how it was allocated. -- */ -- _dl_free(oentries); --#endif -- return 1; --} -- --/* -- * This function searches for a hash table slot containing an entry -- * equal to the given element. To delete an entry, call this with -- * INSERT = 0, then call htab_clear_slot on the slot returned (possibly -- * after doing some checks). To insert an entry, call this with -- * INSERT = 1, then write the value you want into the returned slot. -- * When inserting an entry, NULL may be returned if memory allocation -- * fails. -- */ --static __always_inline struct funcdesc_value ** --htab_find_slot(struct funcdesc_ht *htab, void *ptr, int insert) --{ -- unsigned int index; -- int hash, hash2; -- size_t size; -- struct funcdesc_value **entry; -- -- if (htab->size * 3 <= htab->n_elements * 4 && -- htab_expand(htab) == 0) -- return NULL; -- -- hash = hash_pointer(ptr); -- -- size = htab->size; -- index = hash % size; -- -- entry = &htab->entries[index]; -- if (!*entry) -- goto empty_entry; -- else if ((*entry)->entry_point == ptr) -- return entry; -- -- hash2 = 1 + hash % (size - 2); -- for (;;) { -- index += hash2; -- if (index >= size) -- index -= size; -- -- entry = &htab->entries[index]; -- if (!*entry) -- goto empty_entry; -- else if ((*entry)->entry_point == ptr) -- return entry; -- } -- -- empty_entry: -- if (!insert) -- return NULL; -+ struct funcdesc_value *entry = p; - -- htab->n_elements++; -- return entry; -+ return entry->entry_point == q; - } - - void * -@@ -424,7 +175,7 @@ - tpnt->funcdesc_ht = ht; - } - -- entry = htab_find_slot(ht, entry_point, 1); -+ entry = htab_find_slot(ht, entry_point, 1, hash_pointer, eq_pointer); - if (*entry) { - _dl_assert((*entry)->entry_point == entry_point); - return _dl_stabilize_funcdesc(*entry); -@@ -459,7 +210,8 @@ - if (fd->got_value != rpnt->loadaddr.got_value) - continue; - -- address = htab_find_slot(rpnt->funcdesc_ht, (void *)fd->entry_point, 0); -+ address = htab_find_slot(rpnt->funcdesc_ht, (void *)fd->entry_point, 0, -+ hash_pointer, eq_pointer); - - if (address && *(struct funcdesc_value *const*)address == fd) { - address = (*(struct funcdesc_value *const*)address)->entry_point; -diff -Nur uClibc-git/ldso/ldso/xtensa/dl-debug.h uClibc-xtensa/ldso/ldso/xtensa/dl-debug.h ---- uClibc-git/ldso/ldso/xtensa/dl-debug.h 2014-06-02 17:40:33.958711675 +0200 -+++ uClibc-xtensa/ldso/ldso/xtensa/dl-debug.h 2014-06-03 12:22:20.032058866 +0200 -@@ -8,54 +8,31 @@ - - static const char * const _dl_reltypes_tab[] = - { -- "R_XTENSA_NONE", -- "R_XTENSA_32", -- "R_XTENSA_RTLD", -- "R_XTENSA_GLOB_DAT", -- "R_XTENSA_JMP_SLOT", -- "R_XTENSA_RELATIVE", -- "R_XTENSA_PLT", -- "R_XTENSA_UNUSED7", -- "R_XTENSA_OP0", -- "R_XTENSA_OP1", -- "R_XTENSA_OP2", -- "R_XTENSA_ASM_EXPAND", -- "R_XTENSA_ASM_SIMPLIFY", -- "R_XTENSA_UNUSED13", -- "R_XTENSA_UNUSED14", -- "R_XTENSA_GNU_VTINHERIT", -- "R_XTENSA_GNU_VTENTRY", -- "R_XTENSA_DIFF8", -- "R_XTENSA_DIFF16", -- "R_XTENSA_DIFF32", -- "R_XTENSA_SLOT0_OP", -- "R_XTENSA_SLOT1_OP", -- "R_XTENSA_SLOT2_OP", -- "R_XTENSA_SLOT3_OP", -- "R_XTENSA_SLOT4_OP", -- "R_XTENSA_SLOT5_OP", -- "R_XTENSA_SLOT6_OP", -- "R_XTENSA_SLOT7_OP", -- "R_XTENSA_SLOT8_OP", -- "R_XTENSA_SLOT9_OP", -- "R_XTENSA_SLOT10_OP", -- "R_XTENSA_SLOT11_OP", -- "R_XTENSA_SLOT12_OP", -- "R_XTENSA_SLOT13_OP", -- "R_XTENSA_SLOT14_OP", -- "R_XTENSA_SLOT0_ALT", -- "R_XTENSA_SLOT1_ALT", -- "R_XTENSA_SLOT2_ALT", -- "R_XTENSA_SLOT3_ALT", -- "R_XTENSA_SLOT4_ALT", -- "R_XTENSA_SLOT5_ALT", -- "R_XTENSA_SLOT6_ALT", -- "R_XTENSA_SLOT7_ALT", -- "R_XTENSA_SLOT8_ALT", -- "R_XTENSA_SLOT9_ALT", -- "R_XTENSA_SLOT10_ALT", -- "R_XTENSA_SLOT11_ALT", -- "R_XTENSA_SLOT12_ALT", -- "R_XTENSA_SLOT13_ALT", -- "R_XTENSA_SLOT14_ALT" -+ [0] "R_XTENSA_NONE", "R_XTENSA_32", -+ [2] "R_XTENSA_RTLD", "R_XTENSA_GLOB_DAT", -+ [4] "R_XTENSA_JMP_SLOT", "R_XTENSA_RELATIVE", -+ [6] "R_XTENSA_PLT", "R_XTENSA_UNUSED7", -+ [8] "R_XTENSA_OP0", "R_XTENSA_OP1", -+ [10] "R_XTENSA_OP2", "R_XTENSA_ASM_EXPAND", -+ [12] "R_XTENSA_ASM_SIMPLIFY", "R_XTENSA_UNUSED13", -+ [14] "R_XTENSA_UNUSED14", "R_XTENSA_GNU_VTINHERIT", -+ [16] "R_XTENSA_GNU_VTENTRY", "R_XTENSA_DIFF8", -+ [18] "R_XTENSA_DIFF16", "R_XTENSA_DIFF32", -+ [20] "R_XTENSA_SLOT0_OP", "R_XTENSA_SLOT1_OP", -+ [22] "R_XTENSA_SLOT2_OP", "R_XTENSA_SLOT3_OP", -+ [24] "R_XTENSA_SLOT4_OP", "R_XTENSA_SLOT5_OP", -+ [26] "R_XTENSA_SLOT6_OP", "R_XTENSA_SLOT7_OP", -+ [28] "R_XTENSA_SLOT8_OP", "R_XTENSA_SLOT9_OP", -+ [30] "R_XTENSA_SLOT10_OP", "R_XTENSA_SLOT11_OP", -+ [32] "R_XTENSA_SLOT12_OP", "R_XTENSA_SLOT13_OP", -+ [34] "R_XTENSA_SLOT14_OP", "R_XTENSA_SLOT0_ALT", -+ [36] "R_XTENSA_SLOT1_ALT", "R_XTENSA_SLOT2_ALT", -+ [38] "R_XTENSA_SLOT3_ALT", "R_XTENSA_SLOT4_ALT", -+ [40] "R_XTENSA_SLOT5_ALT", "R_XTENSA_SLOT6_ALT", -+ [42] "R_XTENSA_SLOT7_ALT", "R_XTENSA_SLOT8_ALT", -+ [44] "R_XTENSA_SLOT9_ALT", "R_XTENSA_SLOT10_ALT", -+ [46] "R_XTENSA_SLOT11_ALT", "R_XTENSA_SLOT12_ALT", -+ [48] "R_XTENSA_SLOT13_ALT", "R_XTENSA_SLOT14_ALT", -+ [50] "R_XTENSA_TLSDESC_FN", "R_XTENSA_TLSDESC_ARG", -+ [52] "R_XTENSA_TLS_TPOFF" - }; -diff -Nur uClibc-git/ldso/ldso/xtensa/dl-startup.h uClibc-xtensa/ldso/ldso/xtensa/dl-startup.h ---- uClibc-git/ldso/ldso/xtensa/dl-startup.h 2014-06-02 17:40:33.958711675 +0200 -+++ uClibc-xtensa/ldso/ldso/xtensa/dl-startup.h 2014-06-03 12:22:20.112059404 +0200 -@@ -11,7 +11,6 @@ - __asm__ ( - " .text\n" - " .align 4\n"< |