[git commit nptl] nptl: fix dynamic initialization of libpthread
Timo Teräs
timo.teras at iki.fi
Wed Apr 14 17:58:30 UTC 2010
commit: http://git.uclibc.org/uClibc/commit/?id=cfa1d49e87eae4d46e0f0d568627b210383534f3
branch: http://git.uclibc.org/uClibc/commit/?id=refs/heads/nptl
If libpthread get's pulled in via dlopen(), we need to do libpthread
initialization in dlopen(). Achieve this by making initializer function
out of __pthread_initialize_minimal_internal. Add the proper linker
flags and make it callable multiple times.
Add also nodelete flag which ensures that libpthread will not get
unmapped after it's been loading. Though, ld.so does not yet
support this.
Signed-off-by: Timo Teräs <timo.teras at iki.fi>
Signed-off-by: Austin Foxley <austinf at cetoncorp.com>
---
libpthread/nptl/Makefile.in | 2 +-
libpthread/nptl/init.c | 6 ++++++
2 files changed, 7 insertions(+), 1 deletions(-)
diff --git a/libpthread/nptl/Makefile.in b/libpthread/nptl/Makefile.in
index d336565..1e9f98c 100644
--- a/libpthread/nptl/Makefile.in
+++ b/libpthread/nptl/Makefile.in
@@ -220,7 +220,7 @@ else
LDFLAGS-libpthread.so := $(LDFLAGS)
endif
-LDFLAGS-libpthread.so += $(top_builddir)lib/$(UCLIBC_LDSO_NAME)-$(VERSION).so $(top_builddir)lib/libdl-$(VERSION).so
+LDFLAGS-libpthread.so += $(top_builddir)lib/$(UCLIBC_LDSO_NAME)-$(VERSION).so $(top_builddir)lib/libdl-$(VERSION).so -Wl,-z,nodelete,-z,initfirst,-init=__pthread_initialize_minimal_internal
LIBS-libpthread.so := $(LIBS)
diff --git a/libpthread/nptl/init.c b/libpthread/nptl/init.c
index 44f2c86..b70de84 100644
--- a/libpthread/nptl/init.c
+++ b/libpthread/nptl/init.c
@@ -260,6 +260,12 @@ static bool __nptl_initial_report_events __attribute_used__;
void
__pthread_initialize_minimal_internal (void)
{
+ static int initialized = 0;
+
+ if (initialized)
+ return;
+ initialized = 1;
+
#ifndef SHARED
/* Unlike in the dynamically linked case the dynamic linker has not
taken care of initializing the TLS data structures. */
--
1.6.3.3
More information about the uClibc-cvs
mailing list