summaryrefslogtreecommitdiff
path: root/toolchain/uclibc
diff options
context:
space:
mode:
authorWaldemar Brodkorb <wbx@openadk.org>2014-07-05 13:20:23 +0200
committerWaldemar Brodkorb <wbx@openadk.org>2014-07-05 13:21:37 +0200
commit5ce7c00aadc63e34d8629b36b8c7cf3c9ee0c380 (patch)
tree665868894292c3e90a7af5d8778da6a631fc8223 /toolchain/uclibc
parentf5332c1a325054bec10a11a42b6f0456ad2dea27 (diff)
remove addon patches
Diffstat (limited to 'toolchain/uclibc')
-rw-r--r--toolchain/uclibc/patches/xxx-origin.patch177
-rw-r--r--toolchain/uclibc/patches/xxx-sparc-wait4.patch12
-rw-r--r--toolchain/uclibc/patches/xxx-xtensa-nptl.patch3515
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"<