summaryrefslogtreecommitdiff
path: root/libc/misc/internals
diff options
context:
space:
mode:
authorPeter S. Mazinger <ps.m@gmx.net>2005-10-27 22:58:52 +0000
committerPeter S. Mazinger <ps.m@gmx.net>2005-10-27 22:58:52 +0000
commit237277e9a8133c64026b736b1427141e71655330 (patch)
tree43d2f15804d486c56d7fba35c97b6d38ccc9fc6d /libc/misc/internals
parent6e3a0044cc3b4d6f3f13f2d9d1d0a83d60ca800f (diff)
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.
Diffstat (limited to 'libc/misc/internals')
-rw-r--r--libc/misc/internals/Makefile.in15
-rw-r--r--libc/misc/internals/__uClibc_main.c57
2 files changed, 24 insertions, 48 deletions
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 <fcntl.h>
#include <sys/stat.h>
#include <sys/sysmacros.h>
+#ifndef SHARED
+/* probably all the weak_*function stuff below should be in here */
#ifdef __UCLIBC_HAS_SSP__
-#include <ssp-internal.h>
+#include <dl-osinfo.h>
+#ifndef THREAD_SET_STACK_GUARD
+/* Only exported for architectures that don't store the stack guard canary
+ * in thread local area. */
#include <stdint.h>
-
/* 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__