Initial commit
This commit is contained in:
@@ -0,0 +1,59 @@
|
||||
From 4e0877a604bad684be020f68e96a05156131fd44 Mon Sep 17 00:00:00 2001
|
||||
From: Matthias Schiffer <mschiffer@universe-factory.net>
|
||||
Date: Sun, 24 Jun 2018 17:05:31 +0200
|
||||
Subject: [PATCH] sys/socket.h: fix SO_PEERSEC value on MIPS
|
||||
|
||||
Differing from all other archs supported by musl, MIPS defines SO_PEERSEC
|
||||
to 30 instead of 31.
|
||||
|
||||
Reported-by: Andrey Jr. Mlenikov <temnota.am@gmail.com>
|
||||
---
|
||||
arch/mips/bits/socket.h | 2 ++
|
||||
arch/mips64/bits/socket.h | 2 ++
|
||||
arch/mipsn32/bits/socket.h | 2 ++
|
||||
include/sys/socket.h | 3 +++
|
||||
4 files changed, 9 insertions(+)
|
||||
|
||||
--- a/arch/mips/bits/socket.h
|
||||
+++ b/arch/mips/bits/socket.h
|
||||
@@ -48,5 +48,7 @@ struct cmsghdr {
|
||||
#define SO_SNDBUFFORCE 31
|
||||
#define SO_RCVBUFFORCE 33
|
||||
|
||||
+#define SO_PEERSEC 30
|
||||
+
|
||||
#define SOCK_NONBLOCK 0200
|
||||
#define SOCK_CLOEXEC 02000000
|
||||
--- a/arch/mips64/bits/socket.h
|
||||
+++ b/arch/mips64/bits/socket.h
|
||||
@@ -64,5 +64,7 @@ struct cmsghdr {
|
||||
#define SO_SNDBUFFORCE 31
|
||||
#define SO_RCVBUFFORCE 33
|
||||
|
||||
+#define SO_PEERSEC 30
|
||||
+
|
||||
#define SOCK_NONBLOCK 0200
|
||||
#define SOCK_CLOEXEC 02000000
|
||||
--- a/arch/mipsn32/bits/socket.h
|
||||
+++ b/arch/mipsn32/bits/socket.h
|
||||
@@ -48,5 +48,7 @@ struct cmsghdr {
|
||||
#define SO_SNDBUFFORCE 31
|
||||
#define SO_RCVBUFFORCE 33
|
||||
|
||||
+#define SO_PEERSEC 30
|
||||
+
|
||||
#define SOCK_NONBLOCK 0200
|
||||
#define SOCK_CLOEXEC 02000000
|
||||
--- a/include/sys/socket.h
|
||||
+++ b/include/sys/socket.h
|
||||
@@ -201,7 +201,10 @@ struct linger {
|
||||
#define SO_TIMESTAMP 29
|
||||
#define SCM_TIMESTAMP SO_TIMESTAMP
|
||||
|
||||
+#ifndef SO_PEERSEC
|
||||
#define SO_PEERSEC 31
|
||||
+#endif
|
||||
+
|
||||
#define SO_PASSSEC 34
|
||||
#define SO_TIMESTAMPNS 35
|
||||
#define SCM_TIMESTAMPNS SO_TIMESTAMPNS
|
||||
@@ -0,0 +1,139 @@
|
||||
>From a57cd35acf26ba6202ed6534a57f496464f431a1 Mon Sep 17 00:00:00 2001
|
||||
From: Szabolcs Nagy <nsz@port70.net>
|
||||
Date: Sat, 10 Aug 2019 23:14:40 +0000
|
||||
Subject: [PATCH] make relocation time symbol lookup and dlsym consistent
|
||||
|
||||
Using common code path for all symbol lookups fixes three dlsym issues:
|
||||
|
||||
- st_shndx of STT_TLS symbols were not checked and thus an undefined
|
||||
tls symbol reference could be incorrectly treated as a definition
|
||||
(the sysv hash lookup returns undefined symbols, gnu does not, so should
|
||||
be rare in practice).
|
||||
|
||||
- symbol binding was not checked so a hidden symbol may be returned
|
||||
(in principle STB_LOCAL symbols may appear in the dynamic symbol table
|
||||
for hidden symbols, but linkers most likely don't produce it).
|
||||
|
||||
- mips specific behaviour was not applied (ARCH_SYM_REJECT_UND) so
|
||||
undefined symbols may be returned on mips.
|
||||
|
||||
always_inline is used to avoid relocation performance regression, the
|
||||
code generation for find_sym should not be affected.
|
||||
|
||||
BAckported to 1.1.19
|
||||
|
||||
---
|
||||
ldso/dynlink.c | 84 +++++++++++++++++++-------------------------------
|
||||
1 file changed, 31 insertions(+), 53 deletions(-)
|
||||
|
||||
--- a/ldso/dynlink.c
|
||||
+++ b/ldso/dynlink.c
|
||||
@@ -257,12 +257,16 @@ static Sym *gnu_lookup_filtered(uint32_t
|
||||
#define ARCH_SYM_REJECT_UND(s) 0
|
||||
#endif
|
||||
|
||||
-static struct symdef find_sym(struct dso *dso, const char *s, int need_def)
|
||||
+#if defined(__GNUC__)
|
||||
+__attribute__((always_inline))
|
||||
+#endif
|
||||
+static inline struct symdef find_sym2(struct dso *dso, const char *s, int need_def, int use_deps)
|
||||
{
|
||||
uint32_t h = 0, gh = gnu_hash(s), gho = gh / (8*sizeof(size_t)), *ght;
|
||||
size_t ghm = 1ul << gh % (8*sizeof(size_t));
|
||||
struct symdef def = {0};
|
||||
- for (; dso; dso=dso->syms_next) {
|
||||
+ struct dso **deps = use_deps ? dso->deps : 0;
|
||||
+ for (; dso; dso=use_deps ? *deps++ : dso->syms_next) {
|
||||
Sym *sym;
|
||||
if ((ght = dso->ghashtab)) {
|
||||
sym = gnu_lookup_filtered(gh, ght, dso, s, gho, ghm);
|
||||
@@ -290,6 +294,11 @@ static struct symdef find_sym(struct dso
|
||||
__attribute__((__visibility__("hidden")))
|
||||
ptrdiff_t __tlsdesc_static(), __tlsdesc_dynamic();
|
||||
|
||||
+static struct symdef find_sym(struct dso *dso, const char *s, int need_def)
|
||||
+{
|
||||
+ return find_sym2(dso, s, need_def, 0);
|
||||
+}
|
||||
+
|
||||
static void do_relocs(struct dso *dso, size_t *rel, size_t rel_size, size_t stride)
|
||||
{
|
||||
unsigned char *base = dso->base;
|
||||
@@ -1872,58 +1881,27 @@ void *__tls_get_addr(tls_mod_off_t *);
|
||||
|
||||
static void *do_dlsym(struct dso *p, const char *s, void *ra)
|
||||
{
|
||||
- size_t i;
|
||||
- uint32_t h = 0, gh = 0, *ght;
|
||||
- Sym *sym;
|
||||
- if (p == head || p == RTLD_DEFAULT || p == RTLD_NEXT) {
|
||||
- if (p == RTLD_DEFAULT) {
|
||||
- p = head;
|
||||
- } else if (p == RTLD_NEXT) {
|
||||
- p = addr2dso((size_t)ra);
|
||||
- if (!p) p=head;
|
||||
- p = p->next;
|
||||
- }
|
||||
- struct symdef def = find_sym(p, s, 0);
|
||||
- if (!def.sym) goto failed;
|
||||
- if ((def.sym->st_info&0xf) == STT_TLS)
|
||||
- return __tls_get_addr((tls_mod_off_t []){def.dso->tls_id, def.sym->st_value});
|
||||
- if (DL_FDPIC && (def.sym->st_info&0xf) == STT_FUNC)
|
||||
- return def.dso->funcdescs + (def.sym - def.dso->syms);
|
||||
- return laddr(def.dso, def.sym->st_value);
|
||||
- }
|
||||
- if (__dl_invalid_handle(p))
|
||||
+ int use_deps = 0;
|
||||
+ if (p == head || p == RTLD_DEFAULT) {
|
||||
+ p = head;
|
||||
+ } else if (p == RTLD_NEXT) {
|
||||
+ p = addr2dso((size_t)ra);
|
||||
+ if (!p) p=head;
|
||||
+ p = p->next;
|
||||
+ } else if (__dl_invalid_handle(p)) {
|
||||
+ return 0;
|
||||
+ } else
|
||||
+ use_deps = 1;
|
||||
+ struct symdef def = find_sym2(p, s, 0, use_deps);
|
||||
+ if (!def.sym) {
|
||||
+ error("Symbol not found: %s", s);
|
||||
return 0;
|
||||
- if ((ght = p->ghashtab)) {
|
||||
- gh = gnu_hash(s);
|
||||
- sym = gnu_lookup(gh, ght, p, s);
|
||||
- } else {
|
||||
- h = sysv_hash(s);
|
||||
- sym = sysv_lookup(s, h, p);
|
||||
}
|
||||
- if (sym && (sym->st_info&0xf) == STT_TLS)
|
||||
- return __tls_get_addr((tls_mod_off_t []){p->tls_id, sym->st_value});
|
||||
- if (DL_FDPIC && sym && sym->st_shndx && (sym->st_info&0xf) == STT_FUNC)
|
||||
- return p->funcdescs + (sym - p->syms);
|
||||
- if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES))
|
||||
- return laddr(p, sym->st_value);
|
||||
- for (i=0; p->deps[i]; i++) {
|
||||
- if ((ght = p->deps[i]->ghashtab)) {
|
||||
- if (!gh) gh = gnu_hash(s);
|
||||
- sym = gnu_lookup(gh, ght, p->deps[i], s);
|
||||
- } else {
|
||||
- if (!h) h = sysv_hash(s);
|
||||
- sym = sysv_lookup(s, h, p->deps[i]);
|
||||
- }
|
||||
- if (sym && (sym->st_info&0xf) == STT_TLS)
|
||||
- return __tls_get_addr((tls_mod_off_t []){p->deps[i]->tls_id, sym->st_value});
|
||||
- if (DL_FDPIC && sym && sym->st_shndx && (sym->st_info&0xf) == STT_FUNC)
|
||||
- return p->deps[i]->funcdescs + (sym - p->deps[i]->syms);
|
||||
- if (sym && sym->st_value && (1<<(sym->st_info&0xf) & OK_TYPES))
|
||||
- return laddr(p->deps[i], sym->st_value);
|
||||
- }
|
||||
-failed:
|
||||
- error("Symbol not found: %s", s);
|
||||
- return 0;
|
||||
+ if ((def.sym->st_info&0xf) == STT_TLS)
|
||||
+ return __tls_get_addr((tls_mod_off_t []){def.dso->tls_id, def.sym->st_value-DTP_OFFSET});
|
||||
+ if (DL_FDPIC && (def.sym->st_info&0xf) == STT_FUNC)
|
||||
+ return def.dso->funcdescs + (def.sym - def.dso->syms);
|
||||
+ return laddr(def.dso, def.sym->st_value);
|
||||
}
|
||||
|
||||
int dladdr(const void *addr, Dl_info *info)
|
||||
@@ -0,0 +1,179 @@
|
||||
From f3ed8bfe8a82af1870ddc8696ed4cc1d5aa6b441 Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Mon, 5 Aug 2019 18:41:47 -0400
|
||||
Subject: fix x87 stack imbalance in corner cases of i386 math asm
|
||||
|
||||
commit 31c5fb80b9eae86f801be4f46025bc6532a554c5 introduced underflow
|
||||
code paths for the i386 math asm, along with checks on the fpu status
|
||||
word to skip the underflow-generation instructions if the underflow
|
||||
flag was already raised. unfortunately, at least one such path, in
|
||||
log1p, returned with 2 items on the x87 stack rather than just 1 item
|
||||
for the return value. this is a violation of the ABI's calling
|
||||
convention, and could cause subsequent floating point code to produce
|
||||
NANs due to x87 stack overflow. if floating point results are used in
|
||||
flow control, this can lead to runaway wrong code execution.
|
||||
|
||||
rather than reviewing each "underflow already raised" code path for
|
||||
correctness, remove them all. they're likely slower than just
|
||||
performing the underflow code unconditionally, and significantly more
|
||||
complex.
|
||||
|
||||
all of this code should be ripped out and replaced by C source files
|
||||
with inline asm. doing so would preclude this kind of error by having
|
||||
the compiler perform all x87 stack register allocation and stack
|
||||
manipulation, and would produce comparable or better code. however
|
||||
such a change is a much larger project.
|
||||
---
|
||||
src/math/i386/asin.s | 10 ++--------
|
||||
src/math/i386/atan.s | 7 ++-----
|
||||
src/math/i386/atan2.s | 5 +----
|
||||
src/math/i386/atan2f.s | 5 +----
|
||||
src/math/i386/atanf.s | 7 ++-----
|
||||
src/math/i386/exp.s | 10 ++--------
|
||||
src/math/i386/log1p.s | 7 ++-----
|
||||
src/math/i386/log1pf.s | 7 ++-----
|
||||
8 files changed, 14 insertions(+), 44 deletions(-)
|
||||
|
||||
--- a/src/math/i386/asin.s
|
||||
+++ b/src/math/i386/asin.s
|
||||
@@ -7,13 +7,10 @@ asinf:
|
||||
cmp $0x01000000,%eax
|
||||
jae 1f
|
||||
# subnormal x, return x with underflow
|
||||
- fnstsw %ax
|
||||
- and $16,%ax
|
||||
- jnz 2f
|
||||
fld %st(0)
|
||||
fmul %st(1)
|
||||
fstps 4(%esp)
|
||||
-2: ret
|
||||
+ ret
|
||||
|
||||
.global asinl
|
||||
.type asinl,@function
|
||||
@@ -30,11 +27,8 @@ asin:
|
||||
cmp $0x00200000,%eax
|
||||
jae 1f
|
||||
# subnormal x, return x with underflow
|
||||
- fnstsw %ax
|
||||
- and $16,%ax
|
||||
- jnz 2f
|
||||
fsts 4(%esp)
|
||||
-2: ret
|
||||
+ ret
|
||||
1: fld %st(0)
|
||||
fld1
|
||||
fsub %st(0),%st(1)
|
||||
--- a/src/math/i386/atan.s
|
||||
+++ b/src/math/i386/atan.s
|
||||
@@ -10,8 +10,5 @@ atan:
|
||||
fpatan
|
||||
ret
|
||||
# subnormal x, return x with underflow
|
||||
-1: fnstsw %ax
|
||||
- and $16,%ax
|
||||
- jnz 2f
|
||||
- fsts 4(%esp)
|
||||
-2: ret
|
||||
+1: fsts 4(%esp)
|
||||
+ ret
|
||||
--- a/src/math/i386/atan2.s
|
||||
+++ b/src/math/i386/atan2.s
|
||||
@@ -10,8 +10,5 @@ atan2:
|
||||
cmp $0x00200000,%eax
|
||||
jae 1f
|
||||
# subnormal x, return x with underflow
|
||||
- fnstsw %ax
|
||||
- and $16,%ax
|
||||
- jnz 1f
|
||||
fsts 4(%esp)
|
||||
-1: ret
|
||||
+ ret
|
||||
--- a/src/math/i386/atan2f.s
|
||||
+++ b/src/math/i386/atan2f.s
|
||||
@@ -10,10 +10,7 @@ atan2f:
|
||||
cmp $0x01000000,%eax
|
||||
jae 1f
|
||||
# subnormal x, return x with underflow
|
||||
- fnstsw %ax
|
||||
- and $16,%ax
|
||||
- jnz 1f
|
||||
fld %st(0)
|
||||
fmul %st(1)
|
||||
fstps 4(%esp)
|
||||
-1: ret
|
||||
+ ret
|
||||
--- a/src/math/i386/atanf.s
|
||||
+++ b/src/math/i386/atanf.s
|
||||
@@ -10,10 +10,7 @@ atanf:
|
||||
fpatan
|
||||
ret
|
||||
# subnormal x, return x with underflow
|
||||
-1: fnstsw %ax
|
||||
- and $16,%ax
|
||||
- jnz 2f
|
||||
- fld %st(0)
|
||||
+1: fld %st(0)
|
||||
fmul %st(1)
|
||||
fstps 4(%esp)
|
||||
-2: ret
|
||||
+ ret
|
||||
--- a/src/math/i386/exp.s
|
||||
+++ b/src/math/i386/exp.s
|
||||
@@ -7,13 +7,10 @@ expm1f:
|
||||
cmp $0x01000000,%eax
|
||||
jae 1f
|
||||
# subnormal x, return x with underflow
|
||||
- fnstsw %ax
|
||||
- and $16,%ax
|
||||
- jnz 2f
|
||||
fld %st(0)
|
||||
fmul %st(1)
|
||||
fstps 4(%esp)
|
||||
-2: ret
|
||||
+ ret
|
||||
|
||||
.global expm1l
|
||||
.type expm1l,@function
|
||||
@@ -30,11 +27,8 @@ expm1:
|
||||
cmp $0x00200000,%eax
|
||||
jae 1f
|
||||
# subnormal x, return x with underflow
|
||||
- fnstsw %ax
|
||||
- and $16,%ax
|
||||
- jnz 2f
|
||||
fsts 4(%esp)
|
||||
-2: ret
|
||||
+ ret
|
||||
1: fldl2e
|
||||
fmulp
|
||||
mov $0xc2820000,%eax
|
||||
--- a/src/math/i386/log1p.s
|
||||
+++ b/src/math/i386/log1p.s
|
||||
@@ -16,9 +16,6 @@ log1p:
|
||||
fyl2x
|
||||
ret
|
||||
# subnormal x, return x with underflow
|
||||
-2: fnstsw %ax
|
||||
- and $16,%ax
|
||||
- jnz 1f
|
||||
- fsts 4(%esp)
|
||||
+2: fsts 4(%esp)
|
||||
fstp %st(1)
|
||||
-1: ret
|
||||
+ ret
|
||||
--- a/src/math/i386/log1pf.s
|
||||
+++ b/src/math/i386/log1pf.s
|
||||
@@ -16,10 +16,7 @@ log1pf:
|
||||
fyl2x
|
||||
ret
|
||||
# subnormal x, return x with underflow
|
||||
-2: fnstsw %ax
|
||||
- and $16,%ax
|
||||
- jnz 1f
|
||||
- fxch
|
||||
+2: fxch
|
||||
fmul %st(1)
|
||||
fstps 4(%esp)
|
||||
-1: ret
|
||||
+ ret
|
||||
@@ -0,0 +1,28 @@
|
||||
From 6818c31c9bc4bbad5357f1de14bedf781e5b349e Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Mon, 5 Aug 2019 19:57:07 -0400
|
||||
Subject: fix build regression in i386 asm for atan2, atan2f
|
||||
|
||||
commit f3ed8bfe8a82af1870ddc8696ed4cc1d5aa6b441 inadvertently removed
|
||||
labels that were still needed.
|
||||
---
|
||||
src/math/i386/atan2.s | 2 +-
|
||||
src/math/i386/atan2f.s | 2 +-
|
||||
2 files changed, 2 insertions(+), 2 deletions(-)
|
||||
|
||||
--- a/src/math/i386/atan2.s
|
||||
+++ b/src/math/i386/atan2.s
|
||||
@@ -11,4 +11,4 @@ atan2:
|
||||
jae 1f
|
||||
# subnormal x, return x with underflow
|
||||
fsts 4(%esp)
|
||||
- ret
|
||||
+1: ret
|
||||
--- a/src/math/i386/atan2f.s
|
||||
+++ b/src/math/i386/atan2f.s
|
||||
@@ -13,4 +13,4 @@ atan2f:
|
||||
fld %st(0)
|
||||
fmul %st(1)
|
||||
fstps 4(%esp)
|
||||
- ret
|
||||
+1: ret
|
||||
11
toolchain/musl/patches/100-add_glob_onlydir.patch
Normal file
11
toolchain/musl/patches/100-add_glob_onlydir.patch
Normal file
@@ -0,0 +1,11 @@
|
||||
--- a/include/glob.h
|
||||
+++ b/include/glob.h
|
||||
@@ -31,6 +31,8 @@ void globfree(glob_t *);
|
||||
#define GLOB_NOESCAPE 0x40
|
||||
#define GLOB_PERIOD 0x80
|
||||
|
||||
+#define GLOB_ONLYDIR 0x100
|
||||
+
|
||||
#define GLOB_NOSPACE 1
|
||||
#define GLOB_ABORTED 2
|
||||
#define GLOB_NOMATCH 3
|
||||
28
toolchain/musl/patches/110-read_timezone_from_fs.patch
Normal file
28
toolchain/musl/patches/110-read_timezone_from_fs.patch
Normal file
@@ -0,0 +1,28 @@
|
||||
--- a/src/time/__tz.c
|
||||
+++ b/src/time/__tz.c
|
||||
@@ -23,6 +23,9 @@ static int r0[5], r1[5];
|
||||
static const unsigned char *zi, *trans, *index, *types, *abbrevs, *abbrevs_end;
|
||||
static size_t map_size;
|
||||
|
||||
+static const char *tzfile;
|
||||
+static size_t tzfile_size;
|
||||
+
|
||||
static char old_tz_buf[32];
|
||||
static char *old_tz = old_tz_buf;
|
||||
static size_t old_tz_size = sizeof old_tz_buf;
|
||||
@@ -125,6 +128,15 @@ static void do_tzset()
|
||||
"/usr/share/zoneinfo/\0/share/zoneinfo/\0/etc/zoneinfo/\0";
|
||||
|
||||
s = getenv("TZ");
|
||||
+
|
||||
+ /* if TZ is empty try to read it from /etc/TZ */
|
||||
+ if (!s || !*s) {
|
||||
+ if (tzfile)
|
||||
+ __munmap((void*)tzfile, tzfile_size);
|
||||
+
|
||||
+ s = tzfile = (void *)__map_file("/etc/TZ", &tzfile_size);
|
||||
+ }
|
||||
+
|
||||
if (!s) s = "/etc/localtime";
|
||||
if (!*s) s = __utc;
|
||||
|
||||
50
toolchain/musl/patches/200-add_libssp_nonshared.patch
Normal file
50
toolchain/musl/patches/200-add_libssp_nonshared.patch
Normal file
@@ -0,0 +1,50 @@
|
||||
From 7ec87fbbc3cac99b4173d082dd6195f47c9a32e7 Mon Sep 17 00:00:00 2001
|
||||
From: Steven Barth <steven@midlink.org>
|
||||
Date: Mon, 22 Jun 2015 11:01:56 +0200
|
||||
Subject: [PATCH] Add libssp_nonshared.a so GCC's is not needed
|
||||
|
||||
Signed-off-by: Steven Barth <steven@midlink.org>
|
||||
---
|
||||
Makefile | 10 ++++++++--
|
||||
libssp_nonshared/__stack_chk_fail_local.c | 2 ++
|
||||
2 files changed, 10 insertions(+), 2 deletions(-)
|
||||
create mode 100644 libssp_nonshared/__stack_chk_fail_local.c
|
||||
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -66,7 +66,7 @@ CRT_LIBS = $(addprefix lib/,$(notdir $(C
|
||||
STATIC_LIBS = lib/libc.a
|
||||
SHARED_LIBS = lib/libc.so
|
||||
TOOL_LIBS = lib/musl-gcc.specs
|
||||
-ALL_LIBS = $(CRT_LIBS) $(STATIC_LIBS) $(SHARED_LIBS) $(EMPTY_LIBS) $(TOOL_LIBS)
|
||||
+ALL_LIBS = $(CRT_LIBS) $(STATIC_LIBS) $(SHARED_LIBS) $(EMPTY_LIBS) $(TOOL_LIBS) lib/libssp_nonshared.a
|
||||
ALL_TOOLS = obj/musl-gcc
|
||||
|
||||
WRAPCC_GCC = gcc
|
||||
@@ -125,7 +125,8 @@ NOSSP_SRCS = $(wildcard crt/*.c) \
|
||||
src/thread/__set_thread_area.c src/thread/$(ARCH)/__set_thread_area.c \
|
||||
src/string/memset.c src/string/$(ARCH)/memset.c \
|
||||
src/string/memcpy.c src/string/$(ARCH)/memcpy.c \
|
||||
- ldso/dlstart.c ldso/dynlink.c
|
||||
+ ldso/dlstart.c ldso/dynlink.c \
|
||||
+ src/libssp_nonshared/__stack_chk_fail_local.c
|
||||
$(NOSSP_SRCS:%.c=obj/%.o) $(NOSSP_SRCS:%.c=obj/%.lo): CFLAGS_ALL += $(CFLAGS_NOSSP)
|
||||
|
||||
$(CRT_OBJS): CFLAGS_ALL += -DCRT
|
||||
@@ -168,6 +169,11 @@ lib/libc.a: $(AOBJS)
|
||||
$(AR) rc $@ $(AOBJS)
|
||||
$(RANLIB) $@
|
||||
|
||||
+lib/libssp_nonshared.a: obj/src/libssp_nonshared/__stack_chk_fail_local.o
|
||||
+ rm -f $@
|
||||
+ $(AR) rc $@ $<
|
||||
+ $(RANLIB) $@
|
||||
+
|
||||
$(EMPTY_LIBS):
|
||||
rm -f $@
|
||||
$(AR) rc $@
|
||||
--- /dev/null
|
||||
+++ b/src/libssp_nonshared/__stack_chk_fail_local.c
|
||||
@@ -0,0 +1,2 @@
|
||||
+#include "atomic.h"
|
||||
+void __attribute__((visibility ("hidden"))) __stack_chk_fail_local(void) { a_crash(); }
|
||||
11
toolchain/musl/patches/300-relative.patch
Normal file
11
toolchain/musl/patches/300-relative.patch
Normal file
@@ -0,0 +1,11 @@
|
||||
--- a/Makefile
|
||||
+++ b/Makefile
|
||||
@@ -217,7 +217,7 @@ $(DESTDIR)$(includedir)/%: $(srcdir)/inc
|
||||
$(INSTALL) -D -m 644 $< $@
|
||||
|
||||
$(DESTDIR)$(LDSO_PATHNAME): $(DESTDIR)$(libdir)/libc.so
|
||||
- $(INSTALL) -D -l $(libdir)/libc.so $@ || true
|
||||
+ $(INSTALL) -D -l libc.so $@ || true
|
||||
|
||||
install-libs: $(ALL_LIBS:lib/%=$(DESTDIR)$(libdir)/%) $(if $(SHARED_LIBS),$(DESTDIR)$(LDSO_PATHNAME),)
|
||||
|
||||
@@ -0,0 +1,197 @@
|
||||
From e6683d001a95d7c3d4d992496f00f77e01fcd268 Mon Sep 17 00:00:00 2001
|
||||
From: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
Date: Sun, 22 Nov 2015 15:04:23 +0100
|
||||
Subject: [PATCH v2] Add format attribute to some function declarations
|
||||
|
||||
GCC and Clang are able to check the format arguments given to a
|
||||
function and warn the user if there is a error in the format arguments
|
||||
or if there is a potential uncontrolled format string security problem
|
||||
in the code. GCC does this automatically for some functions like
|
||||
printf(), but it is also possible to annotate other functions in a way
|
||||
that it will check them too. This feature is used by glibc for many
|
||||
functions. This patch adds the attribute to the some functions of musl
|
||||
expect for these functions where gcc automatically adds it.
|
||||
|
||||
GCC automatically adds checks for these functions: printf, fprintf,
|
||||
sprintf, scanf, fscanf, sscanf, strftime, vprintf, vfprintf and
|
||||
vsprintf.
|
||||
|
||||
The documentation from gcc is here:
|
||||
https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html
|
||||
|
||||
The documentation from Clang is here:
|
||||
http://clang.llvm.org/docs/AttributeReference.html#format-gnu-format
|
||||
|
||||
Signed-off-by: Hauke Mehrtens <hauke@hauke-m.de>
|
||||
---
|
||||
include/err.h | 26 +++++++++++++++++---------
|
||||
include/monetary.h | 12 ++++++++++--
|
||||
include/stdio.h | 29 ++++++++++++++++++++---------
|
||||
include/syslog.h | 12 ++++++++++--
|
||||
4 files changed, 57 insertions(+), 22 deletions(-)
|
||||
|
||||
--- a/include/err.h
|
||||
+++ b/include/err.h
|
||||
@@ -8,15 +8,23 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
-void warn(const char *, ...);
|
||||
-void vwarn(const char *, va_list);
|
||||
-void warnx(const char *, ...);
|
||||
-void vwarnx(const char *, va_list);
|
||||
+#if __GNUC__ >= 3
|
||||
+#define __fp(x, y) __attribute__ ((__format__ (__printf__, x, y)))
|
||||
+#else
|
||||
+#define __fp(x, y)
|
||||
+#endif
|
||||
+
|
||||
+void warn(const char *, ...) __fp(1, 2);
|
||||
+void vwarn(const char *, va_list) __fp(1, 0);
|
||||
+void warnx(const char *, ...) __fp(1, 2);
|
||||
+void vwarnx(const char *, va_list) __fp(1, 0);
|
||||
+
|
||||
+_Noreturn void err(int, const char *, ...) __fp(2, 3);
|
||||
+_Noreturn void verr(int, const char *, va_list) __fp(2, 0);
|
||||
+_Noreturn void errx(int, const char *, ...) __fp(2, 3);
|
||||
+_Noreturn void verrx(int, const char *, va_list) __fp(2, 0);
|
||||
|
||||
-_Noreturn void err(int, const char *, ...);
|
||||
-_Noreturn void verr(int, const char *, va_list);
|
||||
-_Noreturn void errx(int, const char *, ...);
|
||||
-_Noreturn void verrx(int, const char *, va_list);
|
||||
+#undef __fp
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
--- a/include/monetary.h
|
||||
+++ b/include/monetary.h
|
||||
@@ -13,8 +13,16 @@ extern "C" {
|
||||
|
||||
#include <bits/alltypes.h>
|
||||
|
||||
-ssize_t strfmon(char *__restrict, size_t, const char *__restrict, ...);
|
||||
-ssize_t strfmon_l(char *__restrict, size_t, locale_t, const char *__restrict, ...);
|
||||
+#if __GNUC__ >= 3
|
||||
+#define __fsfm(x, y) __attribute__ ((__format__ (__strfmon__, x, y)))
|
||||
+#else
|
||||
+#define __fsfm(x, y)
|
||||
+#endif
|
||||
+
|
||||
+ssize_t strfmon(char *__restrict, size_t, const char *__restrict, ...) __fsfm(3, 4);
|
||||
+ssize_t strfmon_l(char *__restrict, size_t, locale_t, const char *__restrict, ...) __fsfm(4, 5);
|
||||
+
|
||||
+#undef __fsfm
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
--- a/include/stdio.h
|
||||
+++ b/include/stdio.h
|
||||
@@ -21,6 +21,14 @@ extern "C" {
|
||||
|
||||
#include <bits/alltypes.h>
|
||||
|
||||
+#if __GNUC__ >= 3
|
||||
+#define __fp(x, y) __attribute__ ((__format__ (__printf__, x, y)))
|
||||
+#define __fs(x, y) __attribute__ ((__format__ (__scanf__, x, y)))
|
||||
+#else
|
||||
+#define __fp(x, y)
|
||||
+#define __fs(x, y)
|
||||
+#endif
|
||||
+
|
||||
#ifdef __cplusplus
|
||||
#define NULL 0L
|
||||
#else
|
||||
@@ -102,19 +110,19 @@ int puts(const char *);
|
||||
int printf(const char *__restrict, ...);
|
||||
int fprintf(FILE *__restrict, const char *__restrict, ...);
|
||||
int sprintf(char *__restrict, const char *__restrict, ...);
|
||||
-int snprintf(char *__restrict, size_t, const char *__restrict, ...);
|
||||
+int snprintf(char *__restrict, size_t, const char *__restrict, ...) __fp(3, 4);
|
||||
|
||||
int vprintf(const char *__restrict, __isoc_va_list);
|
||||
int vfprintf(FILE *__restrict, const char *__restrict, __isoc_va_list);
|
||||
int vsprintf(char *__restrict, const char *__restrict, __isoc_va_list);
|
||||
-int vsnprintf(char *__restrict, size_t, const char *__restrict, __isoc_va_list);
|
||||
+int vsnprintf(char *__restrict, size_t, const char *__restrict, __isoc_va_list) __fp(3, 0);
|
||||
|
||||
int scanf(const char *__restrict, ...);
|
||||
int fscanf(FILE *__restrict, const char *__restrict, ...);
|
||||
int sscanf(const char *__restrict, const char *__restrict, ...);
|
||||
-int vscanf(const char *__restrict, __isoc_va_list);
|
||||
-int vfscanf(FILE *__restrict, const char *__restrict, __isoc_va_list);
|
||||
-int vsscanf(const char *__restrict, const char *__restrict, __isoc_va_list);
|
||||
+int vscanf(const char *__restrict, __isoc_va_list) __fs(1, 0);
|
||||
+int vfscanf(FILE *__restrict, const char *__restrict, __isoc_va_list) __fs(2, 0);
|
||||
+int vsscanf(const char *__restrict, const char *__restrict, __isoc_va_list) __fs(2, 0);
|
||||
|
||||
void perror(const char *);
|
||||
|
||||
@@ -135,8 +143,8 @@ int pclose(FILE *);
|
||||
int fileno(FILE *);
|
||||
int fseeko(FILE *, off_t, int);
|
||||
off_t ftello(FILE *);
|
||||
-int dprintf(int, const char *__restrict, ...);
|
||||
-int vdprintf(int, const char *__restrict, __isoc_va_list);
|
||||
+int dprintf(int, const char *__restrict, ...) __fp(2, 3);
|
||||
+int vdprintf(int, const char *__restrict, __isoc_va_list) __fp(2, 0);
|
||||
void flockfile(FILE *);
|
||||
int ftrylockfile(FILE *);
|
||||
void funlockfile(FILE *);
|
||||
@@ -175,8 +183,8 @@ int fileno_unlocked(FILE *);
|
||||
int getw(FILE *);
|
||||
int putw(int, FILE *);
|
||||
char *fgetln(FILE *, size_t *);
|
||||
-int asprintf(char **, const char *, ...);
|
||||
-int vasprintf(char **, const char *, __isoc_va_list);
|
||||
+int asprintf(char **, const char *, ...) __fp(2, 3);
|
||||
+int vasprintf(char **, const char *, __isoc_va_list) __fp(2, 0);
|
||||
#endif
|
||||
|
||||
#ifdef _GNU_SOURCE
|
||||
@@ -198,6 +206,9 @@ typedef struct _IO_cookie_io_functions_t
|
||||
FILE *fopencookie(void *, const char *, cookie_io_functions_t);
|
||||
#endif
|
||||
|
||||
+#undef __fp
|
||||
+#undef __fs
|
||||
+
|
||||
#if defined(_LARGEFILE64_SOURCE) || defined(_GNU_SOURCE)
|
||||
#define tmpfile64 tmpfile
|
||||
#define fopen64 fopen
|
||||
--- a/include/syslog.h
|
||||
+++ b/include/syslog.h
|
||||
@@ -56,16 +56,22 @@ extern "C" {
|
||||
#define LOG_NOWAIT 0x10
|
||||
#define LOG_PERROR 0x20
|
||||
|
||||
+#if __GNUC__ >= 3
|
||||
+#define __fp(x, y) __attribute__ ((__format__ (__printf__, x, y)))
|
||||
+#else
|
||||
+#define __fp(x, y)
|
||||
+#endif
|
||||
+
|
||||
void closelog (void);
|
||||
void openlog (const char *, int, int);
|
||||
int setlogmask (int);
|
||||
-void syslog (int, const char *, ...);
|
||||
+void syslog (int, const char *, ...) __fp(2, 3);
|
||||
|
||||
#if defined(_GNU_SOURCE) || defined(_BSD_SOURCE)
|
||||
#define _PATH_LOG "/dev/log"
|
||||
#define __NEED_va_list
|
||||
#include <bits/alltypes.h>
|
||||
-void vsyslog (int, const char *, va_list);
|
||||
+void vsyslog (int, const char *, va_list) __fp(2, 0);
|
||||
#if defined(SYSLOG_NAMES)
|
||||
#define INTERNAL_NOPRI 0x10
|
||||
#define INTERNAL_MARK (LOG_NFACILITIES<<3)
|
||||
@@ -93,6 +99,8 @@ typedef struct {
|
||||
#endif
|
||||
#endif
|
||||
|
||||
+#undef __fp
|
||||
+
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
@@ -0,0 +1,69 @@
|
||||
From e01b5939b38aea5ecbe41670643199825874b26c Mon Sep 17 00:00:00 2001
|
||||
From: Rich Felker <dalias@aerifal.cx>
|
||||
Date: Thu, 21 May 2020 23:32:45 -0400
|
||||
Subject: [PATCH 2/4] don't use libc.threads_minus_1 as relaxed atomic for
|
||||
skipping locks
|
||||
|
||||
after all but the last thread exits, the next thread to observe
|
||||
libc.threads_minus_1==0 and conclude that it can skip locking fails to
|
||||
synchronize with any changes to memory that were made by the
|
||||
last-exiting thread. this can produce data races.
|
||||
|
||||
on some archs, at least x86, memory synchronization is unlikely to be
|
||||
a problem; however, with the inline locks in malloc, skipping the lock
|
||||
also eliminated the compiler barrier, and caused code that needed to
|
||||
re-check chunk in-use bits after obtaining the lock to reuse a stale
|
||||
value, possibly from before the process became single-threaded. this
|
||||
in turn produced corruption of the heap state.
|
||||
|
||||
some uses of libc.threads_minus_1 remain, especially for allocation of
|
||||
new TLS in the dynamic linker; otherwise, it could be removed
|
||||
entirely. it's made non-volatile to reflect that the remaining
|
||||
accesses are only made under lock on the thread list.
|
||||
|
||||
instead of libc.threads_minus_1, libc.threaded is now used for
|
||||
skipping locks. the difference is that libc.threaded is permanently
|
||||
true once an additional thread has been created. this will produce
|
||||
some performance regression in processes that are mostly
|
||||
single-threaded but occasionally creating threads. in the future it
|
||||
may be possible to bring back the full lock-skipping, but more care
|
||||
needs to be taken to produce a safe design.
|
||||
---
|
||||
src/internal/libc.h | 2 +-
|
||||
src/malloc/malloc.c | 2 +-
|
||||
src/thread/__lock.c | 2 +-
|
||||
3 files changed, 3 insertions(+), 3 deletions(-)
|
||||
|
||||
--- a/src/internal/libc.h
|
||||
+++ b/src/internal/libc.h
|
||||
@@ -21,7 +21,7 @@ struct __libc {
|
||||
int can_do_threads;
|
||||
int threaded;
|
||||
int secure;
|
||||
- volatile int threads_minus_1;
|
||||
+ int threads_minus_1;
|
||||
size_t *auxv;
|
||||
struct tls_module *tls_head;
|
||||
size_t tls_size, tls_align, tls_cnt;
|
||||
--- a/src/malloc/malloc.c
|
||||
+++ b/src/malloc/malloc.c
|
||||
@@ -60,7 +60,7 @@ static struct {
|
||||
|
||||
static inline void lock(volatile int *lk)
|
||||
{
|
||||
- if (libc.threads_minus_1)
|
||||
+ if (libc.threaded)
|
||||
while(a_swap(lk, 1)) __wait(lk, lk+1, 1, 1);
|
||||
}
|
||||
|
||||
--- a/src/thread/__lock.c
|
||||
+++ b/src/thread/__lock.c
|
||||
@@ -18,7 +18,7 @@
|
||||
|
||||
void __lock(volatile int *l)
|
||||
{
|
||||
- if (!libc.threads_minus_1) return;
|
||||
+ if (!libc.threaded) return;
|
||||
/* fast path: INT_MIN for the lock, +1 for the congestion */
|
||||
int current = a_cas(l, 0, INT_MIN + 1);
|
||||
if (!current) return;
|
||||
100
toolchain/musl/patches/900-iconv_size_hack.patch
Normal file
100
toolchain/musl/patches/900-iconv_size_hack.patch
Normal file
@@ -0,0 +1,100 @@
|
||||
--- a/src/locale/iconv.c
|
||||
+++ b/src/locale/iconv.c
|
||||
@@ -48,6 +48,7 @@ static const unsigned char charmaps[] =
|
||||
"utf16\0\0\312"
|
||||
"ucs4\0utf32\0\0\313"
|
||||
"ucs2\0\0\314"
|
||||
+#ifdef FULL_ICONV
|
||||
"eucjp\0\0\320"
|
||||
"shiftjis\0sjis\0\0\321"
|
||||
"iso2022jp\0\0\322"
|
||||
@@ -56,6 +57,7 @@ static const unsigned char charmaps[] =
|
||||
"gb2312\0\0\332"
|
||||
"big5\0bigfive\0cp950\0big5hkscs\0\0\340"
|
||||
"euckr\0ksc5601\0ksx1001\0cp949\0\0\350"
|
||||
+#endif
|
||||
#include "codepages.h"
|
||||
;
|
||||
|
||||
@@ -66,6 +68,7 @@ static const unsigned short legacy_chars
|
||||
#include "legacychars.h"
|
||||
};
|
||||
|
||||
+#ifdef FULL_ICONV
|
||||
static const unsigned short jis0208[84][94] = {
|
||||
#include "jis0208.h"
|
||||
};
|
||||
@@ -85,6 +88,7 @@ static const unsigned short hkscs[] = {
|
||||
static const unsigned short ksc[93][94] = {
|
||||
#include "ksc.h"
|
||||
};
|
||||
+#endif
|
||||
|
||||
static const unsigned short rev_jis[] = {
|
||||
#include "revjis.h"
|
||||
@@ -205,6 +209,7 @@ static unsigned legacy_map(const unsigne
|
||||
return x < 256 ? x : legacy_chars[x-256];
|
||||
}
|
||||
|
||||
+#ifdef FULL_ICONV
|
||||
static unsigned uni_to_jis(unsigned c)
|
||||
{
|
||||
unsigned nel = sizeof rev_jis / sizeof *rev_jis;
|
||||
@@ -223,6 +228,7 @@ static unsigned uni_to_jis(unsigned c)
|
||||
}
|
||||
}
|
||||
}
|
||||
+#endif
|
||||
|
||||
size_t iconv(iconv_t cd, char **restrict in, size_t *restrict inb, char **restrict out, size_t *restrict outb)
|
||||
{
|
||||
@@ -319,6 +325,7 @@ size_t iconv(iconv_t cd, char **restrict
|
||||
}
|
||||
type = scd->state;
|
||||
continue;
|
||||
+#ifdef FULL_ICONV
|
||||
case SHIFT_JIS:
|
||||
if (c < 128) break;
|
||||
if (c-0xa1 <= 0xdf-0xa1) {
|
||||
@@ -510,6 +517,7 @@ size_t iconv(iconv_t cd, char **restrict
|
||||
c = ksc[c][d];
|
||||
if (!c) goto ilseq;
|
||||
break;
|
||||
+#endif
|
||||
default:
|
||||
if (!c) break;
|
||||
c = legacy_map(map, c);
|
||||
@@ -550,6 +558,7 @@ size_t iconv(iconv_t cd, char **restrict
|
||||
}
|
||||
}
|
||||
goto subst;
|
||||
+#ifdef FULL_ICONV
|
||||
case SHIFT_JIS:
|
||||
if (c < 128) goto revout;
|
||||
if (c == 0xa5) {
|
||||
@@ -623,6 +632,7 @@ size_t iconv(iconv_t cd, char **restrict
|
||||
*(*out)++ = 'B';
|
||||
*outb -= 8;
|
||||
break;
|
||||
+#endif
|
||||
case UCS2:
|
||||
totype = UCS2BE;
|
||||
case UCS2BE:
|
||||
--- a/src/locale/codepages.h
|
||||
+++ b/src/locale/codepages.h
|
||||
@@ -129,6 +129,7 @@
|
||||
"\340\204\43\316\100\344\34\144\316\71\350\244\243\316\72\354\264\343\316\73"
|
||||
"\21\361\44\317\74\364\30\145\17\124\146\345\243\317\76\374\134\304\327\77"
|
||||
|
||||
+#ifdef FULL_ICONV
|
||||
"cp1250\0"
|
||||
"windows1250\0"
|
||||
"\0\40"
|
||||
@@ -239,6 +240,7 @@
|
||||
"\20\105\163\330\64\324\324\145\315\65\330\144\243\315\66\334\334\145\330\67"
|
||||
"\340\204\43\316\100\344\224\143\316\71\350\244\243\316\72\205\265\343\316\73"
|
||||
"\21\305\203\330\74\364\330\145\317\75\370\344\243\317\76\374\340\65\362\77"
|
||||
+#endif
|
||||
|
||||
"koi8r\0"
|
||||
"\0\40"
|
||||
60
toolchain/musl/patches/901-crypt_size_hack.patch
Normal file
60
toolchain/musl/patches/901-crypt_size_hack.patch
Normal file
@@ -0,0 +1,60 @@
|
||||
--- a/src/crypt/crypt_r.c
|
||||
+++ b/src/crypt/crypt_r.c
|
||||
@@ -19,12 +19,6 @@ char *__crypt_r(const char *key, const c
|
||||
if (salt[0] == '$' && salt[1] && salt[2]) {
|
||||
if (salt[1] == '1' && salt[2] == '$')
|
||||
return __crypt_md5(key, salt, output);
|
||||
- if (salt[1] == '2' && salt[3] == '$')
|
||||
- return __crypt_blowfish(key, salt, output);
|
||||
- if (salt[1] == '5' && salt[2] == '$')
|
||||
- return __crypt_sha256(key, salt, output);
|
||||
- if (salt[1] == '6' && salt[2] == '$')
|
||||
- return __crypt_sha512(key, salt, output);
|
||||
}
|
||||
return __crypt_des(key, salt, output);
|
||||
}
|
||||
--- a/src/crypt/crypt_sha512.c
|
||||
+++ b/src/crypt/crypt_sha512.c
|
||||
@@ -12,6 +12,7 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
+#if 0
|
||||
|
||||
/* public domain sha512 implementation based on fips180-3 */
|
||||
/* >=2^64 bits messages are not supported (about 2000 peta bytes) */
|
||||
@@ -369,3 +370,4 @@ char *__crypt_sha512(const char *key, co
|
||||
return "*";
|
||||
return p;
|
||||
}
|
||||
+#endif
|
||||
--- a/src/crypt/crypt_blowfish.c
|
||||
+++ b/src/crypt/crypt_blowfish.c
|
||||
@@ -50,6 +50,7 @@
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
|
||||
+#if 0
|
||||
typedef uint32_t BF_word;
|
||||
typedef int32_t BF_word_signed;
|
||||
|
||||
@@ -796,3 +797,4 @@ char *__crypt_blowfish(const char *key,
|
||||
|
||||
return "*";
|
||||
}
|
||||
+#endif
|
||||
--- a/src/crypt/crypt_sha256.c
|
||||
+++ b/src/crypt/crypt_sha256.c
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <string.h>
|
||||
#include <stdint.h>
|
||||
|
||||
+#if 0
|
||||
/* public domain sha256 implementation based on fips180-3 */
|
||||
|
||||
struct sha256 {
|
||||
@@ -320,3 +321,4 @@ char *__crypt_sha256(const char *key, co
|
||||
return "*";
|
||||
return p;
|
||||
}
|
||||
+#endif
|
||||
Reference in New Issue
Block a user