diff options
author | Waldemar Brodkorb <wbx@openadk.org> | 2016-12-07 07:56:44 +0100 |
---|---|---|
committer | Waldemar Brodkorb <wbx@openadk.org> | 2016-12-10 15:14:33 +0100 |
commit | 5ca03df6978345c297225212cc0ca33d476b0272 (patch) | |
tree | 873ea7e2b6d2202dd01bf27be9d5b3b5ab24c7a2 | |
parent | 6579597083e608f5a66fe8a898d113c2588e2c8f (diff) |
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>
-rw-r--r-- | libc/misc/internals/Makefile.in | 4 | ||||
-rw-r--r-- | libc/misc/internals/__uClibc_main.c | 37 |
2 files changed, 40 insertions, 1 deletions
diff --git a/libc/misc/internals/Makefile.in b/libc/misc/internals/Makefile.in index ae094ee23..ce7f75af5 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 46e24d891..d80565e2c 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 */ |