summaryrefslogtreecommitdiff
path: root/libc/misc
diff options
context:
space:
mode:
Diffstat (limited to 'libc/misc')
-rw-r--r--libc/misc/Makefile3
-rw-r--r--libc/misc/internals/.cvsignore1
-rw-r--r--libc/misc/internals/Makefile2
-rw-r--r--libc/misc/internals/__errno_location.c8
-rw-r--r--libc/misc/internals/__uClibc_main.c31
-rw-r--r--libc/misc/internals/errno.c29
-rw-r--r--libc/misc/pthread/Makefile49
-rw-r--r--libc/misc/pthread/no-tsd.c33
-rw-r--r--libc/misc/pthread/weaks.c107
9 files changed, 246 insertions, 17 deletions
diff --git a/libc/misc/Makefile b/libc/misc/Makefile
index cd562d643..6dc65dfab 100644
--- a/libc/misc/Makefile
+++ b/libc/misc/Makefile
@@ -30,6 +30,9 @@ DIRS = assert ctype dirent file fnmatch glob internals lsearch \
ifeq ($(strip $(INCLUDE_REGEX)),true)
DIRS += regex
endif
+ifeq ($(strip $(INCLUDE_THREADS)),true)
+DIRS += pthread
+endif
all: libc.a
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 <errno.h>
+#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 <stdlib.h>
#include <unistd.h>
-#include <errno.h>
+//#include <errno.h>
+#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 <features.h>
+/* 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
diff --git a/libc/misc/pthread/Makefile b/libc/misc/pthread/Makefile
new file mode 100644
index 000000000..8409789bf
--- /dev/null
+++ b/libc/misc/pthread/Makefile
@@ -0,0 +1,49 @@
+# Makefile for uClibc
+#
+# Copyright (C) 2002 Erik Andersen <andersen@uclibc.org>
+#
+# This program is free software; you can redistribute it and/or modify it under
+# the terms of the GNU Library General Public License as published by the Free
+# Software Foundation; either version 2 of the License, or (at your option) any
+# later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+# FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Library General Public License
+# along with this program; if not, write to the Free Software Foundation, Inc.,
+# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+TOPDIR=../../../
+include $(TOPDIR)Rules.mak
+
+PTDIR = $(TOPDIR)libpthread/linuxthreads/
+SYSDEPINC = -I$(PTDIR)sysdeps/unix/sysv/linux \
+ -I$(PTDIR)sysdeps/pthread \
+ -I$(PTDIR)sysdeps/unix/sysv \
+ -I$(PTDIR)sysdeps/unix/unix \
+ -I$(PTDIR)sysdeps/$(TARGET_ARCH) \
+ -I$(PTDIR)sysdeps \
+ -I$(TOPDIR)libc/sysdeps/linux/$(TARGET_ARCH)
+CFLAGS += $(SYSDEPINC) -D_GNU_SOURCE
+
+CSRC=no-tsd.c #weaks.c
+COBJS=$(patsubst %.c,%.o, $(CSRC))
+OBJS=$(COBJS)
+
+all: $(OBJS) $(LIBC)
+
+$(LIBC): ar-target
+
+ar-target: $(OBJS)
+ $(AR) $(ARFLAGS) $(LIBC) $(OBJS)
+
+$(COBJS): %.o : %.c
+ $(CC) $(CFLAGS) -c $< -o $@
+ $(STRIPTOOL) -x -R .note -R .comment $*.o
+
+clean:
+ rm -f *.[oa] *~ core
+
diff --git a/libc/misc/pthread/no-tsd.c b/libc/misc/pthread/no-tsd.c
new file mode 100644
index 000000000..ef79cb832
--- /dev/null
+++ b/libc/misc/pthread/no-tsd.c
@@ -0,0 +1,33 @@
+/* libc-internal interface for thread-specific data.
+ Copyright (C) 1998 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <bits/libc-tsd.h>
+
+/* This file provides uinitialized (common) definitions for the
+ hooks used internally by libc to access thread-specific data.
+
+ When -lpthread is used, it provides initialized definitions for these
+ variables (in specific.c), which override these uninitialized definitions.
+
+ If -lpthread is not used, these uninitialized variables default to zero,
+ which the __libc_tsd_* macros check for. */
+
+void *(*__libc_internal_tsd_get) __P ((enum __libc_tsd_key_t));
+int (*__libc_internal_tsd_set) __P ((enum __libc_tsd_key_t,
+ __const void *));
diff --git a/libc/misc/pthread/weaks.c b/libc/misc/pthread/weaks.c
new file mode 100644
index 000000000..e2019d0ba
--- /dev/null
+++ b/libc/misc/pthread/weaks.c
@@ -0,0 +1,107 @@
+/* The weak pthread functions for Linux.
+ Copyright (C) 1996, 1997, 1998 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with the GNU C Library; see the file COPYING.LIB. If not,
+ write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA. */
+
+#include <errno.h>
+#include <limits.h>
+#include <stdlib.h>
+
+extern int __pthread_return_0 __P ((void));
+extern int __pthread_return_1 __P ((void));
+extern void __pthread_return_void __P ((void));
+
+weak_alias (__pthread_return_0, pthread_attr_init)
+weak_alias (__pthread_return_0, pthread_attr_destroy)
+weak_alias (__pthread_return_0, pthread_attr_setdetachstate)
+weak_alias (__pthread_return_0, pthread_attr_getdetachstate)
+weak_alias (__pthread_return_0, pthread_attr_setschedparam)
+weak_alias (__pthread_return_0, pthread_attr_getschedparam)
+weak_alias (__pthread_return_0, pthread_attr_setschedpolicy)
+weak_alias (__pthread_return_0, pthread_attr_getschedpolicy)
+weak_alias (__pthread_return_0, pthread_attr_setinheritsched)
+weak_alias (__pthread_return_0, pthread_attr_getinheritsched)
+weak_alias (__pthread_return_0, pthread_attr_setscope)
+weak_alias (__pthread_return_0, pthread_attr_getscope)
+weak_alias (__pthread_return_0, pthread_attr_setstackaddr)
+weak_alias (__pthread_return_0, pthread_attr_getstackaddr)
+weak_alias (__pthread_return_0, pthread_attr_setstacksize)
+weak_alias (__pthread_return_0, pthread_attr_getstacksize)
+weak_alias (__pthread_return_0, pthread_mutex_init)
+weak_alias (__pthread_return_0, pthread_mutex_destroy)
+weak_alias (__pthread_return_0, pthread_mutex_lock)
+weak_alias (__pthread_return_0, pthread_mutex_trylock)
+weak_alias (__pthread_return_0, pthread_mutex_unlock)
+weak_alias (__pthread_return_0, pthread_mutexattr_init)
+weak_alias (__pthread_return_0, pthread_mutexattr_destroy)
+weak_alias (__pthread_return_0, pthread_mutexattr_settype)
+weak_alias (__pthread_return_0, pthread_mutexattr_gettype)
+weak_alias (__pthread_return_0, pthread_condattr_init)
+weak_alias (__pthread_return_0, pthread_condattr_destroy)
+weak_alias (__pthread_return_0, pthread_setschedparam)
+weak_alias (__pthread_return_0, pthread_getschedparam)
+weak_alias (__pthread_return_0, pthread_getcancelstate)
+weak_alias (__pthread_return_0, pthread_setcancelstate)
+weak_alias (__pthread_return_0, pthread_setcanceltype)
+weak_alias (__pthread_return_0, pthread_setconcurrency)
+weak_alias (__pthread_return_0, pthread_getconcurrency)
+weak_alias (__pthread_return_0, pthread_self)
+weak_alias (__pthread_return_0, pthread_cond_init)
+weak_alias (__pthread_return_0, pthread_cond_destroy)
+weak_alias (__pthread_return_0, pthread_cond_wait)
+weak_alias (__pthread_return_0, pthread_cond_timedwait)
+weak_alias (__pthread_return_0, pthread_cond_signal)
+weak_alias (__pthread_return_0, pthread_cond_broadcast)
+weak_alias (__pthread_return_0, pthread_rwlock_init)
+weak_alias (__pthread_return_0, pthread_rwlock_destroy)
+weak_alias (__pthread_return_0, pthread_rwlock_rdlock)
+weak_alias (__pthread_return_0, pthread_rwlock_wrlock)
+weak_alias (__pthread_return_0, pthread_rwlock_tryrdlock)
+weak_alias (__pthread_return_0, pthread_rwlock_trywrlock)
+weak_alias (__pthread_return_0, pthread_rwlock_unlock)
+weak_alias (__pthread_return_0, pthread_rwlockattr_init)
+weak_alias (__pthread_return_0, pthread_rwlockattr_destroy)
+weak_alias (__pthread_return_0, pthread_rwlockattr_setpshared)
+weak_alias (__pthread_return_0, pthread_rwlockattr_getpshared)
+
+
+/* Those are pthread functions which return 1 if successful. */
+weak_alias (__pthread_return_1, pthread_equal)
+
+/* pthread_exit () is a special case. */
+void weak_function
+pthread_exit (void *retval)
+{
+ exit (EXIT_SUCCESS);
+}
+
+int
+__pthread_return_0 (void)
+{
+ return 0;
+}
+
+int
+__pthread_return_1 (void)
+{
+ return 1;
+}
+
+void
+__pthread_return_void (void)
+{
+}