提交 1ef849c6 编写于 作者: R Rich Felker

allow libc itself to be built with stack protector enabled

this was already essentially possible as a result of the previous
commits changing the dynamic linker/thread pointer bootstrap process.
this commit mainly adds build system infrastructure:

configure no longer attempts to disable stack protector. instead it
simply determines how so the makefile can disable stack protector for
a few translation units used during early startup.

stack protector is also disabled for memcpy and memset since compilers
(incorrectly) generate calls to them on some archs to implement
struct initialization and assignment, and such calls may creep into
early initialization.

no explicit attempt to enable stack protector is made by configure at
this time; any stack protector option supported by the compiler can be
passed to configure in CFLAGS, and if the compiler uses stack
protector by default, this default is respected.
上级 19a1fe67
...@@ -97,6 +97,13 @@ $(OPTIMIZE_SRCS:%.c=%.o) $(OPTIMIZE_SRCS:%.c=%.lo): CFLAGS += -O3 ...@@ -97,6 +97,13 @@ $(OPTIMIZE_SRCS:%.c=%.o) $(OPTIMIZE_SRCS:%.c=%.lo): CFLAGS += -O3
MEMOPS_SRCS = src/string/memcpy.c src/string/memmove.c src/string/memcmp.c src/string/memset.c MEMOPS_SRCS = src/string/memcpy.c src/string/memmove.c src/string/memcmp.c src/string/memset.c
$(MEMOPS_SRCS:%.c=%.o) $(MEMOPS_SRCS:%.c=%.lo): CFLAGS += $(CFLAGS_MEMOPS) $(MEMOPS_SRCS:%.c=%.o) $(MEMOPS_SRCS:%.c=%.lo): CFLAGS += $(CFLAGS_MEMOPS)
NOSSP_SRCS = $(wildcard crt/*.c) \
src/env/__libc_start_main.c src/env/__init_tls.c \
src/thread/__set_thread_area.c src/env/__stack_chk_fail.c \
src/string/memset.c src/string/memcpy.c \
src/ldso/dlstart.c src/ldso/dynlink.c
$(NOSSP_SRCS:%.c=%.o) $(NOSSP_SRCS:%.c=%.lo): CFLAGS += $(CFLAGS_NOSSP)
# This incantation ensures that changes to any subarch asm files will # This incantation ensures that changes to any subarch asm files will
# force the corresponding object file to be rebuilt, even if the implicit # force the corresponding object file to be rebuilt, even if the implicit
# rule below goes indirectly through a .sub file. # rule below goes indirectly through a .sub file.
......
...@@ -111,6 +111,7 @@ fi ...@@ -111,6 +111,7 @@ fi
CFLAGS_C99FSE= CFLAGS_C99FSE=
CFLAGS_AUTO= CFLAGS_AUTO=
CFLAGS_MEMOPS= CFLAGS_MEMOPS=
CFLAGS_NOSSP=
LDFLAGS_AUTO= LDFLAGS_AUTO=
OPTIMIZE_GLOBS= OPTIMIZE_GLOBS=
prefix=/usr/local/musl prefix=/usr/local/musl
...@@ -290,6 +291,13 @@ printf "yes\n" ...@@ -290,6 +291,13 @@ printf "yes\n"
CFLAGS_C99FSE="$CFLAGS_C99FSE -D__may_alias__=" CFLAGS_C99FSE="$CFLAGS_C99FSE -D__may_alias__="
fi fi
#
# Check for options to disable stack protector, which needs to be
# disabled for a few early-bootstrap translation units. If not found,
# this is not an error; we assume the toolchain does not do ssp.
#
tryflag CFLAGS_NOSSP -fno-stack-protector
# #
# Check for options that may be needed to prevent the compiler from # Check for options that may be needed to prevent the compiler from
# generating self-referential versions of memcpy,, memmove, memcmp, # generating self-referential versions of memcpy,, memmove, memcmp,
...@@ -408,7 +416,6 @@ tryflag CFLAGS_AUTO -Wno-pointer-to-int-cast ...@@ -408,7 +416,6 @@ tryflag CFLAGS_AUTO -Wno-pointer-to-int-cast
fi fi
# Some patched GCC builds have these defaults messed up... # Some patched GCC builds have these defaults messed up...
tryflag CFLAGS_AUTO -fno-stack-protector
tryldflag LDFLAGS_AUTO -Wl,--hash-style=both tryldflag LDFLAGS_AUTO -Wl,--hash-style=both
test "$shared" = "no" || { test "$shared" = "no" || {
...@@ -526,6 +533,7 @@ CC = $CC ...@@ -526,6 +533,7 @@ CC = $CC
CFLAGS = $CFLAGS_AUTO $CFLAGS CFLAGS = $CFLAGS_AUTO $CFLAGS
CFLAGS_C99FSE = $CFLAGS_C99FSE CFLAGS_C99FSE = $CFLAGS_C99FSE
CFLAGS_MEMOPS = $CFLAGS_MEMOPS CFLAGS_MEMOPS = $CFLAGS_MEMOPS
CFLAGS_NOSSP = $CFLAGS_NOSSP
CPPFLAGS = $CPPFLAGS CPPFLAGS = $CPPFLAGS
LDFLAGS = $LDFLAGS_AUTO $LDFLAGS LDFLAGS = $LDFLAGS_AUTO $LDFLAGS
CROSS_COMPILE = $CROSS_COMPILE CROSS_COMPILE = $CROSS_COMPILE
......
...@@ -16,3 +16,13 @@ void __stack_chk_fail(void) ...@@ -16,3 +16,13 @@ void __stack_chk_fail(void)
{ {
a_crash(); a_crash();
} }
#ifdef SHARED
__attribute__((__visibility__("hidden")))
void __stack_chk_fail_local(void)
{
a_crash();
}
#endif
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册