summaryrefslogtreecommitdiffstats
path: root/libc/misc/internals
diff options
context:
space:
mode:
Diffstat (limited to 'libc/misc/internals')
-rw-r--r--libc/misc/internals/Makefile.in18
-rw-r--r--libc/misc/internals/__uClibc_main.c34
-rw-r--r--libc/misc/internals/tempname.c19
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;