summaryrefslogtreecommitdiffstats
path: root/package/uclibc/0006-threads-optimize-single-threaded-applications.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/uclibc/0006-threads-optimize-single-threaded-applications.patch')
-rw-r--r--package/uclibc/0006-threads-optimize-single-threaded-applications.patch83
1 files changed, 83 insertions, 0 deletions
diff --git a/package/uclibc/0006-threads-optimize-single-threaded-applications.patch b/package/uclibc/0006-threads-optimize-single-threaded-applications.patch
new file mode 100644
index 0000000000..2983820b0f
--- /dev/null
+++ b/package/uclibc/0006-threads-optimize-single-threaded-applications.patch
@@ -0,0 +1,83 @@
+From 5ca03df6978345c297225212cc0ca33d476b0272 Mon Sep 17 00:00:00 2001
+From: Waldemar Brodkorb <wbx@openadk.org>
+Date: Wed, 7 Dec 2016 07:56:44 +0100
+Subject: [PATCH] threads: optimize single threaded applications
+
+Revert the removal of the weak pthread functions and
+guarantee a link order so that single threaded applications
+doesn't link in all the pthread functions they don't use.
+
+Signed-off-by: Max Filippov <jcmvbkbc@gmail.com>
+Tested-by: Waldemar Brodkorb <wbx@uclibc-ng.org>
+Signed-off-by: Waldemar Brodkorb <wbx@openadk.org>
+---
+ libc/misc/internals/Makefile.in | 4 +++-
+ libc/misc/internals/__uClibc_main.c | 37 +++++++++++++++++++++++++++++++++++++
+ 2 files changed, 40 insertions(+), 1 deletion(-)
+
+diff --git a/libc/misc/internals/Makefile.in b/libc/misc/internals/Makefile.in
+index ae094ee..ce7f75a 100644
+--- a/libc/misc/internals/Makefile.in
++++ b/libc/misc/internals/Makefile.in
+@@ -25,7 +25,9 @@ libc-shared-y += $(MISC_INTERNALS_OUT)/__uClibc_main.oS
+ else
+ libc-shared-y += $(MISC_INTERNALS_OUT)/__uClibc_main.os
+ endif
+-libc-static-y += $(MISC_INTERNALS_OUT)/__uClibc_main.o
++# link order is important to not pull in pthread functions, when
++# a single threaded application is statically linked
++libc-static-y := $(MISC_INTERNALS_OUT)/__uClibc_main.o $(libc-static-y)
+ libc-static-$(UCLIBC_FORMAT_FLAT_SEP_DATA) += \
+ $(MISC_INTERNALS_OUT)/shared_flat_initfini.o \
+ $(MISC_INTERNALS_OUT)/shared_flat_add_library.o
+diff --git a/libc/misc/internals/__uClibc_main.c b/libc/misc/internals/__uClibc_main.c
+index 46e24d8..d80565e 100644
+--- a/libc/misc/internals/__uClibc_main.c
++++ b/libc/misc/internals/__uClibc_main.c
+@@ -68,6 +68,43 @@ uintptr_t __stack_chk_guard attribute_relro;
+
+ void internal_function _dl_aux_init (ElfW(auxv_t) *av);
+
++#ifdef __UCLIBC_HAS_THREADS__
++/*
++ * uClibc internal locking requires that we have weak aliases
++ * for dummy functions in case a single threaded application is linked.
++ * 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 /* __UCLIBC_HAS_THREADS__ */
++
+ #endif /* !SHARED */
+
+ /* Defeat compiler optimization which assumes function addresses are never NULL */
+--
+2.1.4
+
OpenPOWER on IntegriCloud