aboutsummaryrefslogtreecommitdiffstats
path: root/main/musl
diff options
context:
space:
mode:
Diffstat (limited to 'main/musl')
-rw-r--r--main/musl/0001-v1.0.0-to-2b74315d.patch810
-rw-r--r--main/musl/0002-2b74315d-to-b9b2db2f.patch457
-rw-r--r--main/musl/0003-b9b2db2f-to-e94d0692.patch166
-rw-r--r--main/musl/0004-e94d0692-to-83c98aac.patch59
-rw-r--r--main/musl/APKBUILD27
5 files changed, 5 insertions, 1514 deletions
diff --git a/main/musl/0001-v1.0.0-to-2b74315d.patch b/main/musl/0001-v1.0.0-to-2b74315d.patch
deleted file mode 100644
index 57ca3e469c..0000000000
--- a/main/musl/0001-v1.0.0-to-2b74315d.patch
+++ /dev/null
@@ -1,810 +0,0 @@
-git diff v1.0.0...2b74315d8a31ad8fbcd369116c82e055e0ec3fb7
-
-diff --git a/src/conf/confstr.c b/src/conf/confstr.c
-index 4332f72..6e9c23a 100644
---- a/src/conf/confstr.c
-+++ b/src/conf/confstr.c
-@@ -13,5 +13,5 @@ size_t confstr(int name, char *buf, size_t len)
- }
- // snprintf is overkill but avoid wasting code size to implement
- // this completely useless function and its truncation semantics
-- return snprintf(buf, len, "%s", s);
-+ return snprintf(buf, len, "%s", s) + 1;
- }
-diff --git a/src/env/__init_security.c b/src/env/__init_security.c
-index 6204c5e..da5ae94 100644
---- a/src/env/__init_security.c
-+++ b/src/env/__init_security.c
-@@ -15,9 +15,7 @@ void __init_security(size_t *aux)
- struct pollfd pfd[3] = { {.fd=0}, {.fd=1}, {.fd=2} };
- int i;
-
--#ifndef SHARED
- __init_ssp((void *)aux[AT_RANDOM]);
--#endif
-
- if (aux[AT_UID]==aux[AT_EUID] && aux[AT_GID]==aux[AT_EGID]
- && !aux[AT_SECURE]) return;
-diff --git a/src/env/__init_tls.c b/src/env/__init_tls.c
-index 5c17681..8ac0036 100644
---- a/src/env/__init_tls.c
-+++ b/src/env/__init_tls.c
-@@ -5,9 +5,30 @@
- #include "pthread_impl.h"
- #include "libc.h"
- #include "atomic.h"
-+#include "syscall.h"
-+
-+int __init_tp(void *p)
-+{
-+ pthread_t td = p;
-+ td->self = td;
-+ if (__set_thread_area(TP_ADJ(p)) < 0)
-+ return -1;
-+ td->tid = td->pid = __syscall(SYS_set_tid_address, &td->tid);
-+ td->errno_ptr = &td->errno_val;
-+ /* Currently, both of these predicates depend in the same thing:
-+ * successful initialization of the thread pointer. However, in
-+ * the future, we may support setups where setting the thread
-+ * pointer is possible but threads other than the main thread
-+ * cannot work, so it's best to keep the predicates separate. */
-+ libc.has_thread_pointer = 1;
-+ libc.can_do_threads = 1;
-+ return 0;
-+}
-
- #ifndef SHARED
-
-+static long long builtin_tls[(sizeof(struct pthread) + 64)/sizeof(long long)];
-+
- struct tls_image {
- void *image;
- size_t len, size, align;
-@@ -61,10 +82,11 @@ typedef Elf64_Phdr Phdr;
-
- void __init_tls(size_t *aux)
- {
-- unsigned char *p, *mem;
-+ unsigned char *p;
- size_t n;
- Phdr *phdr, *tls_phdr=0;
- size_t base = 0;
-+ void *mem;
-
- libc.tls_size = sizeof(struct pthread);
-
-@@ -75,21 +97,38 @@ void __init_tls(size_t *aux)
- if (phdr->p_type == PT_TLS)
- tls_phdr = phdr;
- }
-- if (!tls_phdr) return;
-
-- T.image = (void *)(base + tls_phdr->p_vaddr);
-- T.len = tls_phdr->p_filesz;
-- T.size = tls_phdr->p_memsz;
-- T.align = tls_phdr->p_align;
-+ if (tls_phdr) {
-+ T.image = (void *)(base + tls_phdr->p_vaddr);
-+ T.len = tls_phdr->p_filesz;
-+ T.size = tls_phdr->p_memsz;
-+ T.align = tls_phdr->p_align;
-+ }
-
- T.size += (-T.size - (uintptr_t)T.image) & (T.align-1);
- if (T.align < 4*sizeof(size_t)) T.align = 4*sizeof(size_t);
-
- libc.tls_size = 2*sizeof(void *)+T.size+T.align+sizeof(struct pthread);
-
-- mem = __mmap(0, libc.tls_size, PROT_READ|PROT_WRITE,
-- MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
-- if (!__install_initial_tls(__copy_tls(mem))) a_crash();
-+ if (libc.tls_size > sizeof builtin_tls) {
-+ mem = (void *)__syscall(
-+#ifdef SYS_mmap2
-+ SYS_mmap2,
-+#else
-+ SYS_mmap,
-+#endif
-+ 0, libc.tls_size, PROT_READ|PROT_WRITE,
-+ MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
-+ /* -4095...-1 cast to void * will crash on dereference anyway,
-+ * so don't bloat the init code checking for error codes and
-+ * explicitly calling a_crash(). */
-+ } else {
-+ mem = builtin_tls;
-+ }
-+
-+ /* Failure to initialize thread pointer is fatal if TLS is used. */
-+ if (__init_tp(__copy_tls(mem)) < 0 && tls_phdr)
-+ a_crash();
- }
- #else
- void __init_tls(size_t *auxv) { }
-diff --git a/src/env/__stack_chk_fail.c b/src/env/__stack_chk_fail.c
-index daa1b07..87ac473 100644
---- a/src/env/__stack_chk_fail.c
-+++ b/src/env/__stack_chk_fail.c
-@@ -1,18 +1,16 @@
- #include <string.h>
- #include <stdint.h>
- #include "pthread_impl.h"
--#include "atomic.h"
-
- uintptr_t __stack_chk_guard;
-
- void __init_ssp(void *entropy)
- {
-- pthread_t self = __pthread_self_init();
-- uintptr_t canary;
-- if (entropy) memcpy(&canary, entropy, sizeof canary);
-- else canary = (uintptr_t)&canary * 1103515245;
-- a_cas_l(&__stack_chk_guard, 0, canary);
-- self->canary = __stack_chk_guard;
-+ if (entropy) memcpy(&__stack_chk_guard, entropy, sizeof(uintptr_t));
-+ else __stack_chk_guard = (uintptr_t)&__stack_chk_guard * 1103515245;
-+
-+ if (libc.has_thread_pointer)
-+ __pthread_self()->canary = __stack_chk_guard;
- }
-
- void __stack_chk_fail(void)
-diff --git a/src/errno/__errno_location.c b/src/errno/__errno_location.c
-index 3e92d7c..8419107 100644
---- a/src/errno/__errno_location.c
-+++ b/src/errno/__errno_location.c
-@@ -3,6 +3,6 @@
- int *__errno_location(void)
- {
- static int e;
-- if (libc.main_thread) return __pthread_self()->errno_ptr;
-+ if (libc.has_thread_pointer) return __pthread_self()->errno_ptr;
- return &e;
- }
-diff --git a/src/internal/libc.h b/src/internal/libc.h
-index d625b56..fb4d9bc 100644
---- a/src/internal/libc.h
-+++ b/src/internal/libc.h
-@@ -6,12 +6,12 @@
- #include <limits.h>
-
- struct __libc {
-- void *main_thread;
-+ int has_thread_pointer;
-+ int can_do_threads;
- int threaded;
- int secure;
- size_t *auxv;
- volatile int threads_minus_1;
-- int canceldisable;
- FILE *ofl_head;
- int ofl_lock[2];
- size_t tls_size;
-diff --git a/src/internal/syscall_ret.c b/src/internal/syscall_ret.c
-index d99f4a5..a3f4713 100644
---- a/src/internal/syscall_ret.c
-+++ b/src/internal/syscall_ret.c
-@@ -1,4 +1,5 @@
- #include <errno.h>
-+#include "syscall.h"
-
- long __syscall_ret(unsigned long r)
- {
-diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c
-index a1bdf0f..1517281 100644
---- a/src/ldso/dynlink.c
-+++ b/src/ldso/dynlink.c
-@@ -56,6 +56,7 @@ struct dso {
-
- Phdr *phdr;
- int phnum;
-+ size_t phentsize;
- int refcnt;
- Sym *syms;
- uint32_t *hashtab;
-@@ -74,6 +75,7 @@ struct dso {
- char *rpath_orig, *rpath;
- void *tls_image;
- size_t tls_len, tls_size, tls_align, tls_id, tls_offset;
-+ size_t relro_start, relro_end;
- void **new_dtv;
- unsigned char *new_tls;
- int new_dtv_idx, new_tls_idx;
-@@ -89,8 +91,7 @@ struct symdef {
-
- #include "reloc.h"
-
--void __init_ssp(size_t *);
--void *__install_initial_tls(void *);
-+int __init_tp(void *);
- void __init_libc(char **, char *);
-
- const char *__libc_get_version(void);
-@@ -98,7 +99,6 @@ const char *__libc_get_version(void);
- static struct dso *head, *tail, *ldso, *fini_head;
- static char *env_path, *sys_path;
- static unsigned long long gencnt;
--static int ssp_used;
- static int runtime;
- static int ldd_mode;
- static int ldso_fail;
-@@ -108,6 +108,7 @@ static pthread_rwlock_t lock;
- static struct debug debug;
- static size_t tls_cnt, tls_offset, tls_align = 4*sizeof(size_t);
- static pthread_mutex_t init_fini_lock = { ._m_type = PTHREAD_MUTEX_RECURSIVE };
-+static long long builtin_tls[(sizeof(struct pthread) + 64)/sizeof(long long)];
-
- struct debug *_dl_debug_addr = &debug;
-
-@@ -198,13 +199,6 @@ static struct symdef find_sym(struct dso *dso, const char *s, int need_def)
- {
- uint32_t h = 0, gh = 0;
- struct symdef def = {0};
-- if (dso->ghashtab) {
-- gh = gnu_hash(s);
-- if (gh == 0x1f4039c9 && !strcmp(s, "__stack_chk_fail")) ssp_used = 1;
-- } else {
-- h = sysv_hash(s);
-- if (h == 0x595a4cc && !strcmp(s, "__stack_chk_fail")) ssp_used = 1;
-- }
- for (; dso; dso=dso->next) {
- Sym *sym;
- if (!dso->global) continue;
-@@ -280,27 +274,32 @@ static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stri
- * and "donate" them to the heap by setting up minimal malloc
- * structures and then freeing them. */
-
--static void reclaim(unsigned char *base, size_t start, size_t end)
-+static void reclaim(struct dso *dso, size_t start, size_t end)
- {
- size_t *a, *z;
-+ if (start >= dso->relro_start && start < dso->relro_end) start = dso->relro_end;
-+ if (end >= dso->relro_start && end < dso->relro_end) end = dso->relro_start;
- start = start + 6*sizeof(size_t)-1 & -4*sizeof(size_t);
- end = (end & -4*sizeof(size_t)) - 2*sizeof(size_t);
- if (start>end || end-start < 4*sizeof(size_t)) return;
-- a = (size_t *)(base + start);
-- z = (size_t *)(base + end);
-+ a = (size_t *)(dso->base + start);
-+ z = (size_t *)(dso->base + end);
- a[-2] = 1;
- a[-1] = z[0] = end-start + 2*sizeof(size_t) | 1;
- z[1] = 1;
- free(a);
- }
-
--static void reclaim_gaps(unsigned char *base, Phdr *ph, size_t phent, size_t phcnt)
-+static void reclaim_gaps(struct dso *dso)
- {
-- for (; phcnt--; ph=(void *)((char *)ph+phent)) {
-+ Phdr *ph = dso->phdr;
-+ size_t phcnt = dso->phnum;
-+
-+ for (; phcnt--; ph=(void *)((char *)ph+dso->phentsize)) {
- if (ph->p_type!=PT_LOAD) continue;
- if ((ph->p_flags&(PF_R|PF_W))!=(PF_R|PF_W)) continue;
-- reclaim(base, ph->p_vaddr & -PAGE_SIZE, ph->p_vaddr);
-- reclaim(base, ph->p_vaddr+ph->p_memsz,
-+ reclaim(dso, ph->p_vaddr & -PAGE_SIZE, ph->p_vaddr);
-+ reclaim(dso, ph->p_vaddr+ph->p_memsz,
- ph->p_vaddr+ph->p_memsz+PAGE_SIZE-1 & -PAGE_SIZE);
- }
- }
-@@ -343,13 +342,16 @@ static void *map_library(int fd, struct dso *dso)
- ph = ph0 = (void *)((char *)buf + eh->e_phoff);
- }
- for (i=eh->e_phnum; i; i--, ph=(void *)((char *)ph+eh->e_phentsize)) {
-- if (ph->p_type == PT_DYNAMIC)
-+ if (ph->p_type == PT_DYNAMIC) {
- dyn = ph->p_vaddr;
-- if (ph->p_type == PT_TLS) {
-+ } else if (ph->p_type == PT_TLS) {
- tls_image = ph->p_vaddr;
- dso->tls_align = ph->p_align;
- dso->tls_len = ph->p_filesz;
- dso->tls_size = ph->p_memsz;
-+ } else if (ph->p_type == PT_GNU_RELRO) {
-+ dso->relro_start = ph->p_vaddr & -PAGE_SIZE;
-+ dso->relro_end = (ph->p_vaddr + ph->p_memsz) & -PAGE_SIZE;
- }
- if (ph->p_type != PT_LOAD) continue;
- if (ph->p_vaddr < addr_min) {
-@@ -393,6 +395,7 @@ static void *map_library(int fd, struct dso *dso)
- dso->phdr = (void *)(base + ph->p_vaddr
- + (eh->e_phoff-ph->p_offset));
- dso->phnum = eh->e_phnum;
-+ dso->phentsize = eh->e_phentsize;
- }
- /* Reuse the existing mapping for the lowest-address LOAD */
- if ((ph->p_vaddr & -PAGE_SIZE) == addr_min) continue;
-@@ -418,12 +421,12 @@ static void *map_library(int fd, struct dso *dso)
- goto error;
- break;
- }
-- if (!runtime) reclaim_gaps(base, ph0, eh->e_phentsize, eh->e_phnum);
- dso->map = map;
- dso->map_len = map_len;
- dso->base = base;
- dso->dynv = (void *)(base+dyn);
- if (dso->tls_size) dso->tls_image = (void *)(base+tls_image);
-+ if (!runtime) reclaim_gaps(dso);
- free(allocated_buf);
- return map;
- noexec:
-@@ -673,9 +676,10 @@ static struct dso *load_library(const char *name, struct dso *needed_by)
- /* Add a shortname only if name arg was not an explicit pathname. */
- if (pathname != name) p->shortname = strrchr(p->name, '/')+1;
- if (p->tls_image) {
-- if (runtime && !__pthread_self_init()) {
-+ if (runtime && !libc.has_thread_pointer) {
- munmap(map, p->map_len);
- free(p);
-+ errno = ENOSYS;
- return 0;
- }
- p->tls_id = ++tls_cnt;
-@@ -764,22 +768,32 @@ static void reloc_all(struct dso *p)
- 2+(dyn[DT_PLTREL]==DT_RELA));
- do_relocs(p, (void *)(p->base+dyn[DT_REL]), dyn[DT_RELSZ], 2);
- do_relocs(p, (void *)(p->base+dyn[DT_RELA]), dyn[DT_RELASZ], 3);
-+
-+ if (p->relro_start != p->relro_end &&
-+ mprotect(p->base+p->relro_start, p->relro_end-p->relro_start, PROT_READ) < 0) {
-+ snprintf(errbuf, sizeof errbuf,
-+ "Error relocating %s: RELRO protection failed: %m",
-+ p->name);
-+ if (runtime) longjmp(*rtld_fail, 1);
-+ dprintf(2, "%s\n", errbuf);
-+ ldso_fail = 1;
-+ }
-+
- p->relocated = 1;
- }
- }
-
--static size_t find_dyn(Phdr *ph, size_t cnt, size_t stride)
-+static void kernel_mapped_dso(struct dso *p)
- {
-- for (; cnt--; ph = (void *)((char *)ph + stride))
-- if (ph->p_type == PT_DYNAMIC)
-- return ph->p_vaddr;
-- return 0;
--}
--
--static void find_map_range(Phdr *ph, size_t cnt, size_t stride, struct dso *p)
--{
-- size_t min_addr = -1, max_addr = 0;
-- for (; cnt--; ph = (void *)((char *)ph + stride)) {
-+ size_t min_addr = -1, max_addr = 0, cnt;
-+ Phdr *ph = p->phdr;
-+ for (cnt = p->phnum; cnt--; ph = (void *)((char *)ph + p->phentsize)) {
-+ if (ph->p_type == PT_DYNAMIC) {
-+ p->dynv = (void *)(p->base + ph->p_vaddr);
-+ } else if (ph->p_type == PT_GNU_RELRO) {
-+ p->relro_start = ph->p_vaddr & -PAGE_SIZE;
-+ p->relro_end = (ph->p_vaddr + ph->p_memsz) & -PAGE_SIZE;
-+ }
- if (ph->p_type != PT_LOAD) continue;
- if (ph->p_vaddr < min_addr)
- min_addr = ph->p_vaddr;
-@@ -790,6 +804,7 @@ static void find_map_range(Phdr *ph, size_t cnt, size_t stride, struct dso *p)
- max_addr = (max_addr + PAGE_SIZE-1) & -PAGE_SIZE;
- p->map = p->base + min_addr;
- p->map_len = max_addr - min_addr;
-+ p->kernel_mapped = 1;
- }
-
- static void do_fini()
-@@ -866,10 +881,13 @@ void *__copy_tls(unsigned char *mem)
- pthread_t td;
- struct dso *p;
-
-- if (!tls_cnt) return mem;
--
- void **dtv = (void *)mem;
- dtv[0] = (void *)tls_cnt;
-+ if (!tls_cnt) {
-+ td = (void *)(dtv+1);
-+ td->dtv = dtv;
-+ return td;
-+ }
-
- #ifdef TLS_ABOVE_TP
- mem += sizeof(void *) * (tls_cnt+1);
-@@ -962,6 +980,7 @@ void *__dynlink(int argc, char **argv)
- size_t vdso_base;
- size_t *auxv;
- char **envp = argv+argc+1;
-+ void *initial_tls;
-
- /* Find aux vector just past environ[] */
- for (i=argc+1; argv[i]; i++)
-@@ -996,13 +1015,11 @@ void *__dynlink(int argc, char **argv)
- lib->base = (void *)aux[AT_BASE];
- lib->name = lib->shortname = "libc.so";
- lib->global = 1;
-- lib->kernel_mapped = 1;
- ehdr = (void *)lib->base;
- lib->phnum = ehdr->e_phnum;
- lib->phdr = (void *)(aux[AT_BASE]+ehdr->e_phoff);
-- find_map_range(lib->phdr, ehdr->e_phnum, ehdr->e_phentsize, lib);
-- lib->dynv = (void *)(lib->base + find_dyn(lib->phdr,
-- ehdr->e_phnum, ehdr->e_phentsize));
-+ lib->phentsize = ehdr->e_phentsize;
-+ kernel_mapped_dso(lib);
- decode_dyn(lib);
-
- if (aux[AT_PHDR]) {
-@@ -1011,6 +1028,7 @@ void *__dynlink(int argc, char **argv)
- /* Find load address of the main program, via AT_PHDR vs PT_PHDR. */
- app->phdr = phdr = (void *)aux[AT_PHDR];
- app->phnum = aux[AT_PHNUM];
-+ app->phentsize = aux[AT_PHENT];
- for (i=aux[AT_PHNUM]; i; i--, phdr=(void *)((char *)phdr + aux[AT_PHENT])) {
- if (phdr->p_type == PT_PHDR)
- app->base = (void *)(aux[AT_PHDR] - phdr->p_vaddr);
-@@ -1030,11 +1048,7 @@ void *__dynlink(int argc, char **argv)
- app->name = (char *)aux[AT_EXECFN];
- else
- app->name = argv[0];
-- app->kernel_mapped = 1;
-- app->dynv = (void *)(app->base + find_dyn(
-- (void *)aux[AT_PHDR], aux[AT_PHNUM], aux[AT_PHENT]));
-- find_map_range((void *)aux[AT_PHDR],
-- aux[AT_PHNUM], aux[AT_PHENT], app);
-+ kernel_mapped_dso(app);
- } else {
- int fd;
- char *ldname = argv[0];
-@@ -1100,6 +1114,7 @@ void *__dynlink(int argc, char **argv)
- ehdr = (void *)vdso_base;
- vdso->phdr = phdr = (void *)(vdso_base + ehdr->e_phoff);
- vdso->phnum = ehdr->e_phnum;
-+ vdso->phentsize = ehdr->e_phentsize;
- for (i=ehdr->e_phnum; i; i--, phdr=(void *)((char *)phdr + ehdr->e_phentsize)) {
- if (phdr->p_type == PT_DYNAMIC)
- vdso->dynv = (void *)(vdso_base + phdr->p_offset);
-@@ -1127,10 +1142,8 @@ void *__dynlink(int argc, char **argv)
- /* PAST THIS POINT, ALL LIBC INTERFACES ARE FULLY USABLE. */
-
- /* Donate unused parts of app and library mapping to malloc */
-- reclaim_gaps(app->base, (void *)aux[AT_PHDR], aux[AT_PHENT], aux[AT_PHNUM]);
-- ehdr = (void *)lib->base;
-- reclaim_gaps(lib->base, (void *)(lib->base+ehdr->e_phoff),
-- ehdr->e_phentsize, ehdr->e_phnum);
-+ reclaim_gaps(app);
-+ reclaim_gaps(lib);
-
- /* Load preload/needed libraries, add their symbols to the global
- * namespace, and perform all remaining relocations. The main
-@@ -1140,19 +1153,29 @@ void *__dynlink(int argc, char **argv)
- load_deps(app);
- make_global(app);
-
-+#ifndef DYNAMIC_IS_RO
-+ for (i=0; app->dynv[i]; i+=2)
-+ if (app->dynv[i]==DT_DEBUG)
-+ app->dynv[i+1] = (size_t)&debug;
-+#endif
-+
- reloc_all(app->next);
- reloc_all(app);
-
- update_tls_size();
-- if (tls_cnt) {
-- void *mem = mmap(0, libc.tls_size, PROT_READ|PROT_WRITE,
-- MAP_ANONYMOUS|MAP_PRIVATE, -1, 0);
-- if (mem==MAP_FAILED ||
-- !__install_initial_tls(__copy_tls(mem))) {
-+ if (libc.tls_size > sizeof builtin_tls) {
-+ initial_tls = calloc(libc.tls_size, 1);
-+ if (!initial_tls) {
- dprintf(2, "%s: Error getting %zu bytes thread-local storage: %m\n",
- argv[0], libc.tls_size);
- _exit(127);
- }
-+ } else {
-+ initial_tls = builtin_tls;
-+ }
-+ if (__init_tp(__copy_tls(initial_tls)) < 0 && tls_cnt) {
-+ dprintf(2, "%s: Thread-local storage not supported by kernel.\n", argv[0]);
-+ _exit(127);
- }
-
- if (ldso_fail) _exit(127);
-@@ -1164,11 +1187,6 @@ void *__dynlink(int argc, char **argv)
- * all memory used by the dynamic linker. */
- runtime = 1;
-
--#ifndef DYNAMIC_IS_RO
-- for (i=0; app->dynv[i]; i+=2)
-- if (app->dynv[i]==DT_DEBUG)
-- app->dynv[i+1] = (size_t)&debug;
--#endif
- debug.ver = 1;
- debug.bp = _dl_debug_state;
- debug.head = head;
-@@ -1176,7 +1194,6 @@ void *__dynlink(int argc, char **argv)
- debug.state = 0;
- _dl_debug_state();
-
-- if (ssp_used) __init_ssp((void *)aux[AT_RANDOM]);
- __init_libc(envp, argv[0]);
- atexit(do_fini);
- errno = 0;
-@@ -1258,9 +1275,6 @@ void *dlopen(const char *file, int mode)
- }
-
- update_tls_size();
--
-- if (ssp_used) __init_ssp(libc.auxv);
--
- _dl_debug_state();
- orig_tail = tail;
- end:
-diff --git a/src/process/fork.c b/src/process/fork.c
-index 1a82f42..864c7d7 100644
---- a/src/process/fork.c
-+++ b/src/process/fork.c
-@@ -17,12 +17,11 @@ pid_t fork(void)
- __fork_handler(-1);
- __block_all_sigs(&set);
- ret = syscall(SYS_fork);
-- if (libc.main_thread && !ret) {
-+ if (libc.has_thread_pointer && !ret) {
- pthread_t self = __pthread_self();
-- self->tid = self->pid = syscall(SYS_getpid);
-+ self->tid = self->pid = __syscall(SYS_getpid);
- memset(&self->robust_list, 0, sizeof self->robust_list);
- libc.threads_minus_1 = 0;
-- libc.main_thread = self;
- }
- __restore_sigs(&set);
- __fork_handler(!ret);
-diff --git a/src/signal/sigaction.c b/src/signal/sigaction.c
-index f7ff4a6..d5f4774 100644
---- a/src/signal/sigaction.c
-+++ b/src/signal/sigaction.c
-@@ -8,9 +8,7 @@
-
- void __restore(), __restore_rt();
-
--static pthread_t dummy(void) { return 0; }
--weak_alias(dummy, __pthread_self_def);
--
-+static int unmask_done;
- static unsigned long handler_set[_NSIG/(8*sizeof(long))];
-
- void __get_handler_set(sigset_t *set)
-@@ -29,7 +27,20 @@ int __libc_sigaction(int sig, const struct sigaction *restrict sa, struct sigact
- if ((uintptr_t)sa->sa_handler > 1UL) {
- a_or_l(handler_set+(sig-1)/(8*sizeof(long)),
- 1UL<<(sig-1)%(8*sizeof(long)));
-- __pthread_self_def();
-+
-+ /* If pthread_create has not yet been called,
-+ * implementation-internal signals might not
-+ * yet have been unblocked. They must be
-+ * unblocked before any signal handler is
-+ * installed, so that an application cannot
-+ * receive an illegal sigset_t (with them
-+ * blocked) as part of the ucontext_t passed
-+ * to the signal handler. */
-+ if (!libc.threaded && !unmask_done) {
-+ __syscall(SYS_rt_sigprocmask, SIG_UNBLOCK,
-+ SIGPT_SET, 0, _NSIG/8);
-+ unmask_done = 1;
-+ }
- }
- ksa.handler = sa->sa_handler;
- ksa.flags = sa->sa_flags | SA_RESTORER;
-diff --git a/src/stdio/__stdio_read.c b/src/stdio/__stdio_read.c
-index 05e56f9..6cd7b07 100644
---- a/src/stdio/__stdio_read.c
-+++ b/src/stdio/__stdio_read.c
-@@ -16,13 +16,9 @@ size_t __stdio_read(FILE *f, unsigned char *buf, size_t len)
- };
- ssize_t cnt;
-
-- if (libc.main_thread) {
-- pthread_cleanup_push(cleanup, f);
-- cnt = syscall_cp(SYS_readv, f->fd, iov, 2);
-- pthread_cleanup_pop(0);
-- } else {
-- cnt = syscall(SYS_readv, f->fd, iov, 2);
-- }
-+ pthread_cleanup_push(cleanup, f);
-+ cnt = syscall_cp(SYS_readv, f->fd, iov, 2);
-+ pthread_cleanup_pop(0);
- if (cnt <= 0) {
- f->flags |= F_EOF ^ ((F_ERR^F_EOF) & cnt);
- f->rpos = f->rend = 0;
-diff --git a/src/stdio/__stdio_write.c b/src/stdio/__stdio_write.c
-index e52e91a..8c89389 100644
---- a/src/stdio/__stdio_write.c
-+++ b/src/stdio/__stdio_write.c
-@@ -19,13 +19,9 @@ size_t __stdio_write(FILE *f, const unsigned char *buf, size_t len)
- int iovcnt = 2;
- ssize_t cnt;
- for (;;) {
-- if (libc.main_thread) {
-- pthread_cleanup_push(cleanup, f);
-- cnt = syscall_cp(SYS_writev, f->fd, iov, iovcnt);
-- pthread_cleanup_pop(0);
-- } else {
-- cnt = syscall(SYS_writev, f->fd, iov, iovcnt);
-- }
-+ pthread_cleanup_push(cleanup, f);
-+ cnt = syscall_cp(SYS_writev, f->fd, iov, iovcnt);
-+ pthread_cleanup_pop(0);
- if (cnt == rem) {
- f->wend = f->buf + f->buf_size;
- f->wpos = f->wbase = f->buf;
-diff --git a/src/thread/cancel_impl.c b/src/thread/cancel_impl.c
-index c835813..525d290 100644
---- a/src/thread/cancel_impl.c
-+++ b/src/thread/cancel_impl.c
-@@ -20,7 +20,7 @@ long (__syscall_cp)(syscall_arg_t nr,
- pthread_t self;
- long r;
-
-- if (!libc.main_thread || (self = __pthread_self())->canceldisable)
-+ if (!libc.has_thread_pointer || (self = __pthread_self())->canceldisable)
- return __syscall(nr, u, v, w, x, y, z);
-
- r = __syscall_cp_asm(&self->cancel, nr, u, v, w, x, y, z);
-@@ -57,6 +57,7 @@ static void cancel_handler(int sig, siginfo_t *si, void *ctx)
-
- void __testcancel()
- {
-+ if (!libc.has_thread_pointer) return;
- pthread_t self = pthread_self();
- if (self->cancel && !self->canceldisable)
- __cancel();
-diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c
-index ee6c31c..e0b5ef1 100644
---- a/src/thread/pthread_create.c
-+++ b/src/thread/pthread_create.c
-@@ -77,6 +77,7 @@ _Noreturn void pthread_exit(void *result)
-
- void __do_cleanup_push(struct __ptcb *cb)
- {
-+ if (!libc.has_thread_pointer) return;
- struct pthread *self = pthread_self();
- cb->__next = self->cancelbuf;
- self->cancelbuf = cb;
-@@ -84,6 +85,7 @@ void __do_cleanup_push(struct __ptcb *cb)
-
- void __do_cleanup_pop(struct __ptcb *cb)
- {
-+ if (!libc.has_thread_pointer) return;
- __pthread_self()->cancelbuf = cb->__next;
- }
-
-@@ -110,6 +112,8 @@ static int start(void *p)
- /* pthread_key_create.c overrides this */
- static const size_t dummy = 0;
- weak_alias(dummy, __pthread_tsd_size);
-+static void *const dummy_tsd[1] = { 0 };
-+weak_alias(dummy_tsd, __pthread_tsd_main);
-
- static FILE *const dummy_file = 0;
- weak_alias(dummy_file, __stdin_used);
-@@ -127,7 +131,7 @@ int pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict attrp
- {
- int ret;
- size_t size, guard;
-- struct pthread *self = pthread_self(), *new;
-+ struct pthread *self, *new;
- unsigned char *map = 0, *stack = 0, *tsd = 0, *stack_limit;
- unsigned flags = CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND
- | CLONE_THREAD | CLONE_SYSVSEM | CLONE_SETTLS
-@@ -135,13 +139,16 @@ int pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict attrp
- int do_sched = 0;
- pthread_attr_t attr = {0};
-
-- if (!self) return ENOSYS;
-+ if (!libc.can_do_threads) return ENOSYS;
-+ self = __pthread_self();
- if (!libc.threaded) {
- for (FILE *f=libc.ofl_head; f; f=f->next)
- init_file_lock(f);
- init_file_lock(__stdin_used);
- init_file_lock(__stdout_used);
- init_file_lock(__stderr_used);
-+ __syscall(SYS_rt_sigprocmask, SIG_UNBLOCK, SIGPT_SET, 0, _NSIG/8);
-+ self->tsd = (void **)__pthread_tsd_main;
- libc.threaded = 1;
- }
- if (attrp) attr = *attrp;
-diff --git a/src/thread/pthread_key_create.c b/src/thread/pthread_key_create.c
-index c29935c..ef8a755 100644
---- a/src/thread/pthread_key_create.c
-+++ b/src/thread/pthread_key_create.c
-@@ -14,7 +14,13 @@ int pthread_key_create(pthread_key_t *k, void (*dtor)(void *))
- unsigned i = (uintptr_t)&k / 16 % PTHREAD_KEYS_MAX;
- unsigned j = i;
-
-- __pthread_self_init();
-+ if (libc.has_thread_pointer) {
-+ pthread_t self = __pthread_self();
-+ /* This can only happen in the main thread before
-+ * pthread_create has been called. */
-+ if (!self->tsd) self->tsd = __pthread_tsd_main;
-+ }
-+
- if (!dtor) dtor = nodtor;
- do {
- if (!a_cas_p(keys+j, 0, (void *)dtor)) {
-diff --git a/src/thread/pthread_self.c b/src/thread/pthread_self.c
-index aed4b5f..5f9e651 100644
---- a/src/thread/pthread_self.c
-+++ b/src/thread/pthread_self.c
-@@ -1,45 +1,6 @@
- #include "pthread_impl.h"
-
--static struct pthread *main_thread = &(struct pthread){0};
--
--/* pthread_key_create.c overrides this */
--static const void *dummy[1] = { 0 };
--weak_alias(dummy, __pthread_tsd_main);
--
--static int init_main_thread()
--{
-- __syscall(SYS_rt_sigprocmask, SIG_UNBLOCK,
-- SIGPT_SET, 0, _NSIG/8);
-- if (__set_thread_area(TP_ADJ(main_thread)) < 0) return -1;
-- main_thread->canceldisable = libc.canceldisable;
-- main_thread->tsd = (void **)__pthread_tsd_main;
-- main_thread->errno_ptr = __errno_location();
-- main_thread->self = main_thread;
-- main_thread->tid = main_thread->pid =
-- __syscall(SYS_set_tid_address, &main_thread->tid);
-- if (!main_thread->dtv)
-- main_thread->dtv = (void *)dummy;
-- libc.main_thread = main_thread;
-- return 0;
--}
--
--pthread_t __pthread_self_def()
-+pthread_t pthread_self()
- {
-- static int init, failed;
-- if (!init) {
-- if (failed) return 0;
-- if (init_main_thread() < 0) failed = 1;
-- if (failed) return 0;
-- init = 1;
-- }
- return __pthread_self();
- }
--
--weak_alias(__pthread_self_def, pthread_self);
--weak_alias(__pthread_self_def, __pthread_self_init);
--
--void *__install_initial_tls(void *p)
--{
-- main_thread = p;
-- return __pthread_self_def();
--}
-diff --git a/src/thread/pthread_setcancelstate.c b/src/thread/pthread_setcancelstate.c
-index ba2b231..060bcdc 100644
---- a/src/thread/pthread_setcancelstate.c
-+++ b/src/thread/pthread_setcancelstate.c
-@@ -3,13 +3,9 @@
- int pthread_setcancelstate(int new, int *old)
- {
- if (new > 1U) return EINVAL;
-- if (libc.main_thread) {
-- struct pthread *self = __pthread_self();
-- if (old) *old = self->canceldisable;
-- self->canceldisable = new;
-- } else {
-- if (old) *old = libc.canceldisable;
-- libc.canceldisable = new;
-- }
-+ if (!libc.has_thread_pointer) return ENOSYS;
-+ struct pthread *self = __pthread_self();
-+ if (old) *old = self->canceldisable;
-+ self->canceldisable = new;
- return 0;
- }
diff --git a/main/musl/0002-2b74315d-to-b9b2db2f.patch b/main/musl/0002-2b74315d-to-b9b2db2f.patch
deleted file mode 100644
index 0d3a49c49e..0000000000
--- a/main/musl/0002-2b74315d-to-b9b2db2f.patch
+++ /dev/null
@@ -1,457 +0,0 @@
-git diff 2b74315d8a31ad8fbcd369116c82e055e0ec3fb7...b9b2db2f374bce907fa5015c9cf63205054f2356
-
-diff --git a/arch/microblaze/syscall_arch.h b/arch/microblaze/syscall_arch.h
-index 70217ff..cab4607 100644
---- a/arch/microblaze/syscall_arch.h
-+++ b/arch/microblaze/syscall_arch.h
-@@ -13,7 +13,7 @@ static __inline long __syscall0(long n)
- register unsigned long r3 __asm__("r3");
- __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
- : "r"(r12)
-- : "memory");
-+ : "memory", "r4");
- return r3;
- }
-
-@@ -24,7 +24,7 @@ static inline long __syscall1(long n, long a)
- register unsigned long r5 __asm__("r5") = a;
- __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
- : "r"(r12), "r"(r5)
-- : "memory");
-+ : "memory", "r4");
- return r3;
- }
-
-@@ -36,7 +36,7 @@ static inline long __syscall2(long n, long a, long b)
- register unsigned long r6 __asm__("r6") = b;
- __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
- : "r"(r12), "r"(r5), "r"(r6)
-- : "memory");
-+ : "memory", "r4");
- return r3;
- }
-
-@@ -49,7 +49,7 @@ static inline long __syscall3(long n, long a, long b, long c)
- register unsigned long r7 __asm__("r7") = c;
- __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
- : "r"(r12), "r"(r5), "r"(r6), "r"(r7)
-- : "memory");
-+ : "memory", "r4");
- return r3;
- }
-
-@@ -63,7 +63,7 @@ static inline long __syscall4(long n, long a, long b, long c, long d)
- register unsigned long r8 __asm__("r8") = d;
- __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
- : "r"(r12), "r"(r5), "r"(r6), "r"(r7), "r"(r8)
-- : "memory");
-+ : "memory", "r4");
- return r3;
- }
-
-@@ -78,7 +78,7 @@ static inline long __syscall5(long n, long a, long b, long c, long d, long e)
- register unsigned long r9 __asm__("r9") = e;
- __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
- : "r"(r12), "r"(r5), "r"(r6), "r"(r7), "r"(r8), "r"(r9)
-- : "memory");
-+ : "memory", "r4");
- return r3;
- }
-
-@@ -94,7 +94,7 @@ static inline long __syscall6(long n, long a, long b, long c, long d, long e, lo
- register unsigned long r10 __asm__("r10") = f;
- __asm__ __volatile__ ("brki r14, 0x8" : "=r"(r3)
- : "r"(r12), "r"(r5), "r"(r6), "r"(r7), "r"(r8), "r"(r9), "r"(r10)
-- : "memory");
-+ : "memory", "r4");
- return r3;
- }
-
-diff --git a/include/search.h b/include/search.h
-index 27f6107..02e407e 100644
---- a/include/search.h
-+++ b/include/search.h
-@@ -22,6 +22,18 @@ int hcreate(size_t);
- void hdestroy(void);
- ENTRY *hsearch(ENTRY, ACTION);
-
-+#ifdef _GNU_SOURCE
-+struct hsearch_data {
-+ struct __tab *__tab;
-+ unsigned int __unused1;
-+ unsigned int __unused2;
-+};
-+
-+int hcreate_r(size_t, struct hsearch_data *);
-+void hdestroy_r(struct hsearch_data *);
-+int hsearch_r(ENTRY, ACTION, ENTRY **, struct hsearch_data *);
-+#endif
-+
- void insque(void *, void *);
- void remque(void *);
-
-diff --git a/src/malloc/malloc.c b/src/malloc/malloc.c
-index d6ad904..7932a97 100644
---- a/src/malloc/malloc.c
-+++ b/src/malloc/malloc.c
-@@ -37,6 +37,7 @@ static struct {
- struct bin bins[64];
- int brk_lock[2];
- int free_lock[2];
-+ unsigned mmap_step;
- } mal;
-
-
-@@ -162,7 +163,28 @@ static struct chunk *expand_heap(size_t n)
- new = mal.brk + n + SIZE_ALIGN + PAGE_SIZE - 1 & -PAGE_SIZE;
- n = new - mal.brk;
-
-- if (__brk(new) != new) goto fail;
-+ if (__brk(new) != new) {
-+ size_t min = (size_t)PAGE_SIZE << mal.mmap_step/2;
-+ n += -n & PAGE_SIZE-1;
-+ if (n < min) n = min;
-+ void *area = __mmap(0, n, PROT_READ|PROT_WRITE,
-+ MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
-+ if (area == MAP_FAILED) goto fail;
-+
-+ mal.mmap_step++;
-+ area = (char *)area + SIZE_ALIGN - OVERHEAD;
-+ w = area;
-+ n -= SIZE_ALIGN;
-+ w->psize = 0 | C_INUSE;
-+ w->csize = n | C_INUSE;
-+ w = NEXT_CHUNK(w);
-+ w->psize = n | C_INUSE;
-+ w->csize = 0 | C_INUSE;
-+
-+ unlock(mal.brk_lock);
-+
-+ return area;
-+ }
-
- w = MEM_TO_CHUNK(new);
- w->psize = n | C_INUSE;
-diff --git a/src/search/hsearch.c b/src/search/hsearch.c
-index 6fe5ced..5c89651 100644
---- a/src/search/hsearch.c
-+++ b/src/search/hsearch.c
-@@ -1,6 +1,8 @@
-+#define _GNU_SOURCE
- #include <stdlib.h>
- #include <string.h>
- #include <search.h>
-+#include "libc.h"
-
- /*
- open addressing hash table with 2^n table size
-@@ -14,14 +16,17 @@ with the posix api items cannot be iterated and length cannot be queried
- #define MINSIZE 8
- #define MAXSIZE ((size_t)-1/2 + 1)
-
--struct elem {
-- ENTRY item;
-- size_t hash;
-+struct __tab {
-+ ENTRY *entries;
-+ size_t mask;
-+ size_t used;
- };
-
--static size_t mask;
--static size_t used;
--static struct elem *tab;
-+static struct hsearch_data htab;
-+
-+int __hcreate_r(size_t, struct hsearch_data *);
-+void __hdestroy_r(struct hsearch_data *);
-+int __hsearch_r(ENTRY, ACTION, ENTRY **, struct hsearch_data *);
-
- static size_t keyhash(char *k)
- {
-@@ -33,30 +38,30 @@ static size_t keyhash(char *k)
- return h;
- }
-
--static int resize(size_t nel)
-+static int resize(size_t nel, struct hsearch_data *htab)
- {
- size_t newsize;
- size_t i, j;
-- struct elem *e, *newe;
-- struct elem *oldtab = tab;
-- struct elem *oldend = tab + mask + 1;
-+ ENTRY *e, *newe;
-+ ENTRY *oldtab = htab->__tab->entries;
-+ ENTRY *oldend = htab->__tab->entries + htab->__tab->mask + 1;
-
- if (nel > MAXSIZE)
- nel = MAXSIZE;
- for (newsize = MINSIZE; newsize < nel; newsize *= 2);
-- tab = calloc(newsize, sizeof *tab);
-- if (!tab) {
-- tab = oldtab;
-+ htab->__tab->entries = calloc(newsize, sizeof *htab->__tab->entries);
-+ if (!htab->__tab->entries) {
-+ htab->__tab->entries = oldtab;
- return 0;
- }
-- mask = newsize - 1;
-+ htab->__tab->mask = newsize - 1;
- if (!oldtab)
- return 1;
- for (e = oldtab; e < oldend; e++)
-- if (e->item.key) {
-- for (i=e->hash,j=1; ; i+=j++) {
-- newe = tab + (i & mask);
-- if (!newe->item.key)
-+ if (e->key) {
-+ for (i=keyhash(e->key),j=1; ; i+=j++) {
-+ newe = htab->__tab->entries + (i & htab->__tab->mask);
-+ if (!newe->key)
- break;
- }
- *newe = *e;
-@@ -67,29 +72,22 @@ static int resize(size_t nel)
-
- int hcreate(size_t nel)
- {
-- mask = 0;
-- used = 0;
-- tab = 0;
-- return resize(nel);
-+ return __hcreate_r(nel, &htab);
- }
-
- void hdestroy(void)
- {
-- free(tab);
-- tab = 0;
-- mask = 0;
-- used = 0;
-+ __hdestroy_r(&htab);
- }
-
--static struct elem *lookup(char *key, size_t hash)
-+static ENTRY *lookup(char *key, size_t hash, struct hsearch_data *htab)
- {
- size_t i, j;
-- struct elem *e;
-+ ENTRY *e;
-
- for (i=hash,j=1; ; i+=j++) {
-- e = tab + (i & mask);
-- if (!e->item.key ||
-- (e->hash==hash && strcmp(e->item.key, key)==0))
-+ e = htab->__tab->entries + (i & htab->__tab->mask);
-+ if (!e->key || strcmp(e->key, key) == 0)
- break;
- }
- return e;
-@@ -97,22 +95,60 @@ static struct elem *lookup(char *key, size_t hash)
-
- ENTRY *hsearch(ENTRY item, ACTION action)
- {
-+ ENTRY *e;
-+
-+ __hsearch_r(item, action, &e, &htab);
-+ return e;
-+}
-+
-+int __hcreate_r(size_t nel, struct hsearch_data *htab)
-+{
-+ int r;
-+
-+ htab->__tab = calloc(1, sizeof *htab->__tab);
-+ if (!htab->__tab)
-+ return 0;
-+ r = resize(nel, htab);
-+ if (r == 0) {
-+ free(htab->__tab);
-+ htab->__tab = 0;
-+ }
-+ return r;
-+}
-+weak_alias(__hcreate_r, hcreate_r);
-+
-+void __hdestroy_r(struct hsearch_data *htab)
-+{
-+ if (htab->__tab) free(htab->__tab->entries);
-+ free(htab->__tab);
-+ htab->__tab = 0;
-+}
-+weak_alias(__hdestroy_r, hdestroy_r);
-+
-+int __hsearch_r(ENTRY item, ACTION action, ENTRY **retval, struct hsearch_data *htab)
-+{
- size_t hash = keyhash(item.key);
-- struct elem *e = lookup(item.key, hash);
-+ ENTRY *e = lookup(item.key, hash, htab);
-
-- if (e->item.key)
-- return &e->item;
-- if (action == FIND)
-+ if (e->key) {
-+ *retval = e;
-+ return 1;
-+ }
-+ if (action == FIND) {
-+ *retval = 0;
- return 0;
-- e->item = item;
-- e->hash = hash;
-- if (++used > mask - mask/4) {
-- if (!resize(2*used)) {
-- used--;
-- e->item.key = 0;
-+ }
-+ *e = item;
-+ if (++htab->__tab->used > htab->__tab->mask - htab->__tab->mask/4) {
-+ if (!resize(2*htab->__tab->used, htab)) {
-+ htab->__tab->used--;
-+ e->key = 0;
-+ *retval = 0;
- return 0;
- }
-- e = lookup(item.key, hash);
-+ e = lookup(item.key, hash, htab);
- }
-- return &e->item;
-+ *retval = e;
-+ return 1;
- }
-+weak_alias(__hsearch_r, hsearch_r);
-diff --git a/src/signal/arm/sigsetjmp.s b/src/signal/arm/sigsetjmp.s
-index acb0301..0e7bcd4 100644
---- a/src/signal/arm/sigsetjmp.s
-+++ b/src/signal/arm/sigsetjmp.s
-@@ -1,6 +1,9 @@
- .global sigsetjmp
-+.global __sigsetjmp
- .type sigsetjmp,%function
-+.type __sigsetjmp,%function
- sigsetjmp:
-+__sigsetjmp:
- str a2,[a1,#256]
- tst a2,a2
- beq setjmp
-diff --git a/src/signal/i386/sigsetjmp.s b/src/signal/i386/sigsetjmp.s
-index 06e0a61..91c8c04 100644
---- a/src/signal/i386/sigsetjmp.s
-+++ b/src/signal/i386/sigsetjmp.s
-@@ -1,6 +1,9 @@
- .global sigsetjmp
-+.global __sigsetjmp
- .type sigsetjmp,@function
-+.type __sigsetjmp,@function
- sigsetjmp:
-+__sigsetjmp:
- mov 4(%esp),%eax
- mov 8(%esp),%ecx
- mov %ecx,24(%eax)
-diff --git a/src/signal/microblaze/sigsetjmp.s b/src/signal/microblaze/sigsetjmp.s
-index be869d6..2a23d14 100644
---- a/src/signal/microblaze/sigsetjmp.s
-+++ b/src/signal/microblaze/sigsetjmp.s
-@@ -1,6 +1,9 @@
- .global sigsetjmp
-+.global __sigsetjmp
- .type sigsetjmp,@function
-+.type __sigsetjmp,@function
- sigsetjmp:
-+__sigsetjmp:
- swi r6, r5, 72
- beqi r6, setjmp@PLT
-
-diff --git a/src/signal/mips/sigsetjmp.s b/src/signal/mips/sigsetjmp.s
-index 502e079..133ca77 100644
---- a/src/signal/mips/sigsetjmp.s
-+++ b/src/signal/mips/sigsetjmp.s
-@@ -1,8 +1,11 @@
- .set noreorder
-
- .global sigsetjmp
-+.global __sigsetjmp
- .type sigsetjmp,@function
-+.type __sigsetjmp,@function
- sigsetjmp:
-+__sigsetjmp:
- lui $gp, %hi(_gp_disp)
- addiu $gp, %lo(_gp_disp)
- beq $5, $0, 1f
-diff --git a/src/signal/powerpc/sigsetjmp.s b/src/signal/powerpc/sigsetjmp.s
-index d7d1af3..461b737 100644
---- a/src/signal/powerpc/sigsetjmp.s
-+++ b/src/signal/powerpc/sigsetjmp.s
-@@ -1,6 +1,9 @@
- .global sigsetjmp
-+ .global __sigsetjmp
- .type sigsetjmp,%function
-+ .type __sigsetjmp,%function
- sigsetjmp:
-+__sigsetjmp:
- #int sigsetjmp(sigjmp_buf buf, int save)
- # r3 r4
- #0) store save into buf->__fl
-diff --git a/src/signal/sh/sigsetjmp.s b/src/signal/sh/sigsetjmp.s
-index f6cae80..7951f07 100644
---- a/src/signal/sh/sigsetjmp.s
-+++ b/src/signal/sh/sigsetjmp.s
-@@ -1,6 +1,9 @@
- .global sigsetjmp
--.type sigsetjmp, @function
-+.global __sigsetjmp
-+.type sigsetjmp,@function
-+.type __sigsetjmp,@function
- sigsetjmp:
-+__sigsetjmp:
- mov.l r5, @(36,r4)
- tst r5, r5
- bf 2f
-diff --git a/src/signal/sigsetjmp.c b/src/signal/sigsetjmp.c
-index cb2257f..1bbe1a0 100644
---- a/src/signal/sigsetjmp.c
-+++ b/src/signal/sigsetjmp.c
-@@ -1,5 +1,6 @@
- #include <setjmp.h>
- #include <signal.h>
-+#include "libc.h"
-
- /* !!! This function will not work unless the compiler performs
- * tail call optimization. Machine-specific asm versions should
-@@ -12,3 +13,5 @@ int sigsetjmp(sigjmp_buf buf, int save)
- pthread_sigmask(SIG_SETMASK, 0, (sigset_t *)buf->__ss);
- return setjmp(buf);
- }
-+
-+weak_alias(sigsetjmp, __sigsetjmp);
-diff --git a/src/signal/x32/sigsetjmp.s b/src/signal/x32/sigsetjmp.s
-index dc38f03..17436f0 100644
---- a/src/signal/x32/sigsetjmp.s
-+++ b/src/signal/x32/sigsetjmp.s
-@@ -1,7 +1,10 @@
- /* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */
- .global sigsetjmp
-+.global __sigsetjmp
- .type sigsetjmp,@function
-+.type __sigsetjmp,@function
- sigsetjmp:
-+__sigsetjmp:
- andl %esi,%esi
- movq %rsi,64(%rdi)
- jz 1f
-diff --git a/src/signal/x86_64/sigsetjmp.s b/src/signal/x86_64/sigsetjmp.s
-index dc38f03..17436f0 100644
---- a/src/signal/x86_64/sigsetjmp.s
-+++ b/src/signal/x86_64/sigsetjmp.s
-@@ -1,7 +1,10 @@
- /* Copyright 2011-2012 Nicholas J. Kain, licensed under standard MIT license */
- .global sigsetjmp
-+.global __sigsetjmp
- .type sigsetjmp,@function
-+.type __sigsetjmp,@function
- sigsetjmp:
-+__sigsetjmp:
- andl %esi,%esi
- movq %rsi,64(%rdi)
- jz 1f
diff --git a/main/musl/0003-b9b2db2f-to-e94d0692.patch b/main/musl/0003-b9b2db2f-to-e94d0692.patch
deleted file mode 100644
index c13a5ffc8e..0000000000
--- a/main/musl/0003-b9b2db2f-to-e94d0692.patch
+++ /dev/null
@@ -1,166 +0,0 @@
-diff --git a/arch/arm/atomic.h b/arch/arm/atomic.h
-index 734d287..50ad947 100644
---- a/arch/arm/atomic.h
-+++ b/arch/arm/atomic.h
-@@ -22,7 +22,28 @@ static inline int a_ctz_64(uint64_t x)
- return a_ctz_l(y);
- }
-
-+#if __ARM_ARCH_6__ || __ARM_ARCH_6K__ || __ARM_ARCH_6ZK__ \
-+ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ \
-+ || __ARM_ARCH >= 7
-+static inline int __k_cas(int t, int s, volatile int *p)
-+{
-+ int ret;
-+ __asm__(
-+ " mcr p15,0,r0,c7,c10,5\n"
-+ "1: ldrex %0,%3\n"
-+ " subs %0,%0,%1\n"
-+ " strexeq %0,%2,%3\n"
-+ " teqeq %0,#1\n"
-+ " beq 1b\n"
-+ " mcr p15,0,r0,c7,c10,5\n"
-+ : "=&r"(ret)
-+ : "r"(t), "r"(s), "Q"(*p)
-+ : "memory", "cc" );
-+ return ret;
-+}
-+#else
- #define __k_cas ((int (*)(int, int, volatile int *))0xffff0fc0)
-+#endif
-
- static inline int a_cas(volatile int *p, int t, int s)
- {
-diff --git a/arch/arm/pthread_arch.h b/arch/arm/pthread_arch.h
-index 43a1c01..ec77a83 100644
---- a/arch/arm/pthread_arch.h
-+++ b/arch/arm/pthread_arch.h
-@@ -1,8 +1,22 @@
--typedef char *(*__ptr_func_t)(void) __attribute__((const));
-+#if __ARM_ARCH_6K__ || __ARM_ARCH_6ZK__ \
-+ || __ARM_ARCH_7A__ || __ARM_ARCH_7R__ \
-+ || __ARM_ARCH >= 7
-+
-+static inline __attribute__((const)) pthread_t __pthread_self()
-+{
-+ char *p;
-+ __asm__( "mrc p15,0,%0,c13,c0,3" : "=r"(p) );
-+ return (void *)(p+8-sizeof(struct pthread));
-+}
-+
-+#else
-
-+typedef char *(*__ptr_func_t)(void) __attribute__((const));
- #define __pthread_self() \
- ((pthread_t)(((__ptr_func_t)0xffff0fe0)()+8-sizeof(struct pthread)))
-
-+#endif
-+
- #define TLS_ABOVE_TP
- #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) - 8)
-
-diff --git a/include/sys/auxv.h b/include/sys/auxv.h
-new file mode 100644
-index 0000000..6dcf9ad
---- /dev/null
-+++ b/include/sys/auxv.h
-@@ -0,0 +1,16 @@
-+#ifndef _SYS_AUXV_H
-+#define _SYS_AUXV_H
-+
-+#ifdef __cplusplus
-+extern "C" {
-+#endif
-+
-+#include <elf.h>
-+
-+unsigned long getauxval(unsigned long);
-+
-+#ifdef __cplusplus
-+}
-+#endif
-+
-+#endif
-diff --git a/src/env/__init_tls.c b/src/env/__init_tls.c
-index 8ac0036..89d081e 100644
---- a/src/env/__init_tls.c
-+++ b/src/env/__init_tls.c
-@@ -64,16 +64,6 @@ void *__tls_get_addr(size_t *v)
- return (char *)__pthread_self()->dtv[1]+v[1];
- }
-
--static void *simple(void *p)
--{
-- *(void **)p = p;
-- return __set_thread_area(TP_ADJ(p)) ? 0 : p;
--}
--
--weak_alias(simple, __install_initial_tls);
--
--void *__mmap(void *, size_t, int, int, int, off_t);
--
- #if ULONG_MAX == 0xffffffff
- typedef Elf32_Phdr Phdr;
- #else
-diff --git a/src/env/__libc_start_main.c b/src/env/__libc_start_main.c
-index 73d4932..ac37492 100644
---- a/src/env/__libc_start_main.c
-+++ b/src/env/__libc_start_main.c
-@@ -3,7 +3,6 @@
-
- void __init_tls(size_t *);
- void __init_security(size_t *);
--void __init_ldso_ctors(void);
-
- #ifndef SHARED
- static void dummy() {}
-diff --git a/src/misc/getauxval.c b/src/misc/getauxval.c
-new file mode 100644
-index 0000000..5ac8b3d
---- /dev/null
-+++ b/src/misc/getauxval.c
-@@ -0,0 +1,12 @@
-+#include <sys/auxv.h>
-+#include <errno.h>
-+#include "libc.h"
-+
-+unsigned long getauxval(unsigned long item)
-+{
-+ size_t *auxv = libc.auxv;
-+ for (; *auxv; auxv+=2)
-+ if (*auxv==item) return auxv[1];
-+ errno = ENOENT;
-+ return 0;
-+}
-diff --git a/src/stdio/vfprintf.c b/src/stdio/vfprintf.c
-index 31c3d5d..f6e7f38 100644
---- a/src/stdio/vfprintf.c
-+++ b/src/stdio/vfprintf.c
-@@ -308,8 +308,8 @@ static int fmt_fp(FILE *f, long double y, int w, int p, int fl, int t)
- *d = x % 1000000000;
- carry = x / 1000000000;
- }
-- if (!z[-1] && z>a) z--;
- if (carry) *--a = carry;
-+ while (z>a && !z[-1]) z--;
- e2-=sh;
- }
- while (e2<0) {
-@@ -356,15 +356,15 @@ static int fmt_fp(FILE *f, long double y, int w, int p, int fl, int t)
- *d = *d + i;
- while (*d > 999999999) {
- *d--=0;
-+ if (d<a) *--a=0;
- (*d)++;
- }
-- if (d<a) a=d;
- for (i=10, e=9*(r-a); *a>=i; i*=10, e++);
- }
- }
- if (z>d+1) z=d+1;
-- for (; !z[-1] && z>a; z--);
- }
-+ for (; z>a && !z[-1]; z--);
-
- if ((t|32)=='g') {
- if (!p) p++;
diff --git a/main/musl/0004-e94d0692-to-83c98aac.patch b/main/musl/0004-e94d0692-to-83c98aac.patch
deleted file mode 100644
index 88cf625fc8..0000000000
--- a/main/musl/0004-e94d0692-to-83c98aac.patch
+++ /dev/null
@@ -1,59 +0,0 @@
-diff --git a/src/internal/syscall.h b/src/internal/syscall.h
-index 88fc89c..dcfae00 100644
---- a/src/internal/syscall.h
-+++ b/src/internal/syscall.h
-@@ -10,7 +10,7 @@ typedef long syscall_arg_t;
- #endif
-
- #if defined(__PIC__) && (100*__GNUC__+__GNUC_MINOR__ >= 303)
--__attribute__((visibility("protected")))
-+__attribute__((visibility("hidden")))
- #endif
- long __syscall_ret(unsigned long), __syscall(syscall_arg_t, ...),
- __syscall_cp(syscall_arg_t, syscall_arg_t, syscall_arg_t, syscall_arg_t,
-diff --git a/src/math/modfl.c b/src/math/modfl.c
-index f736bba..4b03a4b 100644
---- a/src/math/modfl.c
-+++ b/src/math/modfl.c
-@@ -3,7 +3,12 @@
- #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
- long double modfl(long double x, long double *iptr)
- {
-- return modf(x, (double *)iptr);
-+ double d;
-+ long double r;
-+
-+ r = modf(x, &d);
-+ *iptr = d;
-+ return r;
- }
- #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
- #if LDBL_MANT_DIG == 64
-diff --git a/src/math/sincosl.c b/src/math/sincosl.c
-index 2c60080..d3ac1c4 100644
---- a/src/math/sincosl.c
-+++ b/src/math/sincosl.c
-@@ -4,7 +4,10 @@
- #if LDBL_MANT_DIG == 53 && LDBL_MAX_EXP == 1024
- void sincosl(long double x, long double *sin, long double *cos)
- {
-- sincos(x, (double *)sin, (double *)cos);
-+ double sind, cosd;
-+ sincos(x, &sind, &cosd);
-+ *sin = sind;
-+ *cos = cosd;
- }
- #elif (LDBL_MANT_DIG == 64 || LDBL_MANT_DIG == 113) && LDBL_MAX_EXP == 16384
- void sincosl(long double x, long double *sin, long double *cos)
-diff --git a/src/string/memmem.c b/src/string/memmem.c
-index 5211d75..a5a249f 100644
---- a/src/string/memmem.c
-+++ b/src/string/memmem.c
-@@ -139,6 +139,7 @@ void *memmem(const void *h0, size_t k, const void *n0, size_t l)
- /* Use faster algorithms for short needles */
- h = memchr(h0, *n, k);
- if (!h || l==1) return (void *)h;
-+ k -= h - (const unsigned char *)h0;
- if (l==2) return twobyte_memmem(h, k, n);
- if (l==3) return threebyte_memmem(h, k, n);
- if (l==4) return fourbyte_memmem(h, k, n);
diff --git a/main/musl/APKBUILD b/main/musl/APKBUILD
index 6d3817af11..19810121ed 100644
--- a/main/musl/APKBUILD
+++ b/main/musl/APKBUILD
@@ -1,8 +1,8 @@
# Contributor: William Pitcock <nenolod@dereferenced.org>
# Maintainer: Timo Teräs <timo.teras@iki.fi>
pkgname=musl
-pkgver=1.0.0
-pkgrel=11
+pkgver=1.1.0
+pkgrel=0
pkgdesc="the musl c library (libc) implementation"
url="http://www.musl-libc.org/"
arch="all"
@@ -14,11 +14,6 @@ install=""
subpackages="$pkgname-dev $pkgname-utils"
[ "${CTARGET#*musl}" = "$CTARGET" ] && subpackages="$subpackages musl-gcc:crosstool"
source="http://www.musl-libc.org/releases/musl-$pkgver.tar.gz
- 0001-v1.0.0-to-2b74315d.patch
- 0002-2b74315d-to-b9b2db2f.patch
- 0003-b9b2db2f-to-e94d0692.patch
- 0004-e94d0692-to-83c98aac.patch
-
1001-add-basic-dns-record-parsing-functions.patch
1002-reimplement-if_nameindex-and-getifaddrs-using-netlin.patch
@@ -120,33 +115,21 @@ crosstool() {
find "$pkgdir" -type d -delete 2>/dev/null
}
-md5sums="e54664fdf211d27737e328c4462b545e musl-1.0.0.tar.gz
-d081fc3424229c639e636be2dd00d221 0001-v1.0.0-to-2b74315d.patch
-48fa02a48a33bbcb8149edf6540d02f9 0002-2b74315d-to-b9b2db2f.patch
-d0a6498cede60e70c468d9a44b968abe 0003-b9b2db2f-to-e94d0692.patch
-1bd1787e961189215e0a60e9ed863529 0004-e94d0692-to-83c98aac.patch
+md5sums="c2118c3b6afc77f46a0b23a38a8c3080 musl-1.1.0.tar.gz
a3810683ef61ac27e2f6ec9801280c81 1001-add-basic-dns-record-parsing-functions.patch
83c3bd2a50b1de5ef948704d3f4e0583 1002-reimplement-if_nameindex-and-getifaddrs-using-netlin.patch
61c6c1e84ed1df82abbe6d75e90cf21c getopt_long.c
0df687757221bbb0fc1aa67f1bd646f9 __stack_chk_fail_local.c
7b391300396e58fe9073866b5a80cfe8 getconf.c
2b941c4251cac44988a4abfc50e21267 getent.c"
-sha256sums="1ad7f45d2972daff19c9e6a92714e6d70f4aad003cd8c3d1e6113432114c1a32 musl-1.0.0.tar.gz
-aa632b635d472d5a6a49800899ce34cddc89a63a489690faa683d08622b9cd60 0001-v1.0.0-to-2b74315d.patch
-edc0cebaabd16f894d91c1860bfb70d3f2d9a70cf558c5455689610374447f7d 0002-2b74315d-to-b9b2db2f.patch
-8ee26d42062a4bc91a7fc95fe3f257b9ffcbef600a6344257f7681f358a4a012 0003-b9b2db2f-to-e94d0692.patch
-48a906fd2390b9d9015807c2d3d200c96fa4983faf229661d7158b62ae5dcfd2 0004-e94d0692-to-83c98aac.patch
+sha256sums="de1b43019e5361d7577e5e0213e9dde591853e9da5d4a7cd75e2e0d78bf60820 musl-1.1.0.tar.gz
758390768b1bc4159d56908ca332b9640cd0552ed3b4b2b8d4a6d499c54c11a1 1001-add-basic-dns-record-parsing-functions.patch
1c25880095e869b827f02997e864fdf4bf157a4e923e52d97dbd05e657aedb70 1002-reimplement-if_nameindex-and-getifaddrs-using-netlin.patch
d9b644ec20bc33e81a7c52b9fcf7973d835923a69faf50f03db45534b811bd96 getopt_long.c
299a7d75a09de3e2e11e7fb4acc3182e4a14e868093d2f30938fce9bfcff13da __stack_chk_fail_local.c
530ea449f93d53fafcb377fa0a23a7564f2961e49c07a8fdef6c960110317301 getconf.c
68373a55e89ce85c562d941ccf588337d6cc6c9c17689d695f65cd7607134bbe getent.c"
-sha512sums="c76cbfe60cbe9b1ceb1faedddf2dcce0f11c942c8f74e4f217efe63e8e1d7be70fcb6cf1182eeaee90441152c4493d678682cb247a0dbc7537d24f943a7bbdf8 musl-1.0.0.tar.gz
-e04f0f9de2859d18cb13aa8bfd839cc757aa9d835f133e46b48a760c7e689a92c641abe1e84dcaab6134c22500603e66d9a880f9b80b77e36a063348f5879878 0001-v1.0.0-to-2b74315d.patch
-19c09e09d61ba31caeece27ea4241be4f14f73ab958da7f37fc4f0c8391fcaa912a750a2b79c29b3fec24ad22995244c91d1f0372d9b8481c99411e2442c2d4e 0002-2b74315d-to-b9b2db2f.patch
-352b7c0693ebe6093e71d4e9cb704ff569e0e0ae2dcc576d3dc4883e7dddd1ffbc09d8365cceabbeec6b974496dddb9ed7bfacaa244c92c2735caf08c843593a 0003-b9b2db2f-to-e94d0692.patch
-13b22003bb8b40786e524df42ec9560d56f45265a531faf82e2285cc0c2e893937f4c32159ec75b99c7953dbeeef15b24c2e8dbe2145728e9b011ae8952a81f5 0004-e94d0692-to-83c98aac.patch
+sha512sums="72dab085fa56a2f02d407074b9a4c1d409624df74924ed385b174a767113aa0a4112bd22d3eaf465b31a14b8e60a15997d6042421994673977de306ee8738b3d musl-1.1.0.tar.gz
dad965258daf69371b844f76bfe5a914b0eca0ca76f3fc340b8fd7acf598b5f87bbe6d68b1f43ed0293ee0ed3bfd85d5173ccc169aa6265646248d5b8a906708 1001-add-basic-dns-record-parsing-functions.patch
72cf33738d2cf31f6ec02312bc494d754c17470b519172bb8bd7e2e29ac3b119023088a2b3fbc0dbc2fddd0078ccbae62096106cae361f8c31d6a9950043af25 1002-reimplement-if_nameindex-and-getifaddrs-using-netlin.patch
140f3f20d30bd95ebce8c41b8cc7f616c6cbedf4ea06c729c21014e74f6043796825cc40ebc5180620ea38173afdba23f09ebf6d8b11fa05440b14d23764fca9 getopt_long.c