Mark libs with nodlopen when using initial-exec TLS
PATCH 1/1 Mark libs with nodlopen when using initial-exec TLS
Some naive optimist once claim that the dynamic linker would detect if we try to dlopen some Xenomai lib (directly or indirectly) which uses the optimised initial-exec TLS variables. He was wrong of course. It takes the special marker nodlopen to achieve this, and that's what the patch below does when and where required.
Jan
--- ChangeLog | 3 +++ configure.in | 3 +++ src/skins/native/Makefile.am | 2 +- src/skins/posix/Makefile.am | 2 +- src/skins/psos+/Makefile.am | 2 +- src/skins/rtai/Makefile.am | 2 +- src/skins/rtdm/Makefile.am | 2 +- src/skins/uitron/Makefile.am | 2 +- src/skins/vrtx/Makefile.am | 2 +- src/skins/vxworks/Makefile.am | 2 +- 10 files changed, 14 insertions(+), 8 deletions(-)
configure.in +3 -0
@@ -762,6 +762,7 @@ LIBS="$LIBS -lrt" AC_CHECK_FUNCS([shm_open shm_unlink]) LIBS="$save_LIBS" +XENO_DLOPEN_CONSTRAINT= AC_ARG_WITH([__thread], AC_HELP_STRING([--without-__thread], [do not use TLS features (allows for dlopen'ing Xenomai libs)]),
@@ -782,6 +783,7 @@ EOF rm -f conftest*]) if test "$libc_cv_gcc___thread" = yes; then AC_DEFINE(HAVE___THREAD,1,[config]) + XENO_DLOPEN_CONSTRAINT="-Wl,-z -Wl,nodlopen" fi fi
@@ -803,6 +805,7 @@ AC_SUBST(XENO_USER_CFLAGS) AC_SUBST(XENO_USER_LDFLAGS) AC_SUBST(XENO_USER_APP_CFLAGS) AC_SUBST(XENO_USER_APP_LDFLAGS) +AC_SUBST(XENO_DLOPEN_CONSTRAINT) AC_SUBST([CONFIG_STATUS_DEPENDENCIES], ['$(top_srcdir)/src/skins/posix/posix.wrappers']) AC_SUBST(XENO_POSIX_WRAPPERS)
src/skins/native/Makefile.am +1 -1
@@ -1,6 +1,6 @@ lib_LTLIBRARIES = libnative.la -libnative_la_LDFLAGS = -version-info 3:0:0 -lpthread +libnative_la_LDFLAGS = @XENO_DLOPEN_CONSTRAINT@ -version-info 3:0:0 -lpthread libnative_la_SOURCES = \ alarm.c \
src/skins/posix/Makefile.am +1 -1
@@ -4,7 +4,7 @@ lib_LTLIBRARIES = libpthread_rt.la CPPFLAGS+=-I$(top_srcdir)/ksrc/skins -libpthread_rt_la_LDFLAGS = -version-info 1:0:0 -lpthread +libpthread_rt_la_LDFLAGS = @XENO_DLOPEN_CONSTRAINT@ -version-info 1:0:0 -lpthread libpthread_rt_la_SOURCES = \ init.c \
src/skins/psos+/Makefile.am +1 -1
@@ -1,6 +1,6 @@ lib_LTLIBRARIES = libpsos.la -libpsos_la_LDFLAGS = -version-info 0:0:0 -lpthread +libpsos_la_LDFLAGS = @XENO_DLOPEN_CONSTRAINT@ -version-info 0:0:0 -lpthread libpsos_la_SOURCES = \ asr.c \
src/skins/rtai/Makefile.am +1 -1
@@ -1,6 +1,6 @@ lib_LTLIBRARIES = librtai.la -librtai_la_LDFLAGS = -version-info 0:0:0 +librtai_la_LDFLAGS = @XENO_DLOPEN_CONSTRAINT@ -version-info 0:0:0 librtai_la_SOURCES = init.c \ shm.c
src/skins/rtdm/Makefile.am +1 -1
@@ -1,6 +1,6 @@ lib_LTLIBRARIES = librtdm.la -librtdm_la_LDFLAGS = -version-info 1:0:0 -lpthread +librtdm_la_LDFLAGS = @XENO_DLOPEN_CONSTRAINT@ -version-info 1:0:0 -lpthread librtdm_la_SOURCES = \ core.c \
src/skins/uitron/Makefile.am +1 -1
@@ -1,6 +1,6 @@ lib_LTLIBRARIES = libuitron.la -libuitron_la_LDFLAGS = -version-info 0:0:0 -lpthread +libuitron_la_LDFLAGS = @XENO_DLOPEN_CONSTRAINT@ -version-info 0:0:0 -lpthread libuitron_la_SOURCES = \ flag.c \
src/skins/vrtx/Makefile.am +1 -1
@@ -1,6 +1,6 @@ lib_LTLIBRARIES = libvrtx.la -libvrtx_la_LDFLAGS = -version-info 0:0:0 -lpthread +libvrtx_la_LDFLAGS = @XENO_DLOPEN_CONSTRAINT@ -version-info 0:0:0 -lpthread libvrtx_la_SOURCES = \ event.c \
src/skins/vxworks/Makefile.am +1 -1
@@ -1,6 +1,6 @@ lib_LTLIBRARIES = libvxworks.la -libvxworks_la_LDFLAGS = -version-info 1:0:0 -lpthread +libvxworks_la_LDFLAGS = @XENO_DLOPEN_CONSTRAINT@ -version-info 1:0:0 -lpthread libvxworks_la_SOURCES = \ errnoLib.c \
ChangeLog +3 -0
@@ -1,5 +1,8 @@ 2008-11-21 Jan Kiszka <[email protected]> + * configure.in, src/skins/*/Makefile.am: Mark libs with nodlopen + if initial-exec __thread variables are used. + * ksrc/nucleus/shadow.c (xnshadow_map): Reject already mapped tasks with -EBUSY.
Signature · 2 lines
Siemens AG, Corporate Technology, CT SE 2 ES-OS Corporate Competence Center Embedded Linux
Quoted 5 lines · Jan Kiszka
Some naive optimist once claim that the dynamic linker would detect if we try to dlopen some Xenomai lib (directly or indirectly) which uses the optimised initial-exec TLS variables. He was wrong of course. It takes the special marker nodlopen to achieve this, and that's what the patch below does when and where required.
Ok. But I think we should document somewhere the fact that dlopening Xenomai libs will not work because of __thread.
Signature · 1 line
Gilles.
Quoted 9 lines · Gilles Chanteperdrix
Quoted 5 lines · Jan Kiszka
Some naive optimist once claim that the dynamic linker would detect if we try to dlopen some Xenomai lib (directly or indirectly) which uses the optimised initial-exec TLS variables. He was wrong of course. It takes the special marker nodlopen to achieve this, and that's what the patch below does when and where required.
Ok. But I think we should document somewhere the fact that dlopening Xenomai libs will not work because of
__thread.
There will be a follow-up on this soon, because dlopen causes more problems, namely to the POSIX skin.
Jan
Signature · 2 lines
Siemens AG, Corporate Technology, CT SE 2 ES-OS Corporate Competence Center Embedded Linux