diff options
Diffstat (limited to 'libc/misc/internals')
-rw-r--r-- | libc/misc/internals/Makefile.in | 18 | ||||
-rw-r--r-- | libc/misc/internals/__uClibc_main.c | 34 | ||||
-rw-r--r-- | libc/misc/internals/tempname.c | 19 |
3 files changed, 46 insertions, 25 deletions
diff --git a/libc/misc/internals/Makefile.in b/libc/misc/internals/Makefile.in index 4d57cf4e3..11cc7efdb 100644 --- a/libc/misc/internals/Makefile.in +++ b/libc/misc/internals/Makefile.in @@ -7,7 +7,7 @@ CFLAGS-__uClibc_main.c := $(SSP_DISABLE_FLAGS) -CSRC := tempname.c errno.c __errno_location.c __h_errno_location.c +CSRC := tempname.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,15 +16,15 @@ MISC_INTERNALS_SRC := $(patsubst %.c,$(MISC_INTERNALS_DIR)/%.c,$(CSRC)) MISC_INTERNALS_OBJ := $(patsubst %.c,$(MISC_INTERNALS_OUT)/%.o,$(CSRC)) libc-y += $(MISC_INTERNALS_OBJ) -libc-shared-y += $(MISC_INTERNALS_OUT)/__uClibc_main.oS -libc-static-y += $(MISC_INTERNALS_OUT)/__uClibc_main.o -libc-so-y += $(MISC_INTERNALS_OUT)/__uClibc_main.oS \ - $(MISC_INTERNALS_OUT)/errno.oS $(MISC_INTERNALS_OBJ:.o=.oS) +libc-shared-y += $(MISC_INTERNALS_OUT)/__uClibc_main.oS \ + $(MISC_INTERNALS_OUT)/errno.oS +libc-static-y += $(MISC_INTERNALS_OUT)/__uClibc_main.o \ + $(MISC_INTERNALS_OUT)/errno.o libc-static-$(UCLIBC_FORMAT_SHARED_FLAT) += \ - $(MISC_INTERNALS_OUT)/shared_flat_initfini.o \ - $(MISC_INTERNALS_OUT)/shared_flat_add_library.o -libc-nomulti-y += $(MISC_INTERNALS_OUT)/__uClibc_main.o - + $(MISC_INTERNALS_OUT)/shared_flat_initfini.o \ + $(MISC_INTERNALS_OUT)/shared_flat_add_library.o +libc-nomulti-y += $(MISC_INTERNALS_OUT)/__uClibc_main.o \ + $(MISC_INTERNALS_OUT)/errno.o objclean-y += misc_internals_objclean misc_internals_objclean: diff --git a/libc/misc/internals/__uClibc_main.c b/libc/misc/internals/__uClibc_main.c index 85f38c521..15544790a 100644 --- a/libc/misc/internals/__uClibc_main.c +++ b/libc/misc/internals/__uClibc_main.c @@ -15,8 +15,10 @@ * avoided in the static library case. */ -#define _ERRNO_H #include <features.h> +#ifndef __UCLIBC_HAS_THREADS_NATIVE__ +#define _ERRNO_H +#endif #include <unistd.h> #include <stdlib.h> #include <string.h> @@ -30,6 +32,7 @@ #include <sys/stat.h> #include <sys/sysmacros.h> #ifdef __UCLIBC_HAS_THREADS_NATIVE__ +#include <errno.h> #include <pthread-functions.h> #include <not-cancel.h> #endif @@ -54,6 +57,8 @@ extern __typeof(fcntl) __libc_fcntl; libc_hidden_proto(__libc_fcntl) #endif +#include <pthreadP.h> + #ifndef SHARED void *__libc_stack_end=NULL; @@ -79,6 +84,11 @@ uintptr_t __guard attribute_relro; # endif # endif +/* + * Needed to initialize _dl_phdr when statically linked; + */ + +void internal_function _dl_aux_init (ElfW(auxv_t) *av); #endif /* !SHARED */ /* @@ -91,7 +101,11 @@ extern int *weak_const_function __h_errno_location(void); extern void weak_function _locale_init(void) attribute_hidden; #endif #ifdef __UCLIBC_HAS_THREADS__ +#if !defined (__UCLIBC_HAS_THREADS_NATIVE__) || defined (SHARED) extern void weak_function __pthread_initialize_minimal(void); +#else +extern void __pthread_initialize_minimal(void); +#endif #endif #ifdef __UCLIBC_CTOR_DTOR__ @@ -119,12 +133,12 @@ strong_alias (__progname_full, program_invocation_name) #endif /* - * Declare the __environ global variable and create a strong alias environ. - * Note: Apparently we must initialize __environ to ensure that the strong - * environ symbol is also included. + * Declare the __environ global variable and create a weak alias environ. + * This must be initialized; we cannot have a weak alias into bss. */ + char **__environ = 0; -strong_alias(__environ,environ) +weak_alias(__environ,environ) /* TODO: don't export __pagesize; we cant now because libpthread uses it */ size_t __pagesize = 0; @@ -209,7 +223,9 @@ void __uClibc_init(void) * __pthread_initialize_minimal so we can use pthread_locks * whenever they are needed. */ +#if !defined (__UCLIBC_HAS_THREADS_NATIVE__) || defined (SHARED) if (likely(__pthread_initialize_minimal!=NULL)) +#endif __pthread_initialize_minimal(); #endif @@ -324,6 +340,12 @@ void __uClibc_main(int (*main)(int, char **, char **), int argc, } aux_dat += 2; } +#ifndef SHARED + /* Get the program headers (_dl_phdr) from the aux vector + It will be used into __libc_setup_tls. */ + + _dl_aux_init (auxvt); +#endif #endif /* We need to initialize uClibc. If we are dynamically linked this @@ -444,7 +466,7 @@ void __uClibc_main(int (*main)(int, char **, char **), int argc, if (! atomic_decrement_and_test (ptr)) /* Not much left to do but to exit the thread, not the process. */ - __exit_thread (0); + __exit_thread_inline (0); } exit (result); diff --git a/libc/misc/internals/tempname.c b/libc/misc/internals/tempname.c index 26918dc16..dc125020b 100644 --- a/libc/misc/internals/tempname.c +++ b/libc/misc/internals/tempname.c @@ -206,18 +206,17 @@ int attribute_hidden __gen_tempname (char *tmpl, int kind) return -1; } - /* Get some random data. */ - if (fillrand(randomness, sizeof(randomness)) != sizeof(randomness)) { - /* if random device nodes failed us, lets use the braindamaged ver */ - brain_damaged_fillrand(randomness, sizeof(randomness)); - } - - for (i = 0; i < sizeof(randomness); ++i) - XXXXXX[i] = letters[(randomness[i]) % NUM_LETTERS]; - for (i = 0; i < TMP_MAX; ++i) { + int j; + /* Get some random data. */ + if (fillrand(randomness, sizeof(randomness)) != sizeof(randomness)) { + /* if random device nodes failed us, lets use the braindamaged ver */ + brain_damaged_fillrand(randomness, sizeof(randomness)); + } + for (j = 0; j < sizeof(randomness); ++j) + XXXXXX[j] = letters[randomness[j] % NUM_LETTERS]; - switch(kind) { + switch (kind) { case __GT_NOCREATE: { struct stat st; |