[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

r6367 - in glibc-package/trunk/debian: . patches patches/hurd-i386



Author: sthibault
Date: 2015-02-28 23:37:34 +0000 (Sat, 28 Feb 2015)
New Revision: 6367

Added:
   glibc-package/trunk/debian/patches/hurd-i386/cvs-libpthread-dlopen.diff
Modified:
   glibc-package/trunk/debian/changelog
   glibc-package/trunk/debian/patches/series
Log:
* patches/hurd-i386/cvs-libpthread-dlopen.diff: New patch to allow
libpthread.so to be dynamically loaded from a dlopened library.


Modified: glibc-package/trunk/debian/changelog
===================================================================
--- glibc-package/trunk/debian/changelog	2015-02-22 12:05:26 UTC (rev 6366)
+++ glibc-package/trunk/debian/changelog	2015-02-28 23:37:34 UTC (rev 6367)
@@ -1,6 +1,8 @@
 glibc (2.19-16) UNRELEASED; urgency=medium
 
-  * 
+  [ Samuel Thibault ]
+  * patches/hurd-i386/cvs-libpthread-dlopen.diff: New patch to allow
+    libpthread.so to be dynamically loaded from a dlopened library.
 
  -- Aurelien Jarno <aurel32@debian.org>  Sun, 08 Feb 2015 17:21:50 +0100
 

Added: glibc-package/trunk/debian/patches/hurd-i386/cvs-libpthread-dlopen.diff
===================================================================
--- glibc-package/trunk/debian/patches/hurd-i386/cvs-libpthread-dlopen.diff	                        (rev 0)
+++ glibc-package/trunk/debian/patches/hurd-i386/cvs-libpthread-dlopen.diff	2015-02-28 23:37:34 UTC (rev 6367)
@@ -0,0 +1,103 @@
+commit 3410beff94994edf971dd634c56156d70c7cf215
+Author: Samuel Thibault <samuel.thibault@ens-lyon.org>
+Date:   Sat Feb 28 21:41:47 2015 +0100
+
+    Allow libpthread.so to dynamically loaded from a dlopened library
+    
+    * pthread/pt-internal.h: Include <ldsodefs.h>
+    (_dl_allocate_tls, _dl_deallocate_tls): Remove declarations.
+    * sysdeps/mach/hurd/pt-sysdep.c (init_routine): Rename into _init_routine,
+    add `stack' parameter, return if __pthread_threads is already initialized,
+    pass stack address to __pthread_create_internal if any.
+    (init_routine): New function, calls init_routine with 0
+    (dynamic_init_routine): New constructor function, calls init_routine with
+    __libc_stack_end.
+
+Index: glibc-2.19/libpthread/pthread/pt-internal.h
+===================================================================
+--- glibc-2.19.orig/libpthread/pthread/pt-internal.h
++++ glibc-2.19/libpthread/pthread/pt-internal.h
+@@ -35,6 +35,10 @@
+ #include <pt-sysdep.h>
+ #include <pt-machdep.h>
+ 
++#ifdef IS_IN_libpthread
++# include <ldsodefs.h>
++#endif
++
+ /* Thread state.  */
+ enum pthread_state
+ {
+@@ -323,17 +327,4 @@ const struct __pthread_rwlockattr __pthr
+ /* Default condition attributes.  */
+ const struct __pthread_condattr __pthread_default_condattr;
+ 
+-
+-#ifdef ENABLE_TLS
+-
+-/* From glibc.  */
+-
+-/* Dynamic linker TLS allocation.  */
+-extern void *_dl_allocate_tls(void *);
+-
+-/* Dynamic linker TLS deallocation.  */
+-extern void _dl_deallocate_tls(void *, int);
+-
+-#endif /* ENABLE_TLS */
+-
+ #endif /* pt-internal.h */
+Index: glibc-2.19/libpthread/sysdeps/mach/hurd/pt-sysdep.c
+===================================================================
+--- glibc-2.19.orig/libpthread/sysdeps/mach/hurd/pt-sysdep.c
++++ glibc-2.19/libpthread/sysdeps/mach/hurd/pt-sysdep.c
+@@ -39,16 +39,31 @@ void *(*_cthread_init_routine)(void) = &
+    should return a new stack pointer for the main thread.  The caller
+    will switch to this new stack before doing anything serious.  */
+ static void *
+-init_routine (void)
++_init_routine (void *stack)
+ {
+   struct __pthread *thread;
+   int err;
++  pthread_attr_t attr, *attrp = 0;
++
++  if (__pthread_threads)
++    /* Already initialized */
++    return 0;
+ 
+   /* Initialize the library.  */
+   __pthread_init ();
+ 
++  if (stack)
++    {
++      /* We are getting initialized due to dlopening a library using libpthread
++	 while the main program was not linked against libpthread.  */
++      /* Avoid allocating another stack */
++      attrp = &attr;
++      pthread_attr_init(attrp);
++      pthread_attr_setstack(attrp, __libc_stack_end, __vm_page_size);
++    }
++
+   /* Create the pthread structure for the main thread (i.e. us).  */
+-  err = __pthread_create_internal (&thread, 0, 0, 0);
++  err = __pthread_create_internal (&thread, attrp, 0, 0);
+   assert_perror (err);
+ 
+   /* XXX The caller copies the command line arguments and the environment
+@@ -68,3 +83,16 @@ init_routine (void)
+ 
+   return thread->mcontext.sp;
+ }
++
++static void *
++init_routine (void)
++{
++  return _init_routine (0);
++}
++
++#ifdef SHARED
++__attribute__ ((constructor)) static void dynamic_init_routine(void)
++{
++  _init_routine (__libc_stack_end);
++}
++#endif

Modified: glibc-package/trunk/debian/patches/series
===================================================================
--- glibc-package/trunk/debian/patches/series	2015-02-22 12:05:26 UTC (rev 6366)
+++ glibc-package/trunk/debian/patches/series	2015-02-28 23:37:34 UTC (rev 6367)
@@ -155,6 +155,7 @@
 hurd-i386/tg-WRLCK-upgrade.diff
 hurd-i386/cvs-static-dlopen.diff
 hurd-i386/tg-reboot-startup.diff
+hurd-i386/cvs-libpthread-dlopen.diff
 
 i386/local-biarch.diff
 i386/local-cmov.diff


Reply to: