From 237277e9a8133c64026b736b1427141e71655330 Mon Sep 17 00:00:00 2001 From: "Peter S. Mazinger" Date: Thu, 27 Oct 2005 22:58:52 +0000 Subject: Moved guard_setup to dl-osinfo.h (used commonly by ldso and libc). Renamed to _dl_setup_stack_chk_guard, as in glibc. SSP requires now binutils-2.16.1 and newer. Add NOT_IN_libc/IS_IN_libc. Began using -DSHARED in uClibc_main.c, there are more candidates in there. Move back dl_protect_relro to it's earlier place. --- libc/Makefile.in | 14 +------- libc/misc/file/Makefile.in | 3 +- libc/misc/internals/Makefile.in | 15 ++++---- libc/misc/internals/__uClibc_main.c | 57 ++++++++++--------------------- libc/stdlib/Makefile.in | 13 ++++--- libc/sysdeps/linux/common/Makefile | 1 + libc/sysdeps/linux/common/Makefile.in | 5 ++- libc/sysdeps/linux/common/dl-osinfo.h | 64 +++++++++++++++++++++++++++++++++++ libc/sysdeps/linux/common/ssp.c | 2 ++ 9 files changed, 104 insertions(+), 70 deletions(-) create mode 100644 libc/sysdeps/linux/common/dl-osinfo.h (limited to 'libc') diff --git a/libc/Makefile.in b/libc/Makefile.in index 33a1070d9..62a522066 100644 --- a/libc/Makefile.in +++ b/libc/Makefile.in @@ -39,19 +39,7 @@ VERSION_SCRIPT:=${shell if [ -f $(libc_DIR)/sysdeps/linux/$(TARGET_ARCH)/libc.ma EXTRA_LINK_OPTS:=$(VERSION_SCRIPT) -init __uClibc_init EXTRA_LINK_LIBS:=$(libc_OUT)/misc/internals/interp.os $(top_builddir)lib/$(UCLIBC_LDSO) $(LIBGCC) # $(LDADD_LIBFLOAT) -ifeq ($(DOPIC),y) -libc-a-y: $(libc-a-pic-y) -else -libc-a-y: $(libc-a-y) -endif - -libc-so-y: $(libc-so-y) - -crt-y: $(crt-y) -other-y: $(other-y) - objclean-y+=libc_clean lib-a-y+=$(top_builddir)lib/libc.a -lib-a-pic-y+=$(top_builddir)lib/libc.a -lib-so-y+=$(top_builddir)lib/libc.so $(top_builddir)lib/$(NONSHARED_LIBNAME) crt-y +lib-so-y+=$(top_builddir)lib/libc.so $(top_builddir)lib/$(NONSHARED_LIBNAME) crt-y other-y diff --git a/libc/misc/file/Makefile.in b/libc/misc/file/Makefile.in index 76eff7868..58da3e2a3 100644 --- a/libc/misc/file/Makefile.in +++ b/libc/misc/file/Makefile.in @@ -19,7 +19,8 @@ libc-a-y+=$(MISC_FILE_OBJ) libc-a-pic-y+=$(MISC_FILE_OBJ:.o=.os) libc-so-y+=$(MISC_FILE_OBJ:.o=.os) -libc-multi-y+=$(MISC_FILE_SRC) +libc-multi-y+=$(MISC_FILE_DIR)/lockf.c +libc-nomulti-y+=$(MISC_FILE_OUT)/lockf64.o objclean-y+=misc_file_objclean diff --git a/libc/misc/internals/Makefile.in b/libc/misc/internals/Makefile.in index de611323e..a9dc2634f 100644 --- a/libc/misc/internals/Makefile.in +++ b/libc/misc/internals/Makefile.in @@ -8,7 +8,7 @@ CFLAGS-__uClibc_main.c=$(SSP_DISABLE_FLAGS) -CSRC:=__uClibc_main.c tempname.c errno.c __errno_location.c __h_errno_location.c +CSRC:=tempname.c errno.c __errno_location.c __h_errno_location.c MISC_INTERNALS_DIR:=$(top_srcdir)libc/misc/internals MISC_INTERNALS_OUT:=$(top_builddir)libc/misc/internals @@ -16,7 +16,7 @@ MISC_INTERNALS_OUT:=$(top_builddir)libc/misc/internals MISC_INTERNALS_SRC:=$(patsubst %.c,$(MISC_INTERNALS_DIR)/%.c,$(CSRC)) MISC_INTERNALS_OBJ:=$(patsubst %.c,$(MISC_INTERNALS_OUT)/%.o,$(CSRC)) -MISC_INTERNALS_OBJS:=$(MISC_INTERNALS_OBJ) $(MISC_INTERNALS_OUT)/static.o +STATIC_SRC:=__uClibc_main.c static.c $(MISC_INTERNALS_OUT)/interp.c: $(MISC_INTERNALS_DIR)/Makefile.in echo "/* Force shared libraries to know about the correct library loader */" > $@ @@ -26,16 +26,15 @@ $(MISC_INTERNALS_OUT)/interp.c: $(MISC_INTERNALS_DIR)/Makefile.in "(\".interp\"))) =\""$(SHARED_LIB_LOADER_PREFIX)/$(UCLIBC_LDSO)"\";" >> $@ echo "#endif" >> $@ -libc-a-y+=$(MISC_INTERNALS_OBJS) -libc-a-pic-y+=$(MISC_INTERNALS_OBJS:.o=.os) -# this is OBJ, not OBJS !!!, static does not go into .so +libc-a-y+=$(MISC_INTERNALS_OBJ) libc-so-y+=$(MISC_INTERNALS_OBJ:.o=.os) +libc-shared-y+=$(MISC_INTERNALS_OUT)/__uClibc_main.oS +libc-static-y+=$(patsubst %.c,$(MISC_INTERNALS_OUT)/%.o,$(STATIC_SRC)) other-y+=$(MISC_INTERNALS_OUT)/interp.os -libc-multi-y+=$(filter-out $(MISC_INTERNALS_DIR)/__uClibc_main.c,$(MISC_INTERNALS_SRC)) -libc-nomulti-y+=$(MISC_INTERNALS_OUT)/__uClibc_main.o +libc-multi-y+=$(MISC_INTERNALS_SRC) objclean-y+=misc_internals_objclean misc_internals_objclean: - $(RM) $(MISC_INTERNALS_OUT)/{*.{o,os},interp.c} + $(RM) $(MISC_INTERNALS_OUT)/{*.{o,os,oS},interp.c} diff --git a/libc/misc/internals/__uClibc_main.c b/libc/misc/internals/__uClibc_main.c index 1f2061e58..e7c2c4abf 100644 --- a/libc/misc/internals/__uClibc_main.c +++ b/libc/misc/internals/__uClibc_main.c @@ -25,15 +25,21 @@ #include #include #include +#ifndef SHARED +/* probably all the weak_*function stuff below should be in here */ #ifdef __UCLIBC_HAS_SSP__ -#include +#include +#ifndef THREAD_SET_STACK_GUARD +/* Only exported for architectures that don't store the stack guard canary + * in thread local area. */ #include - /* for gcc-4.1 non-TLS */ uintptr_t __stack_chk_guard attribute_relro; /* for gcc-3.x + Etoh ssp */ strong_alias(__stack_chk_guard,__guard) #endif +#endif +#endif /* * Prototypes. @@ -49,10 +55,6 @@ extern void weak_function _locale_init(void); extern void weak_function __pthread_initialize_minimal(void); #endif - - - - /* * Declare the __environ global variable and create a weak alias environ. * Note: Apparently we must initialize __environ to ensure that the weak @@ -64,7 +66,6 @@ weak_alias(__environ, environ); size_t __pagesize = 0; const char *__progname = 0; - #ifndef O_NOFOLLOW # define O_NOFOLLOW 0 #endif @@ -110,36 +111,6 @@ static int __check_suid(void) return 1; } -#ifdef __UCLIBC_HAS_SSP__ -static __always_inline uintptr_t _dl_guard_setup(void) -{ - uintptr_t ret; -#ifndef __SSP_QUICK_CANARY__ - { - int fd = OPEN("/dev/urandom", O_RDONLY); - if (fd >= 0) { - size_t size = READ(fd, &ret, sizeof(ret)); - CLOSE(fd); - if (size == (size_t) sizeof(ret)) - return ret; - } - } -#endif /* ifndef __SSP_QUICK_CANARY__ */ - - /* Start with the "terminator canary". */ - ret = 0xFF0A0D00UL; - - /* Everything failed? Or we are using a weakened model of the - * terminator canary */ - { - struct timeval tv; - if (GETTIMEOFDAY(&tv, NULL) != (-1)) - ret ^= tv.tv_usec ^ tv.tv_sec; - } - return ret; -} -#endif /* __UCLIBC_HAS_SSP__ */ - /* __uClibc_init completely initialize uClibc so it is ready to use. * * On ELF systems (with a dynamic loader) this function must be called @@ -174,10 +145,16 @@ void __uClibc_init(void) __pthread_initialize_minimal(); #endif -#ifdef __UCLIBC_HAS_SSP__ - uintptr_t stack_chk_guard = _dl_guard_setup(); - /* for gcc-4.1 non-TLS */ +#ifndef SHARED +# ifdef __UCLIBC_HAS_SSP__ + /* Set up the stack checker's canary. */ + uintptr_t stack_chk_guard = _dl_setup_stack_chk_guard(); +# ifdef THREAD_SET_STACK_GUARD + THREAD_SET_STACK_GUARD (stack_chk_guard); +# else __stack_chk_guard = stack_chk_guard; +# endif +# endif #endif #ifdef __UCLIBC_HAS_LOCALE__ diff --git a/libc/stdlib/Makefile.in b/libc/stdlib/Makefile.in index 3b00c8115..236d20cda 100644 --- a/libc/stdlib/Makefile.in +++ b/libc/stdlib/Makefile.in @@ -106,15 +106,18 @@ $(STDLIB_MOBJ1x) $(STDLIB_MOBJ1x:.o=.os): $(STDLIB_MSRC1) $(STDLIB_MOBJ2x) $(STDLIB_MOBJ2x:.o=.os): $(STDLIB_MSRC2) $(compile.m) -D__UCLIBC_DO_XLOCALE -libc-a-y+=$(STDLIB_OBJS) $(STDLIB_OUT)/atexit.o -libc-a-pic-y+=$(STDLIB_OBJS:.o=.os) $(STDLIB_OUT)/atexit.os +libc-a-y+=$(STDLIB_OBJS) +libc-static-y+=$(STDLIB_OUT)/atexit.o libc-so-y+=$(STDLIB_OBJS:.o=.os) # this should always be the PIC version, because it could be used in shared libs libc-nonshared-y+=$(STDLIB_OUT)/atexit.os -CFLAGS-multi-y+=$(STDLIB_DEF) -libc-multi-y+=$(STDLIB_SRC) $(STDLIB_MSRC) -libc-nomulti-y+=$(STDLIB_MOBJx) +#CFLAGS-multi-y+=$(STDLIB_DEF) +#libc-multi-y+=$(STDLIB_SRC) $(STDLIB_MSRC) +#libc-nomulti-y+=$(STDLIB_MOBJx) +#libc-multi-y+=$(STDLIB_MSRC) +#libc-nomulti-y+=$(STDLIB_OBJ) $(STDLIB_MOBJx) +libc-nomulti-y+=$(STDLIB_OBJS) objclean-y+=stdlib_objclean diff --git a/libc/sysdeps/linux/common/Makefile b/libc/sysdeps/linux/common/Makefile index e45c58961..704f0350b 100644 --- a/libc/sysdeps/linux/common/Makefile +++ b/libc/sysdeps/linux/common/Makefile @@ -56,6 +56,7 @@ $(OBJS) $(NONSHARED_OBJS): %.o : %.c headers: $(LN) -fs ../libc/sysdeps/linux/common/fpu_control.h $(TOPDIR)/include/ + $(LN) -fs ../libc/sysdeps/linux/common/dl-osinfo.h $(TOPDIR)/include/ clean: $(RM) *.o *~ core diff --git a/libc/sysdeps/linux/common/Makefile.in b/libc/sysdeps/linux/common/Makefile.in index 85826913e..ce7d8f90d 100644 --- a/libc/sysdeps/linux/common/Makefile.in +++ b/libc/sysdeps/linux/common/Makefile.in @@ -31,9 +31,7 @@ COMMON_SRC:=$(patsubst %.c,$(COMMON_DIR)/%.c,$(CSRC)) COMMON_OBJ:=$(patsubst %.c,$(COMMON_OUT)/%.o,$(CSRC)) libc-a-y+=$(COMMON_OBJ) -libc-a-$(UCLIBC_HAS_SSP)+=$(COMMON_OUT)/ssp-local.o -libc-a-pic-y+=$(COMMON_OBJ:.o=.os) -libc-a-pic-$(UCLIBC_HAS_SSP)+=$(COMMON_OUT)/ssp-local.os +libc-a-static-$(UCLIBC_HAS_SSP)+=$(COMMON_OUT)/ssp-local.o libc-so-y+=$(COMMON_OBJ:.o=.os) libc-nonshared-$(UCLIBC_HAS_SSP)+=$(COMMON_OUT)/ssp-local.os @@ -50,3 +48,4 @@ headers-y+=common_headers common_headers: $(LN) -fs ../libc/sysdeps/linux/common/fpu_control.h $(top_builddir)include/ + $(LN) -fs ../libc/sysdeps/linux/common/dl-osinfo.h $(top_builddir)include/ diff --git a/libc/sysdeps/linux/common/dl-osinfo.h b/libc/sysdeps/linux/common/dl-osinfo.h new file mode 100644 index 000000000..ee3e2ce99 --- /dev/null +++ b/libc/sysdeps/linux/common/dl-osinfo.h @@ -0,0 +1,64 @@ +/* + * Copyright (C) 2000-2005 Erik Andersen + * + * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. + */ + +#ifndef _DL_OSINFO_H +#define _DL_OSINFO_H 1 + +#include + +#ifdef __UCLIBC_HAS_SSP__ +#include +#include + +#ifdef IS_IN_libc +#include +#if 0 +#ifndef __SSP_QUICK_CANARY__ +#define OPEN __libc_open +#define READ __libc_read +#define CLOSE __libc_close +#endif +#define GETTIMEOFDAY gettimeofday +#endif +#else +#ifndef __SSP_QUICK_CANARY__ +#define OPEN _dl_open +#define READ _dl_read +#define CLOSE _dl_close +#endif +#define GETTIMEOFDAY _dl_gettimeofday +#endif + +static __always_inline uintptr_t _dl_setup_stack_chk_guard(void) +{ + uintptr_t ret; +#ifndef __SSP_QUICK_CANARY__ + { + int fd = OPEN("/dev/urandom", O_RDONLY, 0); + if (fd >= 0) { + size_t size = READ(fd, &ret, sizeof(ret)); + CLOSE(fd); + if (size == (size_t) sizeof(ret)) + return ret; + } + } +#endif /* !__SSP_QUICK_CANARY__ */ + + /* Start with the "terminator canary". */ + ret = 0xFF0A0D00UL; + + /* Everything failed? Or we are using a weakened model of the + * terminator canary */ + { + struct timeval tv; + if (GETTIMEOFDAY(&tv, NULL) != (-1)) + ret ^= tv.tv_usec ^ tv.tv_sec; + } + return ret; +} +#endif /* __UCLIBC_HAS_SSP__ */ + +#endif /* _DL_OSINFO_H */ diff --git a/libc/sysdeps/linux/common/ssp.c b/libc/sysdeps/linux/common/ssp.c index 7791a0104..2f3a28ba4 100644 --- a/libc/sysdeps/linux/common/ssp.c +++ b/libc/sysdeps/linux/common/ssp.c @@ -87,6 +87,7 @@ void __attribute__ ((noreturn)) __stack_chk_fail(void) terminate(); } +#if 0 void __attribute__ ((noreturn)) __chk_fail(void) { extern char *__progname; @@ -101,3 +102,4 @@ void __attribute__ ((noreturn)) __chk_fail(void) while(1) terminate(); } +#endif -- cgit v1.2.3