[git commit master] static build: fix internal locking weaks to get pulled in always

Austin Foxley austinf at cetoncorp.com
Fri May 7 15:27:39 UTC 2010


commit: http://git.uclibc.org/uClibc/commit/?id=685a6f283e98657104b71a7d694c99f19e454afa
branch: http://git.uclibc.org/uClibc/commit/?id=refs/heads/master

Linker is smart and does not pull in weaks.os, ever. This happens
because that compilation unit does not get strong references and
ld eliminates dead code. We really need the weaks for static build
in a compilation unit that is always there, otherwise it won't work.

Signed-off-by: Timo Teras <timo.teras at iki.fi>
Acked-by: Roman I Khimov <khimov at altell.ru>
Signed-off-by: Austin Foxley <austinf at cetoncorp.com>
---
 libc/misc/internals/__uClibc_main.c |   35 ++++++++++++++++++++++++++++++
 libc/misc/pthread/Makefile.in       |    1 -
 libc/misc/pthread/weaks.c           |   40 -----------------------------------
 3 files changed, 35 insertions(+), 41 deletions(-)
 delete mode 100644 libc/misc/pthread/weaks.c

diff --git a/libc/misc/internals/__uClibc_main.c b/libc/misc/internals/__uClibc_main.c
index f7e45c6..f9e1244 100644
--- a/libc/misc/internals/__uClibc_main.c
+++ b/libc/misc/internals/__uClibc_main.c
@@ -68,6 +68,41 @@ uintptr_t __guard attribute_relro;
  */
 
 void internal_function _dl_aux_init (ElfW(auxv_t) *av);
+
+/*
+ * uClibc internal locking requires that we have weak aliases
+ * for dummy functions in case libpthread.a is not linked in.
+ * This needs to be in compilation unit that is pulled always
+ * in or linker will disregard these weaks.
+ */
+
+static int __pthread_return_0 (pthread_mutex_t *unused) { return 0; }
+weak_alias (__pthread_return_0, __pthread_mutex_lock)
+weak_alias (__pthread_return_0, __pthread_mutex_trylock)
+weak_alias (__pthread_return_0, __pthread_mutex_unlock)
+
+int weak_function
+__pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr)
+{
+        return 0;
+}
+
+void weak_function
+_pthread_cleanup_push_defer(struct _pthread_cleanup_buffer *__buffer,
+                            void (*__routine) (void *), void *__arg)
+{
+        __buffer->__routine = __routine;
+        __buffer->__arg = __arg;
+}
+
+void weak_function
+_pthread_cleanup_pop_restore(struct _pthread_cleanup_buffer *__buffer,
+                             int __execute)
+{
+        if (__execute)
+                __buffer->__routine(__buffer->__arg);
+}
+
 #endif /* !SHARED */
 
 /*
diff --git a/libc/misc/pthread/Makefile.in b/libc/misc/pthread/Makefile.in
index 69cdf10..2f436ac 100644
--- a/libc/misc/pthread/Makefile.in
+++ b/libc/misc/pthread/Makefile.in
@@ -11,7 +11,6 @@ MISC_PTHREAD_DIR := $(top_srcdir)libc/misc/pthread
 MISC_PTHREAD_OUT := $(top_builddir)libc/misc/pthread
 
 libc-shared-$(UCLIBC_HAS_TLS) += $(MISC_PTHREAD_OUT)/tsd.os
-libc-static-$(UCLIBC_HAS_THREADS) += $(MISC_PTHREAD_OUT)/weaks.o
 
 objclean-y += CLEAN_libc/misc/pthread
 
diff --git a/libc/misc/pthread/weaks.c b/libc/misc/pthread/weaks.c
deleted file mode 100644
index fb1d85f..0000000
--- a/libc/misc/pthread/weaks.c
+++ /dev/null
@@ -1,40 +0,0 @@
-/* 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 <libc-internal.h>
-
-/* Weaks for internal library use only.
- *
- * We need to define weaks here to cover all the pthread functions that
- * libc itself will use so that we aren't forced to link libc against
- * libpthread.  This file is only used in libc.a and since we have
- * weaks here, they will be automatically overridden by libpthread.a
- * if it gets linked in.
- */
-
-static int __pthread_return_0 (void) { return 0; }
-static void __pthread_return_void (void) { return; }
-
-weak_alias (__pthread_return_0, __pthread_mutex_init)
-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_void, _pthread_cleanup_push_defer)
-weak_alias (__pthread_return_void, _pthread_cleanup_pop_restore)
-
-- 
1.6.3.3



More information about the uClibc-cvs mailing list