summaryrefslogtreecommitdiffstats
path: root/lib/libthr
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2006-01-10 04:53:03 +0000
committerdavidxu <davidxu@FreeBSD.org>2006-01-10 04:53:03 +0000
commit1218aa562705d6bca13ef113ee55d30b3a1d62ea (patch)
treef7d7ddab57a2b5cc1834f38301277565fc1854d4 /lib/libthr
parentacd73492834881ccf1de79cea2721f1140446bbc (diff)
downloadFreeBSD-src-1218aa562705d6bca13ef113ee55d30b3a1d62ea.zip
FreeBSD-src-1218aa562705d6bca13ef113ee55d30b3a1d62ea.tar.gz
Use macro STATIC_LIB_REQUIRE to declare a symbol should be linked into
static binary.
Diffstat (limited to 'lib/libthr')
-rw-r--r--lib/libthr/thread/thr_init.c163
-rw-r--r--lib/libthr/thread/thr_private.h6
2 files changed, 74 insertions, 95 deletions
diff --git a/lib/libthr/thread/thr_init.c b/lib/libthr/thread/thr_init.c
index 0362d1b..a7ff4fc 100644
--- a/lib/libthr/thread/thr_init.c
+++ b/lib/libthr/thread/thr_init.c
@@ -33,36 +33,22 @@
* $FreeBSD$
*/
-/* Allocate space for global thread variables here: */
-#define GLOBAL_PTHREAD_PRIVATE
-
#include "namespace.h"
-#include <sys/param.h>
#include <sys/types.h>
#include <sys/signalvar.h>
-#include <machine/reg.h>
-
#include <sys/ioctl.h>
-#include <sys/mount.h>
-#include <sys/uio.h>
-#include <sys/socket.h>
-#include <sys/event.h>
-#include <sys/stat.h>
#include <sys/sysctl.h>
-#include <sys/time.h>
#include <sys/ttycom.h>
-#include <sys/wait.h>
#include <sys/mman.h>
-#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <paths.h>
#include <pthread.h>
#include <pthread_np.h>
#include <signal.h>
-#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <time.h>
#include <unistd.h>
#include "un-namespace.h"
@@ -133,62 +119,59 @@ static void init_main_thread(struct pthread *thread);
* All weak references used within libc should be in this table.
* This is so that static libraries will work.
*/
-static void *references[] = {
- &_accept,
- &_bind,
- &_close,
- &_connect,
- &_dup,
- &_dup2,
- &_execve,
- &_fcntl,
- &_flock,
- &_flockfile,
- &_fstat,
- &_fstatfs,
- &_fsync,
- &_funlockfile,
- &_getdirentries,
- &_getlogin,
- &_getpeername,
- &_getsockname,
- &_getsockopt,
- &_ioctl,
- &_kevent,
- &_listen,
- &_nanosleep,
- &_open,
- &_pthread_getspecific,
- &_pthread_key_create,
- &_pthread_key_delete,
- &_pthread_mutex_destroy,
- &_pthread_mutex_init,
- &_pthread_mutex_lock,
- &_pthread_mutex_trylock,
- &_pthread_mutex_unlock,
- &_pthread_mutexattr_init,
- &_pthread_mutexattr_destroy,
- &_pthread_mutexattr_settype,
- &_pthread_once,
- &_pthread_setspecific,
- &_read,
- &_readv,
- &_recvfrom,
- &_recvmsg,
- &_select,
- &_sendmsg,
- &_sendto,
- &_setsockopt,
- &_sigaction,
- &_sigprocmask,
- &_sigsuspend,
- &_socket,
- &_socketpair,
- &_thread_init_hack,
- &_wait4,
- &_write,
- &_writev
-};
+STATIC_LIB_REQUIRE(_accept);
+STATIC_LIB_REQUIRE(_bind);
+STATIC_LIB_REQUIRE(_close);
+STATIC_LIB_REQUIRE(_connect);
+STATIC_LIB_REQUIRE(_dup);
+STATIC_LIB_REQUIRE(_dup2);
+STATIC_LIB_REQUIRE(_execve);
+STATIC_LIB_REQUIRE(_fcntl);
+STATIC_LIB_REQUIRE(_flock);
+STATIC_LIB_REQUIRE(_flockfile);
+STATIC_LIB_REQUIRE(_fstat);
+STATIC_LIB_REQUIRE(_fstatfs);
+STATIC_LIB_REQUIRE(_fsync);
+STATIC_LIB_REQUIRE(_getdirentries);
+STATIC_LIB_REQUIRE(_getlogin);
+STATIC_LIB_REQUIRE(_getpeername);
+STATIC_LIB_REQUIRE(_getsockname);
+STATIC_LIB_REQUIRE(_getsockopt);
+STATIC_LIB_REQUIRE(_ioctl);
+STATIC_LIB_REQUIRE(_kevent);
+STATIC_LIB_REQUIRE(_listen);
+STATIC_LIB_REQUIRE(_nanosleep);
+STATIC_LIB_REQUIRE(_open);
+STATIC_LIB_REQUIRE(_pthread_getspecific);
+STATIC_LIB_REQUIRE(_pthread_key_create);
+STATIC_LIB_REQUIRE(_pthread_key_delete);
+STATIC_LIB_REQUIRE(_pthread_mutex_destroy);
+STATIC_LIB_REQUIRE(_pthread_mutex_init);
+STATIC_LIB_REQUIRE(_pthread_mutex_lock);
+STATIC_LIB_REQUIRE(_pthread_mutex_trylock);
+STATIC_LIB_REQUIRE(_pthread_mutex_unlock);
+STATIC_LIB_REQUIRE(_pthread_mutexattr_init);
+STATIC_LIB_REQUIRE(_pthread_mutexattr_destroy);
+STATIC_LIB_REQUIRE(_pthread_mutexattr_settype);
+STATIC_LIB_REQUIRE(_pthread_once);
+STATIC_LIB_REQUIRE(_pthread_setspecific);
+STATIC_LIB_REQUIRE(_read);
+STATIC_LIB_REQUIRE(_readv);
+STATIC_LIB_REQUIRE(_recvfrom);
+STATIC_LIB_REQUIRE(_recvmsg);
+STATIC_LIB_REQUIRE(_select);
+STATIC_LIB_REQUIRE(_sendmsg);
+STATIC_LIB_REQUIRE(_sendto);
+STATIC_LIB_REQUIRE(_setsockopt);
+STATIC_LIB_REQUIRE(_sigaction);
+STATIC_LIB_REQUIRE(_sigprocmask);
+STATIC_LIB_REQUIRE(_sigsuspend);
+STATIC_LIB_REQUIRE(_socket);
+STATIC_LIB_REQUIRE(_socketpair);
+STATIC_LIB_REQUIRE(_thread_init_hack);
+STATIC_LIB_REQUIRE(_wait4);
+STATIC_LIB_REQUIRE(_write);
+STATIC_LIB_REQUIRE(_writev);
/*
* These are needed when linking statically. All references within
@@ -196,19 +179,20 @@ static void *references[] = {
* if they are not (strongly) referenced by the application or other
* libraries, then the actual functions will not be loaded.
*/
-static void *libgcc_references[] = {
- &_pthread_once,
- &_pthread_key_create,
- &_pthread_key_delete,
- &_pthread_getspecific,
- &_pthread_setspecific,
- &_pthread_mutex_init,
- &_pthread_mutex_destroy,
- &_pthread_mutex_lock,
- &_pthread_mutex_trylock,
- &_pthread_mutex_unlock,
- &_pthread_create
-};
+STATIC_LIB_REQUIRE(_pthread_once);
+STATIC_LIB_REQUIRE(_pthread_key_create);
+STATIC_LIB_REQUIRE(_pthread_key_delete);
+STATIC_LIB_REQUIRE(_pthread_getspecific);
+STATIC_LIB_REQUIRE(_pthread_setspecific);
+STATIC_LIB_REQUIRE(_pthread_mutex_init);
+STATIC_LIB_REQUIRE(_pthread_mutex_destroy);
+STATIC_LIB_REQUIRE(_pthread_mutex_lock);
+STATIC_LIB_REQUIRE(_pthread_mutex_trylock);
+STATIC_LIB_REQUIRE(_pthread_mutex_unlock);
+STATIC_LIB_REQUIRE(_pthread_create);
+
+/* Pull in all symbols required by libthread_db */
+STATIC_LIB_REQUIRE(_thread_state_running);
#define DUAL_ENTRY(entry) \
(pthread_func_t)entry, (pthread_func_t)entry
@@ -247,7 +231,6 @@ static pthread_func_t jmp_table[][2] = {
{DUAL_ENTRY(_pthread_sigmask)} /* PJT_SIGMASK */
};
-extern int _thread_state_running;
static int init_once = 0;
/*
@@ -294,16 +277,6 @@ _libpthread_init(struct pthread *curthread)
return;
/*
- * Make gcc quiescent about {,libgcc_}references not being
- * referenced:
- */
- if ((references[0] == NULL) || (libgcc_references[0] == NULL))
- PANIC("Failed loading mandatory references in _thread_init");
-
- /* Pull debug symbols in for static binary */
- _thread_state_running = PS_RUNNING;
-
- /*
* Check the size of the jump table to make sure it is preset
* with the correct number of entries.
*/
diff --git a/lib/libthr/thread/thr_private.h b/lib/libthr/thread/thr_private.h
index 653ae31..bf10228 100644
--- a/lib/libthr/thread/thr_private.h
+++ b/lib/libthr/thread/thr_private.h
@@ -83,6 +83,12 @@ typedef TAILQ_HEAD(atfork_head, pthread_atfork) atfork_head;
#define THR_ASSERT(cond, msg)
#endif
+#ifdef PIC
+# define STATIC_LIB_REQUIRE(name)
+#else
+# define STATIC_LIB_REQUIRE(name) __asm (".globl " #name)
+#endif
+
#define TIMESPEC_ADD(dst, src, val) \
do { \
(dst)->tv_sec = (src)->tv_sec + (val)->tv_sec; \
OpenPOWER on IntegriCloud