Changeset 46481


Ignore:
Timestamp:
2015-07-24T17:35:55+02:00 (3 years ago)
Author:
nbd
Message:

musl: update to latest git version

Signed-off-by: Felix Fietkau <nbd@…>

Location:
trunk/toolchain/musl/patches
Files:
4 edited
1 moved

Legend:

Unmodified
Added
Removed
  • trunk/toolchain/musl/patches/001-git-2015-07-22.patch

    r46480 r46481  
     1commit 3975577922aedab7d60788dd320a2c8e4e94bc6e 
     2Author: Roman Yeryomin <roman@ubnt.com> 
     3Date:   Thu Jul 2 12:29:00 2015 +0300 
     4 
     5    socket.h: cleanup/reorder mips and powerpc bits/socket.h 
     6     
     7    ....to be somewhat consistent and easily comparable with asm/socket.h 
     8     
     9    Signed-off-by: Roman Yeryomin <roman@ubnt.com> 
     10 
     11commit 29ec7677a73a5227badbb1064205be09e707e466 
     12Author: Roman Yeryomin <roman@ubnt.com> 
     13Date:   Thu Jul 2 12:28:41 2015 +0300 
     14 
     15    socket.h: fix SO_* for mips 
     16     
     17    Signed-off-by: Roman Yeryomin <roman@ubnt.com> 
     18 
     19commit 3fffa7a658aa925b8f95d36aef7531c1827dbf28 
     20Author: Felix Fietkau <nbd@openwrt.org> 
     21Date:   Tue Jul 21 15:01:25 2015 +0200 
     22 
     23    mips: fix mcontext_t register array field name 
     24     
     25    glibc and uclibc use gregs instead of regs 
     26     
     27    Signed-off-by: Felix Fietkau <nbd@openwrt.org> 
     28 
     29commit 0f9c2666aca95eb98eb0ef4f4d8d1473c8ce3fa0 
     30Author: Rich Felker <dalias@aerifal.cx> 
     31Date:   Thu Jul 9 18:36:02 2015 +0000 
     32 
     33    handle loss of syslog socket connection 
     34     
     35    when traditional syslogd implementations are restarted, the old server 
     36    socket ceases to exist and a new unix socket with the same pathname is 
     37    created. when this happens, the default destination address associated 
     38    with the client socket via connect is no longer valid, and attempts to 
     39    send produce errors. this happens despite the socket being datagram 
     40    type, and is in contrast to the behavior that would be seen with an IP 
     41    datagram (UDP) socket. 
     42     
     43    in order to avoid a situation where the application is unable to send 
     44    further syslog messages without calling closelog, this patch makes 
     45    syslog attempt to reconnect the socket when send returns an error 
     46    indicating a lost connection. 
     47     
     48    additionally, initial failure to connect the socket no longer results 
     49    in the socket being closed. this ensures that an application which 
     50    calls openlog to reserve the socket file descriptor will not run into 
     51    a situation where transient connection failure (e.g. due to syslogd 
     52    restart) prevents fd reservation. however, applications which may be 
     53    unable to connect the socket later (e.g. due to chroot, restricted 
     54    permissions, seccomp, etc.) will still fail to log if the syslog 
     55    socket cannot be connected at openlog time or if it has to be 
     56    reconnected later. 
     57 
     58commit 11894f6d3a80be950a490dc7dfab349f057a545f 
     59Author: Rich Felker <dalias@aerifal.cx> 
     60Date:   Thu Jul 9 17:07:35 2015 +0000 
     61 
     62    fix incorrect void return type for syncfs function 
     63     
     64    being nonstandard, the closest thing to a specification for this 
     65    function is its man page, which documents it as returning int. it can 
     66    fail with EBADF if the file descriptor passed is invalid. 
     67 
     68commit e8cbe0bad4284906230a53af4c91ad2b9713d03b 
     69Author: Rich Felker <dalias@aerifal.cx> 
     70Date:   Wed Jul 8 02:46:45 2015 +0000 
     71 
     72    fix negated return value of ns_skiprr, breakage in related functions 
     73     
     74    due to a reversed pointer difference computation, ns_skiprr always 
     75    returned a negative value, which functions using it would interpret as 
     76    an error. 
     77     
     78    patch by Yu Lu. 
     79 
     80commit fb58545f8d1c5fa32122244caeaf3625c12ddc01 
     81Author: Shiz <hi@shiz.me> 
     82Date:   Sun Jun 28 23:08:21 2015 +0200 
     83 
     84    add musl-clang, a wrapper for system clang installs 
     85     
     86    musl-clang allows the user to compile musl-powered programs using their 
     87    already existent clang install, without the need of a special cross compiler. 
     88    it achieves this by wrapping around both the system clang install and the 
     89    linker and passing them special flags to re-target musl at runtime. 
     90    it does only affect invocations done through the special musl-clang wrapper 
     91    script, so that the user setup remains fully intact otherwise. 
     92     
     93    the clang wrapper consists of the compiler frontend wrapper script, 
     94    musl-clang, and the linker wrapper script, ld.musl-clang. 
     95    musl-clang makes sure clang invokes ld.musl-clang to link objects; neither 
     96    script needs to be in PATH for the wrapper to work. 
     97 
     98commit f8db6f74b2c74a50c4dec7e30be5215f0e2c37a6 
     99Author: Shiz <hi@shiz.me> 
     100Date:   Sun Jun 28 23:08:20 2015 +0200 
     101 
     102    build: fix musl-targeting toolchain test 
     103     
     104    the old test was broken in that it would never fail on a toolchains built 
     105    without dynamic linking support, leading to the wrapper script possibly being 
     106    installed on compilers that do not support it. in addition, the new test is 
     107    portable across compilers: the old test only worked on GCC. 
     108     
     109    the new test works by testing whether the toolchain libc defines __GLIBC__: 
     110    most non-musl Linux libc's do define this for compatibility even when they 
     111    are not glibc, so this is a safe bet to check for musl. in addition, the 
     112    compiler runtime would need to have a somewhat glibc-compatible ABI in the 
     113    first place, so any non-glibc compatible libc's compiler runtime might not 
     114    work. it is safer to disable these cases by default and have the user enable 
     115    the wrappers manually there using --enable-wrapper if they certain it works. 
     116 
     117commit b3cd7d13fe630ba1847326242525298e361018c1 
     118Author: Shiz <hi@shiz.me> 
     119Date:   Sun Jun 28 23:08:19 2015 +0200 
     120 
     121    build: overhaul wrapper script system for multiple wrapper support 
     122     
     123    this overhauls part of the build system in order to support multiple 
     124    toolchain wrapper scripts, as opposed to solely the musl-gcc wrapper as 
     125    before. it thereby replaces --enable-gcc-wrapper with --enable-wrapper=..., 
     126    which has the options 'auto' (the default, detect whether to use wrappers), 
     127    'all' (build and install all wrappers), 'no' (don't build any) and finally 
     128    the options named after the individual compiler scripts (currently only 
     129    'gcc' is available) to build and install only that wrapper. 
     130    the old --enable-gcc-wrapper is removed from --help, but still available. 
     131     
     132    it also modifies the wrappers to use the C compiler specified to the build 
     133    system as 'inner' compiler, when applicable. as wrapper detection works by 
     134    probing this compiler, it may not work with any other. 
     135 
     136commit 2a780aa3050b86d888489361f04220bfb58890a1 
     137Author: Rich Felker <dalias@aerifal.cx> 
     138Date:   Mon Jul 6 22:13:11 2015 +0000 
     139 
     140    treat empty TZ environment variable as GMT rather than default 
     141     
     142    this improves compatibility with the behavior of other systems and 
     143    with some applications which set an empty TZ var to disable use of 
     144    local time by mktime, etc. 
     145 
     146commit 8f08a58c635bea5cdfae6bc0e323c80aa9ff82a7 
     147Author: Alexander Monakov <amonakov@ispras.ru> 
     148Date:   Sun Jun 28 02:48:33 2015 +0300 
     149 
     150    dynlink.c: pass gnu-hash table pointer to gnu_lookup 
     151     
     152    The callers need to check the value of the pointer anyway, so make 
     153    them pass the pointer to gnu_lookup instead of reloading it there. 
     154     
     155    Reorder gnu_lookup arguments so that always-used ones are listed 
     156    first. GCC can choose a calling convention with arguments in registers 
     157    (e.g. up to 3 arguments in eax, ecx, edx on x86), but cannot reorder 
     158    the arguments for static functions. 
     159 
     160commit 5b4286e12cd6baac343b10a41dc17ac578832089 
     161Author: Alexander Monakov <amonakov@ispras.ru> 
     162Date:   Sun Jun 28 02:48:32 2015 +0300 
     163 
     164    dynlink.c: slim down gnu_lookup 
     165     
     166    Do not reference dso->syms and dso->strings until point of use. 
     167    Check 'h1 == (h2|1)', the simplest condition, before the others. 
     168 
     169commit 84389c64562e2b2ba43225b5b7a9df7d974479b1 
     170Author: Alexander Monakov <amonakov@ispras.ru> 
     171Date:   Sun Jun 28 02:48:31 2015 +0300 
     172 
     173    dynlink.c: use bloom filter in gnu hash lookup 
     174     
     175    Introduce gnu_lookup_filtered and use it to speed up symbol lookups in 
     176    find_sym (do_dlsym is left as is, based on an expectation that 
     177    frequently dlsym queries will use a dlopen handle rather than 
     178    RTLD_NEXT or RTLD_DEFAULT, and will not need to look at more than one 
     179    DSO). 
     180 
     181commit 66d45787c865a1807ae397a89a14699394ed4fa4 
     182Author: Alexander Monakov <amonakov@ispras.ru> 
     183Date:   Sun Jun 28 02:48:30 2015 +0300 
     184 
     185    dynlink.c: use a faster expression in gnu_hash 
     186     
     187    With -Os, GCC uses a multiply rather than a shift and addition for 'h*33'. 
     188    Use a more efficient expression explicitely. 
     189 
    1190commit 6ba5517a460c6c438f64d69464fdfc3269a4c91a 
    2191Author: Rich Felker <dalias@aerifal.cx> 
     
    516705    be assigned unconditonally resulting in crashes later on. 
    517706 
    518 diff --git a/arch/arm/syscall_arch.h b/arch/arm/syscall_arch.h 
    519 index 199ad2a..64461ec 100644 
     707--- a/.gitignore 
     708+++ b/.gitignore 
     709@@ -7,5 +7,7 @@ arch/*/bits/alltypes.h 
     710 config.mak 
     711 include/bits 
     712 tools/musl-gcc 
     713+tools/musl-clang 
     714+tools/ld.musl-clang 
     715 lib/musl-gcc.specs 
     716 src/internal/version.h 
     717--- a/Makefile 
     718+++ b/Makefile 
     719@@ -51,6 +51,9 @@ TOOL_LIBS = lib/musl-gcc.specs 
     720 ALL_LIBS = $(CRT_LIBS) $(STATIC_LIBS) $(SHARED_LIBS) $(EMPTY_LIBS) $(TOOL_LIBS) 
     721 ALL_TOOLS = tools/musl-gcc 
     722  
     723+WRAPCC_GCC = gcc 
     724+WRAPCC_CLANG = clang 
     725+ 
     726 LDSO_PATHNAME = $(syslibdir)/ld-musl-$(ARCH)$(SUBARCH).so.1 
     727  
     728 -include config.mak 
     729@@ -155,7 +158,11 @@ lib/musl-gcc.specs: tools/musl-gcc.specs 
     730        sh $< "$(includedir)" "$(libdir)" "$(LDSO_PATHNAME)" > $@ 
     731  
     732 tools/musl-gcc: config.mak 
     733-       printf '#!/bin/sh\nexec "$${REALGCC:-gcc}" "$$@" -specs "%s/musl-gcc.specs"\n' "$(libdir)" > $@ 
     734+       printf '#!/bin/sh\nexec "$${REALGCC:-$(WRAPCC_GCC)}" "$$@" -specs "%s/musl-gcc.specs"\n' "$(libdir)" > $@ 
     735+       chmod +x $@ 
     736+ 
     737+tools/%-clang: tools/%-clang.in config.mak 
     738+       sed -e 's!@CC@!$(WRAPCC_CLANG)!g' -e 's!@PREFIX@!$(prefix)!g' -e 's!@INCDIR@!$(includedir)!g' -e 's!@LIBDIR@!$(libdir)!g' -e 's!@LDSO@!$(LDSO_PATHNAME)!g' $< > $@ 
     739        chmod +x $@ 
     740  
     741 $(DESTDIR)$(bindir)/%: tools/% 
    520742--- a/arch/arm/syscall_arch.h 
    521743+++ b/arch/arm/syscall_arch.h 
    522 @@ -72,3 +72,7 @@ static inline long __syscall6(long n, long a, long b, long c, long d, long e, lo 
     744@@ -72,3 +72,7 @@ static inline long __syscall6(long n, lo 
    523745        register long r5 __asm__("r5") = f; 
    524746        __asm_syscall("r"(r7), "0"(r0), "r"(r1), "r"(r2), "r"(r3), "r"(r4), "r"(r5)); 
     
    528750+#define VDSO_CGT_SYM "__vdso_clock_gettime" 
    529751+#define VDSO_CGT_VER "LINUX_2.6" 
    530 diff --git a/arch/mips/pthread_arch.h b/arch/mips/pthread_arch.h 
    531 index f8e35ae..904a248 100644 
     752--- a/arch/mips/bits/signal.h 
     753+++ b/arch/mips/bits/signal.h 
     754@@ -28,7 +28,7 @@ struct sigcontext 
     755 typedef struct 
     756 { 
     757        unsigned regmask, status; 
     758-       unsigned long long pc, regs[32], fpregs[32]; 
     759+       unsigned long long pc, gregs[32], fpregs[32]; 
     760        unsigned ownedfp, fpc_csr, fpc_eir, used_math, dsp; 
     761        unsigned long long mdhi, mdlo; 
     762        unsigned long hi1, lo1, hi2, lo2, hi3, lo3; 
     763--- a/arch/mips/bits/socket.h 
     764+++ b/arch/mips/bits/socket.h 
     765@@ -22,26 +22,31 @@ struct cmsghdr 
     766 #define SOL_SOCKET     65535 
     767  
     768 #define SO_DEBUG        1 
     769-#define SO_REUSEADDR    4 
     770-#define SO_TYPE         0x1008 
     771-#define SO_ERROR        0x1007 
     772-#define SO_DONTROUTE    16 
     773-#define SO_BROADCAST    32 
     774+ 
     775+#define SO_REUSEADDR    0x0004 
     776+#define SO_KEEPALIVE    0x0008 
     777+#define SO_DONTROUTE    0x0010 
     778+#define SO_BROADCAST    0x0020 
     779+#define SO_LINGER       0x0080 
     780+#define SO_OOBINLINE    0x0100 
     781+#define SO_REUSEPORT    0x0200 
     782 #define SO_SNDBUF       0x1001 
     783 #define SO_RCVBUF       0x1002 
     784-#define SO_KEEPALIVE    8 
     785-#define SO_OOBINLINE    256 
     786+#define SO_SNDLOWAT     0x1003 
     787+#define SO_RCVLOWAT     0x1004 
     788+#define SO_RCVTIMEO     0x1006 
     789+#define SO_SNDTIMEO     0x1005 
     790+#define SO_ERROR        0x1007 
     791+#define SO_TYPE         0x1008 
     792+#define SO_ACCEPTCONN   0x1009 
     793+#define SO_PROTOCOL     0x1028 
     794+#define SO_DOMAIN       0x1029 
     795+ 
     796 #define SO_NO_CHECK     11 
     797 #define SO_PRIORITY     12 
     798-#define SO_LINGER       128 
     799 #define SO_BSDCOMPAT    14 
     800-#define SO_REUSEPORT    512 
     801 #define SO_PASSCRED     17 
     802 #define SO_PEERCRED     18 
     803-#define SO_RCVLOWAT     0x1004 
     804-#define SO_SNDLOWAT     0x1003 
     805-#define SO_RCVTIMEO     0x1006 
     806-#define SO_SNDTIMEO     0x1005 
     807 #define SO_SNDBUFFORCE  31 
     808 #define SO_RCVBUFFORCE  33 
     809  
    532810--- a/arch/mips/pthread_arch.h 
    533811+++ b/arch/mips/pthread_arch.h 
    534 @@ -13,4 +13,6 @@ static inline struct pthread *__pthread_self() 
     812@@ -13,4 +13,6 @@ static inline struct pthread *__pthread_ 
    535813 #define TLS_ABOVE_TP 
    536814 #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000) 
     
    539817+ 
    540818 #define CANCEL_REG_IP (3-(union {int __i; char __b;}){1}.__b) 
    541 diff --git a/arch/powerpc/pthread_arch.h b/arch/powerpc/pthread_arch.h 
    542 index 4115ec8..1cbfc22 100644 
     819--- a/arch/powerpc/bits/socket.h 
     820+++ b/arch/powerpc/bits/socket.h 
     821@@ -24,8 +24,6 @@ struct cmsghdr 
     822 #define SO_BROADCAST    6 
     823 #define SO_SNDBUF       7 
     824 #define SO_RCVBUF       8 
     825-#define SO_SNDBUFFORCE  32 
     826-#define SO_RCVBUFFORCE  33 
     827 #define SO_KEEPALIVE    9 
     828 #define SO_OOBINLINE    10 
     829 #define SO_NO_CHECK     11 
     830@@ -39,4 +37,8 @@ struct cmsghdr 
     831 #define SO_SNDTIMEO     19 
     832 #define SO_PASSCRED     20 
     833 #define SO_PEERCRED     21 
     834-  
     835+#define SO_ACCEPTCONN   30 
     836+#define SO_SNDBUFFORCE  32 
     837+#define SO_RCVBUFFORCE  33 
     838+#define SO_PROTOCOL     38 
     839+#define SO_DOMAIN       39 
    543840--- a/arch/powerpc/pthread_arch.h 
    544841+++ b/arch/powerpc/pthread_arch.h 
    545 @@ -12,6 +12,8 @@ static inline struct pthread *__pthread_self() 
     842@@ -12,6 +12,8 @@ static inline struct pthread *__pthread_ 
    546843 #define TLS_ABOVE_TP 
    547844 #define TP_ADJ(p) ((char *)(p) + sizeof(struct pthread) + 0x7000) 
     
    552849 // the kernel calls the ip "nip", it's the first saved value after the 32 
    553850 // GPRs. 
    554 diff --git a/arch/sh/src/__set_thread_area.c b/arch/sh/src/__set_thread_area.c 
    555 new file mode 100644 
    556 index 0000000..1d3e022 
    557851--- /dev/null 
    558852+++ b/arch/sh/src/__set_thread_area.c 
     
    592886+       return 0; 
    593887+} 
    594 diff --git a/arch/sh/src/__unmapself.c b/arch/sh/src/__unmapself.c 
    595 new file mode 100644 
    596 index 0000000..4df9e7b 
    597888--- /dev/null 
    598889+++ b/arch/sh/src/__unmapself.c 
     
    617908+       else __unmapself_sh_mmu(base, size); 
    618909+} 
    619 diff --git a/arch/sh/src/atomic.c b/arch/sh/src/atomic.c 
    620 index f8c615f..7fd7307 100644 
    621910--- a/arch/sh/src/atomic.c 
    622911+++ b/arch/sh/src/atomic.c 
     
    669958        int old; 
    670959        __asm__ __volatile__( 
    671 @@ -43,7 +67,15 @@ int __sh_cas(volatile int *p, int t, int s) 
     960@@ -43,7 +67,15 @@ int __sh_cas(volatile int *p, int t, int 
    672961  
    673962 int __sh_swap(volatile int *x, int v) 
     
    703992        int old, dummy; 
    704993        __asm__ __volatile__( 
    705 @@ -69,7 +109,7 @@ int __sh_fetch_add(volatile int *x, int v) 
     994@@ -69,7 +109,7 @@ int __sh_fetch_add(volatile int *x, int 
    706995  
    707996 void __sh_store(volatile int *p, int x) 
     
    7461035        int dummy; 
    7471036        __asm__ __volatile__( 
    748 diff --git a/arch/sh/src/sh_atomic.h b/arch/sh/src/sh_atomic.h 
    749 new file mode 100644 
    750 index 0000000..054c2a3 
    7511037--- /dev/null 
    7521038+++ b/arch/sh/src/sh_atomic.h 
     
    7671053+ 
    7681054+#endif 
    769 diff --git a/arch/sh/syscall_arch.h b/arch/sh/syscall_arch.h 
    770 index 7ee21a5..f63675a 100644 
    7711055--- a/arch/sh/syscall_arch.h 
    7721056+++ b/arch/sh/syscall_arch.h 
     
    7801064                "or r0, r0\n"                     \ 
    7811065                "or r0, r0\n"                     \ 
    782 diff --git a/include/ctype.h b/include/ctype.h 
    783 index cd2e016..7936536 100644 
     1066--- a/configure 
     1067+++ b/configure 
     1068@@ -28,7 +28,7 @@ Optional features: 
     1069   --enable-debug          build with debugging information [disabled] 
     1070   --enable-warnings       build with recommended warnings flags [disabled] 
     1071   --enable-visibility     use global visibility options to optimize PIC [auto] 
     1072-  --enable-gcc-wrapper    build musl-gcc toolchain wrapper [auto] 
     1073+  --enable-wrapper=...    build given musl toolchain wrapper [auto] 
     1074   --disable-shared        inhibit building shared library [enabled] 
     1075   --disable-static        inhibit building static library [enabled] 
     1076  
     1077@@ -123,6 +123,8 @@ bindir='$(exec_prefix)/bin' 
     1078 libdir='$(prefix)/lib' 
     1079 includedir='$(prefix)/include' 
     1080 syslibdir='/lib' 
     1081+tools= 
     1082+tool_libs= 
     1083 target= 
     1084 optimize=auto 
     1085 debug=no 
     1086@@ -131,6 +133,8 @@ visibility=auto 
     1087 shared=auto 
     1088 static=yes 
     1089 wrapper=auto 
     1090+gcc_wrapper=no 
     1091+clang_wrapper=no 
     1092  
     1093 for arg ; do 
     1094 case "$arg" in 
     1095@@ -154,7 +158,12 @@ case "$arg" in 
     1096 --disable-warnings|--enable-warnings=no) warnings=no ;; 
     1097 --enable-visibility|--enable-visibility=yes) visibility=yes ;; 
     1098 --disable-visibility|--enable-visibility=no) visibility=no ;; 
     1099---enable-gcc-wrapper|--enable-gcc-wrapper=yes) wrapper=yes ;; 
     1100+--enable-wrapper|--enable-wrapper=yes) wrapper=detect ;; 
     1101+--enable-wrapper=all) wrapper=yes ; gcc_wrapper=yes ; clang_wrapper=yes ;; 
     1102+--enable-wrapper=gcc) wrapper=yes ; gcc_wrapper=yes ;; 
     1103+--enable-wrapper=clang) wrapper=yes ; clang_wrapper=yes ;; 
     1104+--disable-wrapper|--enable-wrapper=no) wrapper=no ;; 
     1105+--enable-gcc-wrapper|--enable-gcc-wrapper=yes) wrapper=yes ; gcc_wrapper=yes ;; 
     1106 --disable-gcc-wrapper|--enable-gcc-wrapper=no) wrapper=no ;; 
     1107 --enable-*|--disable-*|--with-*|--without-*|--*dir=*|--build=*) ;; 
     1108 --host=*|--target=*) target=${arg#*=} ;; 
     1109@@ -215,36 +224,51 @@ tryldflag LDFLAGS_TRY -Werror=unknown-wa 
     1110 tryldflag LDFLAGS_TRY -Werror=unused-command-line-argument 
     1111  
     1112 # 
     1113-# Need to know if the compiler is gcc to decide whether to build the 
     1114-# musl-gcc wrapper, and for critical bug detection in some gcc versions. 
     1115+# Need to know if the compiler is gcc or clang to decide which toolchain 
     1116+# wrappers to build. 
     1117 # 
     1118-printf "checking whether compiler is gcc... " 
     1119-if fnmatch '*gcc\ version*' "$(LC_ALL=C $CC -v 2>&1)" ; then 
     1120-cc_is_gcc=yes 
     1121+printf "checking for C compiler family... " 
     1122+cc_ver="$(LC_ALL=C $CC -v 2>&1)" 
     1123+cc_family=unknown 
     1124+if fnmatch '*gcc\ version*' "$cc_ver" ; then 
     1125+cc_family=gcc 
     1126+elif fnmatch '*clang\ version*' "$cc_ver" ; then 
     1127+cc_family=clang 
     1128+fi 
     1129+echo "$cc_family" 
     1130+ 
     1131+# 
     1132+# Figure out toolchain wrapper to build 
     1133+# 
     1134+if test "$wrapper" = auto -o "$wrapper" = detect ; then 
     1135+echo "#include <stdlib.h>" > "$tmpc" 
     1136+echo "#if ! __GLIBC__" >> "$tmpc" 
     1137+echo "#error no" >> "$tmpc" 
     1138+echo "#endif" >> "$tmpc" 
     1139+printf "checking for toolchain wrapper to build... " 
     1140+if test "$wrapper" = auto && ! $CC -c -o /dev/null "$tmpc" >/dev/null 2>&1 ; then 
     1141+echo "none" 
     1142+elif test "$cc_family" = gcc ; then 
     1143+gcc_wrapper=yes 
     1144+echo "gcc" 
     1145+elif test "$cc_family" = clang ; then 
     1146+clang_wrapper=yes 
     1147+echo "clang" 
     1148 else 
     1149-cc_is_gcc=no 
     1150+echo "none" 
     1151+if test "$wrapper" = detect ; then 
     1152+fail "$0: could not find an appropriate toolchain wrapper" 
     1153 fi 
     1154-echo "$cc_is_gcc" 
     1155- 
     1156-# 
     1157-# Only build musl-gcc wrapper if toolchain does not already target musl 
     1158-# 
     1159-if test "$wrapper" = auto ; then 
     1160-printf "checking whether to build musl-gcc wrapper... " 
     1161-if test "$cc_is_gcc" = yes ; then 
     1162-wrapper=yes 
     1163-while read line ; do 
     1164-case "$line" in */ld-musl-*) wrapper=no ;; esac 
     1165-done <<EOF 
     1166-$($CC -dumpspecs) 
     1167-EOF 
     1168-else 
     1169-wrapper=no 
     1170 fi 
     1171-echo "$wrapper" 
     1172 fi 
     1173  
     1174- 
     1175+if test "$gcc_wrapper" = yes ; then 
     1176+tools="$tools tools/musl-gcc" 
     1177+tool_libs="$tool_libs lib/musl-gcc.specs" 
     1178+fi 
     1179+if test "$clang_wrapper" = yes ; then 
     1180+tools="$tools tools/musl-clang tools/ld.musl-clang" 
     1181+fi 
     1182  
     1183 # 
     1184 # Find the target architecture 
     1185@@ -580,11 +604,13 @@ LDFLAGS = $LDFLAGS_AUTO $LDFLAGS 
     1186 CROSS_COMPILE = $CROSS_COMPILE 
     1187 LIBCC = $LIBCC 
     1188 OPTIMIZE_GLOBS = $OPTIMIZE_GLOBS 
     1189+ALL_TOOLS = $tools 
     1190+TOOL_LIBS = $tool_libs 
     1191 EOF 
     1192 test "x$static" = xno && echo "STATIC_LIBS =" 
     1193 test "x$shared" = xno && echo "SHARED_LIBS =" 
     1194-test "x$wrapper" = xno && echo "ALL_TOOLS =" 
     1195-test "x$wrapper" = xno && echo "TOOL_LIBS =" 
     1196+test "x$cc_family" = xgcc && echo 'WRAPCC_GCC = $(CC)' 
     1197+test "x$cc_family" = xclang && echo 'WRAPCC_CLANG = $(CC)' 
     1198 exec 1>&3 3>&- 
     1199  
     1200 printf "done\n" 
    7841201--- a/include/ctype.h 
    7851202+++ b/include/ctype.h 
     
    7921209 #endif 
    7931210  
    794 diff --git a/include/stdlib.h b/include/stdlib.h 
    795 index 97ce5a7..d2c911f 100644 
    7961211--- a/include/stdlib.h 
    7971212+++ b/include/stdlib.h 
    798 @@ -76,7 +76,8 @@ size_t wcstombs (char *__restrict, const wchar_t *__restrict, size_t); 
     1213@@ -76,7 +76,8 @@ size_t wcstombs (char *__restrict, const 
    7991214 #define EXIT_FAILURE 1 
    8001215 #define EXIT_SUCCESS 0 
     
    8061221 #define RAND_MAX (0x7fffffff) 
    8071222  
    808 diff --git a/src/ctype/__ctype_get_mb_cur_max.c b/src/ctype/__ctype_get_mb_cur_max.c 
    809 index d235f4d..8e946fc 100644 
     1223--- a/include/sys/socket.h 
     1224+++ b/include/sys/socket.h 
     1225@@ -177,8 +177,11 @@ struct linger 
     1226 #define SO_SNDLOWAT     19 
     1227 #define SO_RCVTIMEO     20 
     1228 #define SO_SNDTIMEO     21 
     1229+#define SO_ACCEPTCONN   30 
     1230 #define SO_SNDBUFFORCE  32 
     1231 #define SO_RCVBUFFORCE  33 
     1232+#define SO_PROTOCOL     38 
     1233+#define SO_DOMAIN       39 
     1234 #endif 
     1235  
     1236 #define SO_SECURITY_AUTHENTICATION              22 
     1237@@ -195,7 +198,6 @@ struct linger 
     1238 #define SO_TIMESTAMP            29 
     1239 #define SCM_TIMESTAMP           SO_TIMESTAMP 
     1240  
     1241-#define SO_ACCEPTCONN           30 
     1242 #define SO_PEERSEC              31 
     1243 #define SO_PASSSEC              34 
     1244 #define SO_TIMESTAMPNS          35 
     1245@@ -203,8 +205,6 @@ struct linger 
     1246 #define SO_MARK                 36 
     1247 #define SO_TIMESTAMPING         37 
     1248 #define SCM_TIMESTAMPING        SO_TIMESTAMPING 
     1249-#define SO_PROTOCOL             38 
     1250-#define SO_DOMAIN               39 
     1251 #define SO_RXQ_OVFL             40 
     1252 #define SO_WIFI_STATUS          41 
     1253 #define SCM_WIFI_STATUS         SO_WIFI_STATUS 
     1254--- a/include/unistd.h 
     1255+++ b/include/unistd.h 
     1256@@ -185,7 +185,7 @@ int setresgid(gid_t, gid_t, gid_t); 
     1257 int getresuid(uid_t *, uid_t *, uid_t *); 
     1258 int getresgid(gid_t *, gid_t *, gid_t *); 
     1259 char *get_current_dir_name(void); 
     1260-void syncfs(int); 
     1261+int syncfs(int); 
     1262 int euidaccess(const char *, int); 
     1263 int eaccess(const char *, int); 
     1264 #endif 
    8101265--- a/src/ctype/__ctype_get_mb_cur_max.c 
    8111266+++ b/src/ctype/__ctype_get_mb_cur_max.c 
     
    8201275+       return MB_CUR_MAX; 
    8211276 } 
    822 diff --git a/src/ctype/isascii.c b/src/ctype/isascii.c 
    823 index 3af0a10..54ad3bf 100644 
    8241277--- a/src/ctype/isascii.c 
    8251278+++ b/src/ctype/isascii.c 
     
    8301283 int isascii(int c) 
    8311284 { 
    832 diff --git a/src/env/__stack_chk_fail.c b/src/env/__stack_chk_fail.c 
    833 index 47784c6..be0c184 100644 
    8341285--- a/src/env/__stack_chk_fail.c 
    8351286+++ b/src/env/__stack_chk_fail.c 
     
    8431294+ 
    8441295 #endif 
    845 diff --git a/src/internal/libc.h b/src/internal/libc.h 
    846 index 6810cd8..98c7535 100644 
    8471296--- a/src/internal/libc.h 
    8481297+++ b/src/internal/libc.h 
     
    8561305        size_t page_size; 
    8571306        struct __locale_struct global_locale; 
    858 diff --git a/src/internal/locale_impl.h b/src/internal/locale_impl.h 
    859 index 9b8385e..f5e4d9b 100644 
    8601307--- a/src/internal/locale_impl.h 
    8611308+++ b/src/internal/locale_impl.h 
     
    8931340+ 
    8941341+#endif 
    895 diff --git a/src/internal/pthread_impl.h b/src/internal/pthread_impl.h 
    896 index e29f9c8..3890bb5 100644 
    8971342--- a/src/internal/pthread_impl.h 
    8981343+++ b/src/internal/pthread_impl.h 
     
    9081353 #define SIGCANCEL 33 
    9091354 #define SIGSYNCCALL 34 
    910 diff --git a/src/internal/sh/syscall.s b/src/internal/sh/syscall.s 
    911 index d00712a..331918a 100644 
    9121355--- a/src/internal/sh/syscall.s 
    9131356+++ b/src/internal/sh/syscall.s 
     
    9211364        or r0, r0 
    9221365        or r0, r0 
    923 diff --git a/src/internal/stdio_impl.h b/src/internal/stdio_impl.h 
    924 index e1325fe..0dd7fb5 100644 
    9251366--- a/src/internal/stdio_impl.h 
    9261367+++ b/src/internal/stdio_impl.h 
     
    9451386 #define feof(f) ((f)->flags & F_EOF) 
    9461387 #define ferror(f) ((f)->flags & F_ERR) 
    947 diff --git a/src/ldso/dynlink.c b/src/ldso/dynlink.c 
    948 index 42b056d..d2a7249 100644 
    9491388--- a/src/ldso/dynlink.c 
    9501389+++ b/src/ldso/dynlink.c 
    951 @@ -337,7 +337,7 @@ static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stri 
     1390@@ -156,7 +156,7 @@ static uint32_t gnu_hash(const char *s0) 
     1391        const unsigned char *s = (void *)s0; 
     1392        uint_fast32_t h = 5381; 
     1393        for (; *s; s++) 
     1394-               h = h*33 + *s; 
     1395+               h += h*32 + *s; 
     1396        return h; 
     1397 } 
     1398  
     1399@@ -174,32 +174,39 @@ static Sym *sysv_lookup(const char *s, u 
     1400        return 0; 
     1401 } 
     1402  
     1403-static Sym *gnu_lookup(const char *s, uint32_t h1, struct dso *dso) 
     1404+static Sym *gnu_lookup(uint32_t h1, uint32_t *hashtab, struct dso *dso, const char *s) 
     1405 { 
     1406-       Sym *syms = dso->syms; 
     1407-       char *strings = dso->strings; 
     1408-       uint32_t *hashtab = dso->ghashtab; 
     1409        uint32_t nbuckets = hashtab[0]; 
     1410        uint32_t *buckets = hashtab + 4 + hashtab[2]*(sizeof(size_t)/4); 
     1411-       uint32_t h2; 
     1412-       uint32_t *hashval; 
     1413        uint32_t i = buckets[h1 % nbuckets]; 
     1414  
     1415        if (!i) return 0; 
     1416  
     1417-       hashval = buckets + nbuckets + (i - hashtab[1]); 
     1418+       uint32_t *hashval = buckets + nbuckets + (i - hashtab[1]); 
     1419  
     1420        for (h1 |= 1; ; i++) { 
     1421-               h2 = *hashval++; 
     1422-               if ((!dso->versym || dso->versym[i] >= 0) 
     1423-                   && (h1 == (h2|1)) && !strcmp(s, strings + syms[i].st_name)) 
     1424-                       return syms+i; 
     1425+               uint32_t h2 = *hashval++; 
     1426+               if ((h1 == (h2|1)) && (!dso->versym || dso->versym[i] >= 0) 
     1427+                   && !strcmp(s, dso->strings + dso->syms[i].st_name)) 
     1428+                       return dso->syms+i; 
     1429                if (h2 & 1) break; 
     1430        } 
     1431  
     1432        return 0; 
     1433 } 
     1434  
     1435+static Sym *gnu_lookup_filtered(uint32_t h1, uint32_t *hashtab, struct dso *dso, const char *s, uint32_t fofs, size_t fmask) 
     1436+{ 
     1437+       const size_t *bloomwords = (const void *)(hashtab+4); 
     1438+       size_t f = bloomwords[fofs & (hashtab[2]-1)]; 
     1439+       if (!(f & fmask)) return 0; 
     1440+ 
     1441+       f >>= (h1 >> hashtab[3]) % (8 * sizeof f); 
     1442+       if (!(f & 1)) return 0; 
     1443+ 
     1444+       return gnu_lookup(h1, hashtab, dso, s); 
     1445+} 
     1446+ 
     1447 #define OK_TYPES (1<<STT_NOTYPE | 1<<STT_OBJECT | 1<<STT_FUNC | 1<<STT_COMMON | 1<<STT_TLS) 
     1448 #define OK_BINDS (1<<STB_GLOBAL | 1<<STB_WEAK | 1<<STB_GNU_UNIQUE) 
     1449  
     1450@@ -209,14 +216,20 @@ static Sym *gnu_lookup(const char *s, ui 
     1451  
     1452 static struct symdef find_sym(struct dso *dso, const char *s, int need_def) 
     1453 { 
     1454-       uint32_t h = 0, gh = 0; 
     1455+       uint32_t h = 0, gh, gho, *ght; 
     1456+       size_t ghm = 0; 
     1457        struct symdef def = {0}; 
     1458        for (; dso; dso=dso->next) { 
     1459                Sym *sym; 
     1460                if (!dso->global) continue; 
     1461-               if (dso->ghashtab) { 
     1462-                       if (!gh) gh = gnu_hash(s); 
     1463-                       sym = gnu_lookup(s, gh, dso); 
     1464+               if ((ght = dso->ghashtab)) { 
     1465+                       if (!ghm) { 
     1466+                               gh = gnu_hash(s); 
     1467+                               int maskbits = 8 * sizeof ghm; 
     1468+                               gho = gh / maskbits; 
     1469+                               ghm = 1ul << gh % maskbits; 
     1470+                       } 
     1471+                       sym = gnu_lookup_filtered(gh, ght, dso, s, gho, ghm); 
     1472                } else { 
     1473                        if (!h) h = sysv_hash(s); 
     1474                        sym = sysv_lookup(s, h, dso); 
     1475@@ -337,7 +350,7 @@ static void do_relocs(struct dso *dso, s 
    9521476                        *reloc_addr = def.dso->tls_id; 
    9531477                        break; 
     
    9581482 #ifdef TLS_ABOVE_TP 
    9591483                case REL_TPOFF: 
    960 @@ -423,6 +423,28 @@ static void reclaim_gaps(struct dso *dso) 
     1484@@ -423,6 +436,28 @@ static void reclaim_gaps(struct dso *dso 
    9611485        } 
    9621486 } 
     
    9871511 { 
    9881512        Ehdr buf[(896+sizeof(Ehdr))/sizeof(Ehdr)]; 
    989 @@ -524,19 +546,20 @@ static void *map_library(int fd, struct dso *dso) 
     1513@@ -524,19 +559,20 @@ static void *map_library(int fd, struct 
    9901514                prot = (((ph->p_flags&PF_R) ? PROT_READ : 0) | 
    9911515                        ((ph->p_flags&PF_W) ? PROT_WRITE: 0) | 
     
    10111535                        break; 
    10121536                } 
    1013 @@ -927,7 +950,8 @@ static void reloc_all(struct dso *p) 
     1537@@ -927,7 +963,8 @@ static void reloc_all(struct dso *p) 
    10141538                do_relocs(p, (void *)(p->base+dyn[DT_RELA]), dyn[DT_RELASZ], 3); 
    10151539  
     
    10211545                                p->name); 
    10221546                        if (runtime) longjmp(*rtld_fail, 1); 
    1023 @@ -1078,7 +1102,7 @@ void *__tls_get_new(size_t *v) 
     1547@@ -1078,7 +1115,7 @@ void *__tls_get_new(size_t *v) 
    10241548        __block_all_sigs(&set); 
    10251549        if (v[0]<=(size_t)self->dtv[0]) { 
     
    10301554  
    10311555        /* This is safe without any locks held because, if the caller 
    1032 @@ -1111,7 +1135,7 @@ void *__tls_get_new(size_t *v) 
     1556@@ -1111,7 +1148,7 @@ void *__tls_get_new(size_t *v) 
    10331557                if (p->tls_id == v[0]) break; 
    10341558        } 
     
    10391563  
    10401564 static void update_tls_size() 
    1041 @@ -1192,6 +1216,17 @@ _Noreturn void __dls3(size_t *sp) 
     1565@@ -1192,6 +1229,17 @@ _Noreturn void __dls3(size_t *sp) 
    10421566        char **argv_orig = argv; 
    10431567        char **envp = argv+argc+1; 
     
    10571581         * use during dynamic linking. If possible it will also serve as the 
    10581582         * thread pointer at runtime. */ 
    1059 @@ -1200,25 +1235,11 @@ _Noreturn void __dls3(size_t *sp) 
     1583@@ -1200,25 +1248,11 @@ _Noreturn void __dls3(size_t *sp) 
    10601584                a_crash(); 
    10611585        } 
     
    10861610        /* If the main program was already loaded by the kernel, 
    10871611         * AT_PHDR will point to some location other than the dynamic 
    1088 diff --git a/src/locale/c_locale.c b/src/locale/c_locale.c 
    1089 new file mode 100644 
    1090 index 0000000..77ccf58 
     1612@@ -1523,7 +1557,7 @@ void *__tls_get_addr(size_t *); 
     1613 static void *do_dlsym(struct dso *p, const char *s, void *ra) 
     1614 { 
     1615        size_t i; 
     1616-       uint32_t h = 0, gh = 0; 
     1617+       uint32_t h = 0, gh = 0, *ght; 
     1618        Sym *sym; 
     1619        if (p == head || p == RTLD_DEFAULT || p == RTLD_NEXT) { 
     1620                if (p == RTLD_DEFAULT) { 
     1621@@ -1541,9 +1575,9 @@ static void *do_dlsym(struct dso *p, con 
     1622        } 
     1623        if (invalid_dso_handle(p)) 
     1624                return 0; 
     1625-       if (p->ghashtab) { 
     1626+       if ((ght = p->ghashtab)) { 
     1627                gh = gnu_hash(s); 
     1628-               sym = gnu_lookup(s, gh, p); 
     1629+               sym = gnu_lookup(gh, ght, p, s); 
     1630        } else { 
     1631                h = sysv_hash(s); 
     1632                sym = sysv_lookup(s, h, p); 
     1633@@ -1553,9 +1587,9 @@ static void *do_dlsym(struct dso *p, con 
     1634        if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES)) 
     1635                return p->base + sym->st_value; 
     1636        if (p->deps) for (i=0; p->deps[i]; i++) { 
     1637-               if (p->deps[i]->ghashtab) { 
     1638+               if ((ght = p->deps[i]->ghashtab)) { 
     1639                        if (!gh) gh = gnu_hash(s); 
     1640-                       sym = gnu_lookup(s, gh, p->deps[i]); 
     1641+                       sym = gnu_lookup(gh, ght, p->deps[i], s); 
     1642                } else { 
     1643                        if (!h) h = sysv_hash(s); 
     1644                        sym = sysv_lookup(s, h, p->deps[i]); 
     1645--- a/src/linux/syncfs.c 
     1646+++ b/src/linux/syncfs.c 
     1647@@ -2,7 +2,7 @@ 
     1648 #include <unistd.h> 
     1649 #include "syscall.h" 
     1650  
     1651-void syncfs(int fd) 
     1652+int syncfs(int fd) 
     1653 { 
     1654-       __syscall(SYS_syncfs, fd); 
     1655+       return syscall(SYS_syncfs, fd); 
     1656 } 
    10911657--- /dev/null 
    10921658+++ b/src/locale/c_locale.c 
     
    11071673+       .cat[LC_CTYPE] = &__c_dot_utf8 
    11081674+}; 
    1109 diff --git a/src/locale/iconv.c b/src/locale/iconv.c 
    1110 index e6121ae..1eeea94 100644 
    11111675--- a/src/locale/iconv.c 
    11121676+++ b/src/locale/iconv.c 
     
    11191683 #define UTF_32BE    0300 
    11201684 #define UTF_16LE    0301 
    1121 @@ -165,9 +166,12 @@ size_t iconv(iconv_t cd0, char **restrict in, size_t *restrict inb, char **restr 
     1685@@ -165,9 +166,12 @@ size_t iconv(iconv_t cd0, char **restric 
    11221686        int err; 
    11231687        unsigned char type = map[-1]; 
     
    11321696                c = *(unsigned char *)*in; 
    11331697                l = 1; 
    1134 @@ -431,6 +435,7 @@ size_t iconv(iconv_t cd0, char **restrict in, size_t *restrict inb, char **restr 
     1698@@ -431,6 +435,7 @@ size_t iconv(iconv_t cd0, char **restric 
    11351699                        break; 
    11361700                } 
     
    11471711        return x; 
    11481712 } 
    1149 diff --git a/src/locale/langinfo.c b/src/locale/langinfo.c 
    1150 index a1ada24..776b447 100644 
    11511713--- a/src/locale/langinfo.c 
    11521714+++ b/src/locale/langinfo.c 
    1153 @@ -33,7 +33,8 @@ char *__nl_langinfo_l(nl_item item, locale_t loc) 
     1715@@ -33,7 +33,8 @@ char *__nl_langinfo_l(nl_item item, loca 
    11541716        int idx = item & 65535; 
    11551717        const char *str; 
     
    11611723        switch (cat) { 
    11621724        case LC_NUMERIC: 
    1163 diff --git a/src/locale/locale_map.c b/src/locale/locale_map.c 
    1164 index 4346bb0..c3e5917 100644 
    11651725--- a/src/locale/locale_map.c 
    11661726+++ b/src/locale/locale_map.c 
     
    11801740 { 
    11811741        static int lock[2]; 
    1182 @@ -107,8 +99,8 @@ const struct __locale_map *__get_locale(int cat, const char *val) 
     1742@@ -107,8 +99,8 @@ const struct __locale_map *__get_locale( 
    11831743         * sake of being able to do message translations at the 
    11841744         * application level. */ 
     
    11911751                new->name[n] = 0; 
    11921752                new->next = loc_head; 
    1193 diff --git a/src/locale/newlocale.c b/src/locale/newlocale.c 
    1194 index 89d36b1..f50bbe9 100644 
    11951753--- a/src/locale/newlocale.c 
    11961754+++ b/src/locale/newlocale.c 
     
    12131771  
    12141772 locale_t __newlocale(int mask, const char *name, locale_t loc) 
    1215 @@ -44,9 +37,9 @@ locale_t __newlocale(int mask, const char *name, locale_t loc) 
     1773@@ -44,9 +37,9 @@ locale_t __newlocale(int mask, const cha 
    12161774        } 
    12171775  
     
    12261784        if ((loc = malloc(sizeof *loc))) *loc = tmp; 
    12271785  
    1228 diff --git a/src/locale/uselocale.c b/src/locale/uselocale.c 
    1229 index b70a0c1..0fc5ecb 100644 
    12301786--- a/src/locale/uselocale.c 
    12311787+++ b/src/locale/uselocale.c 
     
    12411797        return old == global ? LC_GLOBAL_LOCALE : old; 
    12421798 } 
    1243 diff --git a/src/malloc/calloc.c b/src/malloc/calloc.c 
    1244 index c3dfb47..436c0b0 100644 
    12451799--- a/src/malloc/calloc.c 
    12461800+++ b/src/malloc/calloc.c 
     
    12711825+       return __malloc0(n * m); 
    12721826 } 
    1273 diff --git a/src/malloc/expand_heap.c b/src/malloc/expand_heap.c 
    1274 new file mode 100644 
    1275 index 0000000..d8c0be7 
    12761827--- /dev/null 
    12771828+++ b/src/malloc/expand_heap.c 
     
    13491900+       return area; 
    13501901+} 
    1351 diff --git a/src/malloc/lite_malloc.c b/src/malloc/lite_malloc.c 
    1352 index 7643fc2..09ac575 100644 
    13531902--- a/src/malloc/lite_malloc.c 
    13541903+++ b/src/malloc/lite_malloc.c 
     
    14241973 weak_alias(__simple_malloc, malloc); 
    14251974+weak_alias(__simple_malloc, __malloc0); 
    1426 diff --git a/src/malloc/malloc.c b/src/malloc/malloc.c 
    1427 index d4de2dc..eb68d55 100644 
    14281975--- a/src/malloc/malloc.c 
    14291976+++ b/src/malloc/malloc.c 
     
    14662013- 
    14672014-       lock(mal.brk_lock); 
    1468   
     2015- 
    14692016-       if (!init) { 
    14702017-               mal.brk = __brk(0); 
     
    14762023-               init = 1; 
    14772024-       } 
    1478 +       /* The argument n already accounts for the caller's chunk 
    1479 +        * overhead needs, but if the heap can't be extended in-place, 
    1480 +        * we need room for an extra zero-sized sentinel chunk. */ 
    1481 +       n += SIZE_ALIGN; 
    1482   
     2025- 
    14832026-       if (n > SIZE_MAX - mal.brk - 2*PAGE_SIZE) goto fail; 
    14842027-       new = mal.brk + n + SIZE_ALIGN + PAGE_SIZE - 1 & -PAGE_SIZE; 
    14852028-       n = new - mal.brk; 
    1486 +       lock(heap_lock); 
    1487   
     2029- 
    14882030-       if (__brk(new) != new) { 
    14892031-               size_t min = (size_t)PAGE_SIZE << mal.mmap_step/2; 
     
    14932035-                       MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); 
    14942036-               if (area == MAP_FAILED) goto fail; 
     2037  
     2038-               mal.mmap_step++; 
     2039-               area = (char *)area + SIZE_ALIGN - OVERHEAD; 
     2040-               w = area; 
     2041+       /* The argument n already accounts for the caller's chunk 
     2042+        * overhead needs, but if the heap can't be extended in-place, 
     2043+        * we need room for an extra zero-sized sentinel chunk. */ 
     2044+       n += SIZE_ALIGN; 
     2045+ 
     2046+       lock(heap_lock); 
     2047+ 
    14952048+       p = __expand_heap(&n); 
    14962049+       if (!p) { 
     
    14982051+               return 0; 
    14992052+       } 
    1500   
    1501 -               mal.mmap_step++; 
    1502 -               area = (char *)area + SIZE_ALIGN - OVERHEAD; 
    1503 -               w = area; 
     2053+ 
    15042054+       /* If not just expanding existing space, we need to make a 
    15052055+        * new sentinel chunk below the allocated space. */ 
     
    15672117 { 
    15682118        struct chunk *self, *next; 
    1569 diff --git a/src/multibyte/btowc.c b/src/multibyte/btowc.c 
    1570 index 9d2c3b1..8acd0a2 100644 
     2119--- a/src/misc/syslog.c 
     2120+++ b/src/misc/syslog.c 
     2121@@ -48,12 +48,8 @@ void closelog(void) 
     2122  
     2123 static void __openlog() 
     2124 { 
     2125-       int fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0); 
     2126-       if (fd < 0) return; 
     2127-       if (connect(fd, (void *)&log_addr, sizeof log_addr) < 0) 
     2128-               close(fd); 
     2129-       else 
     2130-               log_fd = fd; 
     2131+       log_fd = socket(AF_UNIX, SOCK_DGRAM|SOCK_CLOEXEC, 0); 
     2132+       if (log_fd >= 0) connect(log_fd, (void *)&log_addr, sizeof log_addr); 
     2133 } 
     2134  
     2135 void openlog(const char *ident, int opt, int facility) 
     2136@@ -78,6 +74,11 @@ void openlog(const char *ident, int opt, 
     2137        pthread_setcancelstate(cs, 0); 
     2138 } 
     2139  
     2140+static int is_lost_conn(int e) 
     2141+{ 
     2142+       return e==ECONNREFUSED || e==ECONNRESET || e==ENOTCONN || e==EPIPE; 
     2143+} 
     2144+ 
     2145 static void _vsyslog(int priority, const char *message, va_list ap) 
     2146 { 
     2147        char timebuf[16]; 
     2148@@ -107,7 +108,10 @@ static void _vsyslog(int priority, const 
     2149                if (l2 >= sizeof buf - l) l = sizeof buf - 1; 
     2150                else l += l2; 
     2151                if (buf[l-1] != '\n') buf[l++] = '\n'; 
     2152-               if (send(log_fd, buf, l, 0) < 0 && (log_opt & LOG_CONS)) { 
     2153+               if (send(log_fd, buf, l, 0) < 0 && (!is_lost_conn(errno) 
     2154+                   || connect(log_fd, (void *)&log_addr, sizeof log_addr) < 0 
     2155+                   || send(log_fd, buf, l, 0) < 0) 
     2156+                   && (log_opt & LOG_CONS)) { 
     2157                        fd = open("/dev/console", O_WRONLY|O_NOCTTY|O_CLOEXEC); 
     2158                        if (fd >= 0) { 
     2159                                dprintf(fd, "%.*s", l-hlen, buf+hlen); 
    15712160--- a/src/multibyte/btowc.c 
    15722161+++ b/src/multibyte/btowc.c 
     
    15832172+       return b<128U ? b : (MB_CUR_MAX==1 && c!=EOF) ? CODEUNIT(c) : WEOF; 
    15842173 } 
    1585 diff --git a/src/multibyte/internal.h b/src/multibyte/internal.h 
    1586 index cc017fa..53d62ed 100644 
    15872174--- a/src/multibyte/internal.h 
    15882175+++ b/src/multibyte/internal.h 
     
    15982185+/* Get inline definition of MB_CUR_MAX. */ 
    15992186+#include "locale_impl.h" 
    1600 diff --git a/src/multibyte/mbrtowc.c b/src/multibyte/mbrtowc.c 
    1601 index e7b3654..ca7da70 100644 
    16022187--- a/src/multibyte/mbrtowc.c 
    16032188+++ b/src/multibyte/mbrtowc.c 
     
    16102195 #include <errno.h> 
    16112196 #include "internal.h" 
    1612 @@ -27,6 +28,7 @@ size_t mbrtowc(wchar_t *restrict wc, const char *restrict src, size_t n, mbstate 
     2197@@ -27,6 +28,7 @@ size_t mbrtowc(wchar_t *restrict wc, con 
    16132198        if (!n) return -2; 
    16142199        if (!c) { 
     
    16182203                c = bittab[*s++-SA]; n--; 
    16192204        } 
    1620 diff --git a/src/multibyte/mbsrtowcs.c b/src/multibyte/mbsrtowcs.c 
    1621 index 3c1343a..e23083d 100644 
    16222205--- a/src/multibyte/mbsrtowcs.c 
    16232206+++ b/src/multibyte/mbsrtowcs.c 
     
    16312214  
    16322215 size_t mbsrtowcs(wchar_t *restrict ws, const char **restrict src, size_t wn, mbstate_t *restrict st) 
    1633 @@ -24,6 +26,23 @@ size_t mbsrtowcs(wchar_t *restrict ws, const char **restrict src, size_t wn, mbs 
     2216@@ -24,6 +26,23 @@ size_t mbsrtowcs(wchar_t *restrict ws, c 
    16342217                } 
    16352218        } 
     
    16552238                if (*s-1u < 0x7f && (uintptr_t)s%4 == 0) { 
    16562239                        while (!(( *(uint32_t*)s | *(uint32_t*)s-0x01010101) & 0x80808080)) { 
    1657 diff --git a/src/multibyte/mbtowc.c b/src/multibyte/mbtowc.c 
    1658 index 803d221..71a9506 100644 
    16592240--- a/src/multibyte/mbtowc.c 
    16602241+++ b/src/multibyte/mbtowc.c 
     
    16672248 #include <errno.h> 
    16682249 #include "internal.h" 
    1669 @@ -19,6 +20,7 @@ int mbtowc(wchar_t *restrict wc, const char *restrict src, size_t n) 
     2250@@ -19,6 +20,7 @@ int mbtowc(wchar_t *restrict wc, const c 
    16702251        if (!wc) wc = &dummy; 
    16712252  
     
    16752256        c = bittab[*s++-SA]; 
    16762257  
    1677 diff --git a/src/multibyte/wcrtomb.c b/src/multibyte/wcrtomb.c 
    1678 index 59f733d..ddc37a5 100644 
    16792258--- a/src/multibyte/wcrtomb.c 
    16802259+++ b/src/multibyte/wcrtomb.c 
     
    16902269 size_t wcrtomb(char *restrict s, wchar_t wc, mbstate_t *restrict st) 
    16912270 { 
    1692 @@ -13,6 +15,13 @@ size_t wcrtomb(char *restrict s, wchar_t wc, mbstate_t *restrict st) 
     2271@@ -13,6 +15,13 @@ size_t wcrtomb(char *restrict s, wchar_t 
    16932272        if ((unsigned)wc < 0x80) { 
    16942273                *s = wc; 
     
    17042283                *s++ = 0xc0 | (wc>>6); 
    17052284                *s = 0x80 | (wc&0x3f); 
    1706 diff --git a/src/multibyte/wctob.c b/src/multibyte/wctob.c 
    1707 index d6353ee..4aeda6a 100644 
    17082285--- a/src/multibyte/wctob.c 
    17092286+++ b/src/multibyte/wctob.c 
     
    17202297        return EOF; 
    17212298 } 
    1722 diff --git a/src/passwd/nscd_query.c b/src/passwd/nscd_query.c 
    1723 index 69a7815..d38e371 100644 
     2299--- a/src/network/ns_parse.c 
     2300+++ b/src/network/ns_parse.c 
     2301@@ -95,7 +95,7 @@ int ns_skiprr(const unsigned char *ptr, 
     2302                        p += r; 
     2303                } 
     2304        } 
     2305-       return ptr - p; 
     2306+       return p - ptr; 
     2307 bad: 
     2308        errno = EMSGSIZE; 
     2309        return -1; 
    17242310--- a/src/passwd/nscd_query.c 
    17252311+++ b/src/passwd/nscd_query.c 
    1726 @@ -32,6 +32,7 @@ FILE *__nscd_query(int32_t req, const char *key, int32_t *buf, size_t len, int * 
     2312@@ -32,6 +32,7 @@ FILE *__nscd_query(int32_t req, const ch 
    17272313                }, 
    17282314                .msg_iovlen = 2 
     
    17512337        } 
    17522338  
    1753 diff --git a/src/process/sh/vfork.s b/src/process/sh/vfork.s 
    1754 new file mode 100644 
    1755 index 0000000..48cc939 
    17562339--- /dev/null 
    17572340+++ b/src/process/sh/vfork.s 
     
    17802363+       .hidden __syscall_ret 
    17812364+1:     .long __syscall_ret@PLT-(2b+4-.) 
    1782 diff --git a/src/regex/fnmatch.c b/src/regex/fnmatch.c 
    1783 index 7f6b65f..978fff8 100644 
    17842365--- a/src/regex/fnmatch.c 
    17852366+++ b/src/regex/fnmatch.c 
     
    17922373 #define END 0 
    17932374 #define UNMATCHABLE -2 
    1794 @@ -229,7 +230,7 @@ static int fnmatch_internal(const char *pat, size_t m, const char *str, size_t n 
     2375@@ -229,7 +230,7 @@ static int fnmatch_internal(const char * 
    17952376         * On illegal sequences we may get it wrong, but in that case 
    17962377         * we necessarily have a matching failure anyway. */ 
     
    18012382        } 
    18022383        if (tailcnt) return FNM_NOMATCH; 
    1803 diff --git a/src/signal/sh/restore.s b/src/signal/sh/restore.s 
    1804 index ab26034..eaedcdf 100644 
    18052384--- a/src/signal/sh/restore.s 
    18062385+++ b/src/signal/sh/restore.s 
     
    18232402        or    r0, r0 
    18242403        or    r0, r0 
    1825 diff --git a/src/stdio/__fdopen.c b/src/stdio/__fdopen.c 
    1826 index ef8f47d..8d6ce81 100644 
    18272404--- a/src/stdio/__fdopen.c 
    18282405+++ b/src/stdio/__fdopen.c 
     
    18422419  
    18432420 weak_alias(__fdopen, fdopen); 
    1844 diff --git a/src/stdio/__stdio_exit.c b/src/stdio/__stdio_exit.c 
    1845 index 716e5f7..191b445 100644 
    18462421--- a/src/stdio/__stdio_exit.c 
    18472422+++ b/src/stdio/__stdio_exit.c 
     
    18562431        close_file(__stdout_used); 
    18572432 } 
    1858 diff --git a/src/stdio/__stdio_read.c b/src/stdio/__stdio_read.c 
    1859 index 5947344..f8fa6d3 100644 
    18602433--- a/src/stdio/__stdio_read.c 
    18612434+++ b/src/stdio/__stdio_read.c 
     
    18732446 size_t __stdio_read(FILE *f, unsigned char *buf, size_t len) 
    18742447 { 
    1875 @@ -16,9 +9,7 @@ size_t __stdio_read(FILE *f, unsigned char *buf, size_t len) 
     2448@@ -16,9 +9,7 @@ size_t __stdio_read(FILE *f, unsigned ch 
    18762449        }; 
    18772450        ssize_t cnt; 
     
    18842457                f->flags |= F_EOF ^ ((F_ERR^F_EOF) & cnt); 
    18852458                return cnt; 
    1886 diff --git a/src/stdio/__stdio_write.c b/src/stdio/__stdio_write.c 
    1887 index 8c89389..d2d8947 100644 
    18882459--- a/src/stdio/__stdio_write.c 
    18892460+++ b/src/stdio/__stdio_write.c 
     
    19012472 size_t __stdio_write(FILE *f, const unsigned char *buf, size_t len) 
    19022473 { 
    1903 @@ -19,9 +12,7 @@ size_t __stdio_write(FILE *f, const unsigned char *buf, size_t len) 
     2474@@ -19,9 +12,7 @@ size_t __stdio_write(FILE *f, const unsi 
    19042475        int iovcnt = 2; 
    19052476        ssize_t cnt; 
     
    19122483                        f->wend = f->buf + f->buf_size; 
    19132484                        f->wpos = f->wbase = f->buf; 
    1914 @@ -34,11 +25,8 @@ size_t __stdio_write(FILE *f, const unsigned char *buf, size_t len) 
     2485@@ -34,11 +25,8 @@ size_t __stdio_write(FILE *f, const unsi 
    19152486                } 
    19162487                rem -= cnt; 
     
    19242495                iov[0].iov_base = (char *)iov[0].iov_base + cnt; 
    19252496                iov[0].iov_len -= cnt; 
    1926 diff --git a/src/stdio/fclose.c b/src/stdio/fclose.c 
    1927 index 317b3c9..839d88a 100644 
    19282497--- a/src/stdio/fclose.c 
    19292498+++ b/src/stdio/fclose.c 
     
    19432512  
    19442513        r = fflush(f); 
    1945 diff --git a/src/stdio/fflush.c b/src/stdio/fflush.c 
    1946 index 7bf862a..3f462c8 100644 
    19472514--- a/src/stdio/fflush.c 
    19482515+++ b/src/stdio/fflush.c 
     
    19632530        return r; 
    19642531 } 
    1965 diff --git a/src/stdio/fgetwc.c b/src/stdio/fgetwc.c 
    1966 index 8626d54..e455cfe 100644 
    19672532--- a/src/stdio/fgetwc.c 
    19682533+++ b/src/stdio/fgetwc.c 
     
    20042569 { 
    20052570        wint_t c; 
    2006 diff --git a/src/stdio/fmemopen.c b/src/stdio/fmemopen.c 
    2007 index d784960..7c193a5 100644 
    20082571--- a/src/stdio/fmemopen.c 
    20092572+++ b/src/stdio/fmemopen.c 
    2010 @@ -110,11 +110,5 @@ FILE *fmemopen(void *restrict buf, size_t size, const char *restrict mode) 
     2573@@ -110,11 +110,5 @@ FILE *fmemopen(void *restrict buf, size_ 
    20112574  
    20122575        if (!libc.threaded) f->lock = -1; 
     
    20212584+       return __ofl_add(f); 
    20222585 } 
    2023 diff --git a/src/stdio/fopen.c b/src/stdio/fopen.c 
    2024 index 07bdb6e..252f082 100644 
    20252586--- a/src/stdio/fopen.c 
    20262587+++ b/src/stdio/fopen.c 
    2027 @@ -18,7 +18,7 @@ FILE *fopen(const char *restrict filename, const char *restrict mode) 
     2588@@ -18,7 +18,7 @@ FILE *fopen(const char *restrict filenam 
    20282589        /* Compute the flags to pass to open() */ 
    20292590        flags = __fmodeflags(mode); 
     
    20342595        if (flags & O_CLOEXEC) 
    20352596                __syscall(SYS_fcntl, fd, F_SETFD, FD_CLOEXEC); 
    2036 diff --git a/src/stdio/fputwc.c b/src/stdio/fputwc.c 
    2037 index 7b621dd..789fe9c 100644 
    20382597--- a/src/stdio/fputwc.c 
    20392598+++ b/src/stdio/fputwc.c 
     
    20442603 #include <limits.h> 
    20452604 #include <ctype.h> 
    2046 @@ -7,8 +8,10 @@ wint_t __fputwc_unlocked(wchar_t c, FILE *f) 
     2605@@ -7,8 +8,10 @@ wint_t __fputwc_unlocked(wchar_t c, FILE 
    20472606 { 
    20482607        char mbc[MB_LEN_MAX]; 
     
    20562615        if (isascii(c)) { 
    20572616                c = putc_unlocked(c, f); 
    2058 @@ -20,6 +23,8 @@ wint_t __fputwc_unlocked(wchar_t c, FILE *f) 
     2617@@ -20,6 +23,8 @@ wint_t __fputwc_unlocked(wchar_t c, FILE 
    20592618                l = wctomb(mbc, c); 
    20602619                if (l < 0 || __fwritex((void *)mbc, l, f) < l) c = WEOF; 
     
    20652624 } 
    20662625  
    2067 diff --git a/src/stdio/fputws.c b/src/stdio/fputws.c 
    2068 index 5723cbc..0ed02f1 100644 
    20692626--- a/src/stdio/fputws.c 
    20702627+++ b/src/stdio/fputws.c 
     
    20992656 } 
    21002657  
    2101 diff --git a/src/stdio/fwide.c b/src/stdio/fwide.c 
    2102 index 8088e7a..8410b15 100644 
    21032658--- a/src/stdio/fwide.c 
    21042659+++ b/src/stdio/fwide.c 
     
    21232678        FUNLOCK(f); 
    21242679        return mode; 
    2125 diff --git a/src/stdio/ofl.c b/src/stdio/ofl.c 
    2126 new file mode 100644 
    2127 index 0000000..b143999 
    21282680--- /dev/null 
    21292681+++ b/src/stdio/ofl.c 
     
    21452697+       UNLOCK(ofl_lock); 
    21462698+} 
    2147 diff --git a/src/stdio/ofl_add.c b/src/stdio/ofl_add.c 
    2148 new file mode 100644 
    2149 index 0000000..d7de9f1 
    21502699--- /dev/null 
    21512700+++ b/src/stdio/ofl_add.c 
     
    21622711+       return f; 
    21632712+} 
    2164 diff --git a/src/stdio/open_memstream.c b/src/stdio/open_memstream.c 
    2165 index 9eafdfb..58504c9 100644 
    21662713--- a/src/stdio/open_memstream.c 
    21672714+++ b/src/stdio/open_memstream.c 
    2168 @@ -79,11 +79,5 @@ FILE *open_memstream(char **bufp, size_t *sizep) 
     2715@@ -79,11 +79,5 @@ FILE *open_memstream(char **bufp, size_t 
    21692716  
    21702717        if (!libc.threaded) f->lock = -1; 
     
    21792726+       return __ofl_add(f); 
    21802727 } 
    2181 diff --git a/src/stdio/open_wmemstream.c b/src/stdio/open_wmemstream.c 
    2182 index 3537030..7ab2c64 100644 
    21832728--- a/src/stdio/open_wmemstream.c 
    21842729+++ b/src/stdio/open_wmemstream.c 
    2185 @@ -81,11 +81,5 @@ FILE *open_wmemstream(wchar_t **bufp, size_t *sizep) 
     2730@@ -81,11 +81,5 @@ FILE *open_wmemstream(wchar_t **bufp, si 
    21862731  
    21872732        if (!libc.threaded) f->lock = -1; 
     
    21962741+       return __ofl_add(f); 
    21972742 } 
    2198 diff --git a/src/stdio/ungetwc.c b/src/stdio/ungetwc.c 
    2199 index 913f716..80d6e20 100644 
    22002743--- a/src/stdio/ungetwc.c 
    22012744+++ b/src/stdio/ungetwc.c 
     
    22422785        return c; 
    22432786 } 
    2244 diff --git a/src/stdio/vfwprintf.c b/src/stdio/vfwprintf.c 
    2245 index ebdff00..f06d5ae 100644 
    22462787--- a/src/stdio/vfwprintf.c 
    22472788+++ b/src/stdio/vfwprintf.c 
    2248 @@ -293,7 +293,10 @@ static int wprintf_core(FILE *f, const wchar_t *fmt, va_list *ap, union arg *nl_ 
     2789@@ -293,7 +293,10 @@ static int wprintf_core(FILE *f, const w 
    22492790                        if ((fl&LEFT_ADJ)) fprintf(f, "%.*s", w-p, ""); 
    22502791                        l=w; 
     
    22572798                        if (p<0) p = INT_MAX; 
    22582799                        for (i=l=0; l<p && (i=mbtowc(&wc, bs, MB_LEN_MAX))>0; bs+=i, l++); 
    2259 @@ -356,7 +359,7 @@ int vfwprintf(FILE *restrict f, const wchar_t *restrict fmt, va_list ap) 
     2800@@ -356,7 +359,7 @@ int vfwprintf(FILE *restrict f, const wc 
    22602801        } 
    22612802  
     
    22662807        f->flags &= ~F_ERR; 
    22672808        ret = wprintf_core(f, fmt, &ap2, nl_arg, nl_type); 
    2268 diff --git a/src/stdio/vfwscanf.c b/src/stdio/vfwscanf.c 
    2269 index ac5c2c2..223aad4 100644 
    22702809--- a/src/stdio/vfwscanf.c 
    22712810+++ b/src/stdio/vfwscanf.c 
    2272 @@ -104,7 +104,7 @@ int vfwscanf(FILE *restrict f, const wchar_t *restrict fmt, va_list ap) 
     2811@@ -104,7 +104,7 @@ int vfwscanf(FILE *restrict f, const wch 
    22732812  
    22742813        FLOCK(f); 
     
    22792818        for (p=fmt; *p; p++) { 
    22802819  
    2281 diff --git a/src/string/strverscmp.c b/src/string/strverscmp.c 
    2282 index 6f37cc6..4daf276 100644 
    22832820--- a/src/string/strverscmp.c 
    22842821+++ b/src/string/strverscmp.c 
     
    23492886+       return l[i] - r[i]; 
    23502887 } 
    2351 diff --git a/src/thread/__tls_get_addr.c b/src/thread/__tls_get_addr.c 
    2352 index 3633396..84a413d 100644 
    23532888--- a/src/thread/__tls_get_addr.c 
    23542889+++ b/src/thread/__tls_get_addr.c 
     
    23652900 #endif 
    23662901 } 
    2367 diff --git a/src/thread/__unmapself.c b/src/thread/__unmapself.c 
    2368 index e69de29..1d3bee1 100644 
    2369 --- a/src/thread/__unmapself.c 
     2902--- /dev/null 
    23702903+++ b/src/thread/__unmapself.c 
    23712904@@ -0,0 +1,29 @@ 
     
    23992932+       CRTJMP(do_unmap, stack); 
    24002933+} 
    2401 diff --git a/src/thread/mips/__unmapself.s b/src/thread/mips/__unmapself.s 
    2402 index 9aa0371..ba139dc 100644 
    24032934--- a/src/thread/mips/__unmapself.s 
    24042935+++ b/src/thread/mips/__unmapself.s 
     
    24112942        syscall 
    24122943        li $4, 0 
    2413 diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c 
    2414 index de72818..e7df34a 100644 
    24152944--- a/src/thread/pthread_create.c 
    24162945+++ b/src/thread/pthread_create.c 
    2417 @@ -191,8 +191,9 @@ int __pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict att 
     2946@@ -191,8 +191,9 @@ int __pthread_create(pthread_t *restrict 
    24182947        if (!libc.can_do_threads) return ENOSYS; 
    24192948        self = __pthread_self(); 
     
    24262955                init_file_lock(__stdout_used); 
    24272956                init_file_lock(__stderr_used); 
    2428 @@ -231,7 +232,8 @@ int __pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict att 
     2957@@ -231,7 +232,8 @@ int __pthread_create(pthread_t *restrict 
    24292958                if (guard) { 
    24302959                        map = __mmap(0, size, PROT_NONE, MAP_PRIVATE|MAP_ANON, -1, 0); 
     
    24362965                                goto fail; 
    24372966                        } 
    2438 diff --git a/src/thread/sh/__set_thread_area.s b/src/thread/sh/__set_thread_area.s 
    2439 index d9f1181..e69de29 100644 
    24402967--- a/src/thread/sh/__set_thread_area.s 
    24412968+++ b/src/thread/sh/__set_thread_area.s 
     
    24472974-       rts 
    24482975-        mov #0, r0 
    2449 diff --git a/src/thread/sh/__unmapself.s b/src/thread/sh/__unmapself.s 
    2450 index b34c3c8..0161d53 100644 
    24512976--- a/src/thread/sh/__unmapself.s 
    24522977+++ b/src/thread/sh/__unmapself.s 
     
    24742999        or    r0, r0 
    24753000        or    r0, r0 
    2476 diff --git a/src/thread/sh/clone.s b/src/thread/sh/clone.s 
    2477 index d6c9184..f8ad845 100644 
    24783001--- a/src/thread/sh/clone.s 
    24793002+++ b/src/thread/sh/clone.s 
     
    24963019        or   r0, r0 
    24973020        or   r0, r0 
    2498 diff --git a/src/thread/sh/syscall_cp.s b/src/thread/sh/syscall_cp.s 
    2499 index 6b28ddf..c3cafac 100644 
    25003021--- a/src/thread/sh/syscall_cp.s 
    25013022+++ b/src/thread/sh/syscall_cp.s 
     
    25093030 __cp_end: 
    25103031        ! work around hardware bug 
    2511 diff --git a/src/unistd/sh/pipe.s b/src/unistd/sh/pipe.s 
    2512 index d865ae3..46c4908 100644 
     3032--- a/src/time/__tz.c 
     3033+++ b/src/time/__tz.c 
     3034@@ -125,7 +125,8 @@ static void do_tzset() 
     3035                "/usr/share/zoneinfo/\0/share/zoneinfo/\0/etc/zoneinfo/\0"; 
     3036  
     3037        s = getenv("TZ"); 
     3038-       if (!s || !*s) s = "/etc/localtime"; 
     3039+       if (!s) s = "/etc/localtime"; 
     3040+       if (!*s) s = __gmt; 
     3041  
     3042        if (old_tz && !strcmp(s, old_tz)) return; 
     3043  
    25133044--- a/src/unistd/sh/pipe.s 
    25143045+++ b/src/unistd/sh/pipe.s 
     
    25223053        ! work around hardware bug 
    25233054        or     r0, r0 
     3055--- /dev/null 
     3056+++ b/tools/ld.musl-clang.in 
     3057@@ -0,0 +1,51 @@ 
     3058+#!/bin/sh 
     3059+cc="@CC@" 
     3060+libc_lib="@LIBDIR@" 
     3061+ldso="@LDSO@" 
     3062+cleared= 
     3063+shared= 
     3064+userlinkdir= 
     3065+userlink= 
     3066+ 
     3067+for x ; do 
     3068+    test "$cleared" || set -- ; cleared=1 
     3069+ 
     3070+    case "$x" in 
     3071+        -L-user-start) 
     3072+            userlinkdir=1 
     3073+            ;; 
     3074+        -L-user-end) 
     3075+            userlinkdir= 
     3076+            ;; 
     3077+        -L*) 
     3078+            test "$userlinkdir" && set -- "$@" "$x" 
     3079+            ;; 
     3080+        -l-user-start) 
     3081+            userlink=1 
     3082+            ;; 
     3083+        -l-user-end) 
     3084+            userlink= 
     3085+            ;; 
     3086+        crtbegin*.o|crtend*.o) 
     3087+            set -- "$@" $($cc -print-file-name=$x) 
     3088+            ;; 
     3089+        -lgcc|-lgcc_eh) 
     3090+            file=lib${x#-l}.a 
     3091+            set -- "$@" $($cc -print-file-name=$file) 
     3092+            ;; 
     3093+        -l*) 
     3094+            test "$userlink" && set -- "$@" "$x" 
     3095+            ;; 
     3096+        -shared) 
     3097+            shared=1 
     3098+            set -- "$@" -shared 
     3099+            ;; 
     3100+        -sysroot=*|--sysroot=*) 
     3101+            ;; 
     3102+        *) 
     3103+            set -- "$@" "$x" 
     3104+            ;; 
     3105+    esac 
     3106+done 
     3107+ 
     3108+exec $($cc -print-prog-name=ld) -nostdlib "$@" -lc -dynamic-linker "$ldso" 
     3109--- /dev/null 
     3110+++ b/tools/musl-clang.in 
     3111@@ -0,0 +1,35 @@ 
     3112+#!/bin/sh 
     3113+cc="@CC@" 
     3114+libc="@PREFIX@" 
     3115+libc_inc="@INCDIR@" 
     3116+libc_lib="@LIBDIR@" 
     3117+thisdir="`cd "$(dirname "$0")"; pwd`" 
     3118+ 
     3119+# prevent clang from running the linker (and erroring) on no input. 
     3120+sflags= 
     3121+eflags= 
     3122+for x ; do 
     3123+    case "$x" in 
     3124+        -l*) input=1 ;; 
     3125+        *) input= ;; 
     3126+    esac 
     3127+    if test "$input" ; then 
     3128+        sflags="-l-user-start" 
     3129+        eflags="-l-user-end" 
     3130+        break 
     3131+    fi 
     3132+done 
     3133+ 
     3134+exec $cc \ 
     3135+    -B"$thisdir" \ 
     3136+    -fuse-ld=musl-clang \ 
     3137+    -static-libgcc \ 
     3138+    -nostdinc \ 
     3139+    --sysroot "$libc" \ 
     3140+    -isystem "$libc_inc" \ 
     3141+    -L-user-start \ 
     3142+    $sflags \ 
     3143+    "$@" \ 
     3144+    $eflags \ 
     3145+    -L"$libc_lib" \ 
     3146+    -L-user-end 
  • trunk/toolchain/musl/patches/010-Add-PowerPC-soft-float-support.patch

    r46313 r46481  
    3434--- a/configure 
    3535+++ b/configure 
    36 @@ -498,6 +498,10 @@ trycppif "_MIPSEL || __MIPSEL || __MIPSE 
     36@@ -522,6 +522,10 @@ trycppif "_MIPSEL || __MIPSEL || __MIPSE 
    3737 trycppif __mips_soft_float "$t" && SUBARCH=${SUBARCH}-sf 
    3838 fi 
  • trunk/toolchain/musl/patches/110-read_timezone_from_fs.patch

    r46069 r46481  
    2424+       } 
    2525+ 
    26         if (!s || !*s) s = "/etc/localtime"; 
     26        if (!s) s = "/etc/localtime"; 
     27        if (!*s) s = __gmt; 
    2728  
    28         if (old_tz && !strcmp(s, old_tz)) return; 
  • trunk/toolchain/musl/patches/200-add_libssp_nonshared.patch

    r46266 r46481  
    1111 create mode 100644 libssp_nonshared/__stack_chk_fail_local.c 
    1212 
    13 diff --git a/Makefile b/Makefile 
    14 index 2eb7b30..bfcabf7 100644 
    1513--- a/Makefile 
    1614+++ b/Makefile 
    17 @@ -48,7 +48,7 @@ CRT_LIBS = lib/crt1.o lib/Scrt1.o lib/rcrt1.o lib/crti.o lib/crtn.o 
     15@@ -48,7 +48,7 @@ CRT_LIBS = lib/crt1.o lib/Scrt1.o lib/rc 
    1816 STATIC_LIBS = lib/libc.a 
    1917 SHARED_LIBS = lib/libc.so 
     
    2321 ALL_TOOLS = tools/musl-gcc 
    2422  
    25  LDSO_PATHNAME = $(syslibdir)/ld-musl-$(ARCH)$(SUBARCH).so.1 
    26 @@ -103,7 +103,8 @@ NOSSP_SRCS = $(wildcard crt/*.c) \ 
     23 WRAPCC_GCC = gcc 
     24@@ -106,7 +106,8 @@ NOSSP_SRCS = $(wildcard crt/*.c) \ 
    2725        src/env/__libc_start_main.c src/env/__init_tls.c \ 
    2826        src/thread/__set_thread_area.c src/env/__stack_chk_fail.c \ 
     
    3432  
    3533 $(CRT_LIBS:lib/%=crt/%): CFLAGS += -DCRT 
    36 @@ -144,6 +145,11 @@ lib/libc.a: $(OBJS) 
     34@@ -147,6 +148,11 @@ lib/libc.a: $(OBJS) 
    3735        $(AR) rc $@ $(OBJS) 
    3836        $(RANLIB) $@ 
     
    4644        rm -f $@ 
    4745        $(AR) rc $@ 
    48 diff --git a/libssp_nonshared/__stack_chk_fail_local.c b/libssp_nonshared/__stack_chk_fail_local.c 
    49 new file mode 100644 
    50 index 0000000..2b403a6 
    5146--- /dev/null 
    5247+++ b/libssp_nonshared/__stack_chk_fail_local.c 
     
    5449+#include "atomic.h" 
    5550+void __attribute__((visibility ("hidden"))) __stack_chk_fail_local(void) { a_crash(); } 
    56 --  
    57 2.1.4 
    58  
  • trunk/toolchain/musl/patches/300-relative.patch

    r46123 r46481  
    11--- a/Makefile 
    22+++ b/Makefile 
    3 @@ -180,7 +180,7 @@ $(DESTDIR)$(includedir)/%: include/% 
     3@@ -187,7 +187,7 @@ $(DESTDIR)$(includedir)/%: include/% 
    44        $(INSTALL) -D -m 644 $< $@ 
    55  
Note: See TracChangeset for help on using the changeset viewer.