41e5c94c56
Fix some static linking issues for Xtensa/Blackfin. Optimize the size for non-threaded static binaries and fix static C/C++ applications when running on the target. Fix noMMU madvise declarations. Signed-off-by: Waldemar Brodkorb <wbx@openadk.org> Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
84 lines
3.0 KiB
Diff
84 lines
3.0 KiB
Diff
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
|
|
|