From e356ea321c8098cf1a83a67e27d64c44de08a298 Mon Sep 17 00:00:00 2001 From: Eric Andersen Date: Wed, 20 Feb 2002 09:18:50 +0000 Subject: Merge in the pthread library. This is the linuxthreads library taken from glibc 2.1.3 and ported to work with uClibc by Stefan Soucek and Erik Andersen (me). Stefan has hacked things up such that linuxthreads runs on MMU-less systems (tested only on arm-nommu). Erik cleaned things up and made it work properly as a shared library. -Erik --- libc/misc/internals/.cvsignore | 1 + libc/misc/internals/Makefile | 2 +- libc/misc/internals/__errno_location.c | 8 ++++++++ libc/misc/internals/__uClibc_main.c | 31 +++++++++++++++---------------- libc/misc/internals/errno.c | 29 +++++++++++++++++++++++++++++ 5 files changed, 54 insertions(+), 17 deletions(-) create mode 100644 libc/misc/internals/.cvsignore create mode 100644 libc/misc/internals/__errno_location.c create mode 100644 libc/misc/internals/errno.c (limited to 'libc/misc/internals') diff --git a/libc/misc/internals/.cvsignore b/libc/misc/internals/.cvsignore new file mode 100644 index 000000000..10e486705 --- /dev/null +++ b/libc/misc/internals/.cvsignore @@ -0,0 +1 @@ +interp.c diff --git a/libc/misc/internals/Makefile b/libc/misc/internals/Makefile index 29ffdec7b..c81e02078 100644 --- a/libc/misc/internals/Makefile +++ b/libc/misc/internals/Makefile @@ -24,7 +24,7 @@ TOPDIR=../../../ include $(TOPDIR)Rules.mak -CSRC=ultostr.c ltostr.c __uClibc_main.c tempname.c +CSRC=ultostr.c ltostr.c __uClibc_main.c tempname.c errno.c __errno_location.c ifeq ($(HAS_FLOATING_POINT),true) CSRC += dtostr.c zoicheck.c endif diff --git a/libc/misc/internals/__errno_location.c b/libc/misc/internals/__errno_location.c new file mode 100644 index 000000000..10b97753f --- /dev/null +++ b/libc/misc/internals/__errno_location.c @@ -0,0 +1,8 @@ +#include +#undef errno + +int * weak_const_function __errno_location (void) +{ + return &errno; +} + diff --git a/libc/misc/internals/__uClibc_main.c b/libc/misc/internals/__uClibc_main.c index 299e1abdf..fd4e9552b 100644 --- a/libc/misc/internals/__uClibc_main.c +++ b/libc/misc/internals/__uClibc_main.c @@ -10,9 +10,13 @@ * avoided in the static library case. */ +#define _ERRNO_H #include #include -#include +//#include +#undef errno + +#define __set_errno(val) (*__errno_location ()) = (val) /* * Prototypes. @@ -29,13 +33,21 @@ void __uClibc_main(int argc, char **argv, char **envp) weak_alias(__environ, environ); extern void weak_function __init_stdio(void); extern void weak_function __stdio_flush_buffers(void); -extern void weak_function __pthread_initialize_minimal (void); +extern int *weak_function __errno_location (void); #else extern void __init_stdio(void); extern void __stdio_flush_buffers(void); -extern void __pthread_initialize_minimal (void); +extern int *__errno_location (void); #endif +/* + * Declare the __environ global variable and create a weak alias environ. + * Note: Apparently we must initialize __environ for the weak environ + * symbol to be included. + */ + +char **__environ = 0; + /* * Now for our main routine. @@ -48,11 +60,6 @@ void __uClibc_main(int argc, char **argv, char **envp) */ __environ = envp; - /* Initialize the thread library at least a bit so at least - * errno will be properly setup */ - if (__pthread_initialize_minimal) - __pthread_initialize_minimal (); - #if 0 /* Some security at this point. Prevent starting a SUID binary * where the standard file descriptors are not opened. We have @@ -81,14 +88,6 @@ void __uClibc_main(int argc, char **argv, char **envp) exit(main(argc, argv, envp)); } -/* - * Declare the __environ global variable and create a weak alias environ. - * Note: Apparently we must initialize __environ for the weak environ - * symbol to be included. - */ - -char **__environ = 0; - #ifndef HAVE_ELF /* * Define an empty function and use it as a weak alias for the stdio diff --git a/libc/misc/internals/errno.c b/libc/misc/internals/errno.c new file mode 100644 index 000000000..06978c430 --- /dev/null +++ b/libc/misc/internals/errno.c @@ -0,0 +1,29 @@ +#if 0 +#include +/* Unforunately, this produces noisy warnings... */ +int errno __attribute__ ((section (".bss"))); +int h_errno __attribute__ ((section (".bss"))); +weak_alias(errno, _errno); +weak_alias(h_errno, _h_errno); +#else +__asm__(" +.weak _errno; +_errno = errno +.weak _h_errno; +_h_errno = h_errno + +.bss +.globl errno +.type errno,%object +.size errno,4 +errno: + .space 4 + +.bss +.globl h_errno +.type h_errno,%object +.size h_errno,4 +h_errno: + .space 4 +"); +#endif -- cgit v1.2.3