* elf/dl-load.c (_dl_init_paths): Don't use strdupa in function
[kopensolaris-gnu/glibc.git] / elf / soinit.c
index 0c3f5b3..42e6cf1 100644 (file)
@@ -3,6 +3,12 @@
    the `.ctors' and `.dtors' sections so the lists are terminated, and
    calling those lists of functions.  */
 
+#include <libc-internal.h>
+
+#ifdef HAVE_DWARF2_UNWIND_INFO_STATIC
+# include <gccframe.h>
+#endif
+
 static void (*const __CTOR_LIST__[1]) (void)
      __attribute__ ((section (".ctors")))
      = { (void (*) (void)) -1 };
@@ -18,21 +24,42 @@ run_hooks (void (*const list[]) (void))
 }
 
 #ifdef HAVE_DWARF2_UNWIND_INFO
-static const char __EH_FRAME_BEGIN__[]
+static char __EH_FRAME_BEGIN__[]
      __attribute__ ((section (".eh_frame")))
      = { };
+# ifdef HAVE_DWARF2_UNWIND_INFO_STATIC
+extern void __register_frame_info (const void *, struct object *);
+extern void __deregister_frame_info (const void *);
+# else
 extern void __register_frame (const void *);
 extern void __deregister_frame (const void *);
+# endif
 #endif
 
+/* We have to initialize the thread library at least if bit.  */
+extern void __pthread_initialize_minimal (void) __attribute__ ((weak));
+
 /* This function will be called from _init in init-first.c.  */
 void
 __libc_global_ctors (void)
 {
   /* Call constructor functions.  */
   run_hooks (__CTOR_LIST__);
+
+  /* Initialize the thread library at least a bit since the libgcc functions
+     are using thread functions if these are available.  */
+  if (__pthread_initialize_minimal)
+    __pthread_initialize_minimal ();
+
 #ifdef HAVE_DWARF2_UNWIND_INFO
+# ifdef HAVE_DWARF2_UNWIND_INFO_STATIC
+  {
+    static struct object ob;
+    __register_frame_info (__EH_FRAME_BEGIN__, &ob);
+  }
+# else
   __register_frame (__EH_FRAME_BEGIN__);
+# endif
 #endif
 }
 
@@ -46,6 +73,10 @@ _fini (void)
   /* Call destructor functions.  */
   run_hooks (__DTOR_LIST__);
 #ifdef HAVE_DWARF2_UNWIND_INFO
+# ifdef HAVE_DWARF2_UNWIND_INFO_STATIC
+  __deregister_frame_info (__EH_FRAME_BEGIN__);
+# else
   __deregister_frame (__EH_FRAME_BEGIN__);
+# endif
 #endif
 }