[BZ #786]
authorUlrich Drepper <drepper@redhat.com>
Sun, 20 Mar 2005 22:25:59 +0000 (22:25 +0000)
committerUlrich Drepper <drepper@redhat.com>
Sun, 20 Mar 2005 22:25:59 +0000 (22:25 +0000)
2005-03-15  Jakub Jelinek  <jakub@redhat.com>
[BZ #786]
* sysdeps/generic/dl-tls.c (_dl_next_tls_modid): Handle
GL(dl_tls_static_nelem) == GL(dl_tls_max_dtv_idx).
* elf/Makefile: Add rules to build and run tst-tls15.
* elf/tst-tls15.c: New test.
* elf/tst-tlsmod15a.c: New file.
* elf/tst-tlsmod15b.c: New file.

2005-03-20  Ulrich Drepper  <drepper@redhat.com>

* elf/rtld.c (dl_main): Always call init_tls if we have audit modules.

ChangeLog
elf/Makefile
elf/rtld.c
elf/tst-tls15.c [new file with mode: 0644]
elf/tst-tlsmod15a.c [new file with mode: 0644]
elf/tst-tlsmod15b.c [new file with mode: 0644]
sysdeps/generic/dl-tls.c

index e294936..cf1ec5f 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2005-03-15  Jakub Jelinek  <jakub@redhat.com>
+
+       [BZ #786]
+       * sysdeps/generic/dl-tls.c (_dl_next_tls_modid): Handle
+       GL(dl_tls_static_nelem) == GL(dl_tls_max_dtv_idx).
+       * elf/Makefile: Add rules to build and run tst-tls15.
+       * elf/tst-tls15.c: New test.
+       * elf/tst-tlsmod15a.c: New file.
+       * elf/tst-tlsmod15b.c: New file.
+
+2005-03-20  Ulrich Drepper  <drepper@redhat.com>
+
+       * elf/rtld.c (dl_main): Always call init_tls if we have audit modules.
+
 2005-03-20  Alfred M. Szmidt  <ams@gnu.org>
 
        * elf/dl-open.c (dl_open_worker): Fix typo.
index 80a3f6c..c034b2b 100644 (file)
@@ -159,7 +159,7 @@ tests += loadtest restest1 preloadtest loadfail multiload origtest resolvfail \
         neededtest3 neededtest4 unload2 lateglobal initfirst global \
         restest2 next dblload dblunload reldep5 reldep6 reldep7 reldep8 \
         circleload1 tst-tls3 tst-tls4 tst-tls5 tst-tls6 tst-tls7 tst-tls8 \
-        tst-tls10 tst-tls11 tst-tls12 tst-tls13 tst-tls14 tst-align \
+        tst-tls10 tst-tls11 tst-tls12 tst-tls13 tst-tls14 tst-tls15 tst-align \
         tst-align2 $(tests-execstack-$(have-z-execstack)) tst-dlmodcount \
         tst-dlopenrpath tst-deep1 tst-dlmopen1 tst-dlmopen2 tst-dlmopen3 \
         unload3 unload4 unload5 tst-audit1 tst-global1 order2
@@ -190,6 +190,7 @@ modules-names = testobj1 testobj2 testobj3 testobj4 testobj5 testobj6 \
                tst-tlsmod5 tst-tlsmod6 tst-tlsmod7 tst-tlsmod8 \
                tst-tlsmod9 tst-tlsmod10 tst-tlsmod11 tst-tlsmod12 \
                tst-tlsmod13 tst-tlsmod13a tst-tlsmod14a tst-tlsmod14b \
+               tst-tlsmod15a tst-tlsmod15b \
                circlemod1 circlemod1a circlemod2 circlemod2a \
                circlemod3 circlemod3a \
                reldep8mod1 reldep8mod2 reldep8mod3 \
@@ -471,6 +472,7 @@ tst-tlsmod10.so-no-z-defs = yes
 tst-tlsmod12.so-no-z-defs = yes
 tst-tlsmod14a.so-no-z-defs = yes
 tst-tlsmod14b.so-no-z-defs = yes
+tst-tlsmod15a.so-no-z-defs = yes
 circlemod2.so-no-z-defs = yes
 circlemod3.so-no-z-defs = yes
 circlemod3a.so-no-z-defs = yes
@@ -683,8 +685,11 @@ $(objpfx)tst-tls12: $(objpfx)tst-tlsmod12.so
 $(objpfx)tst-tls13: $(libdl)
 $(objpfx)tst-tls13.out: $(objpfx)tst-tlsmod13a.so
 
-$(objpfx)tst-tls14:  $(objpfx)tst-tlsmod14a.so $(libdl)
-$(objpfx)tst-tls14.out:$(objpfx)tst-tlsmod14b.so
+$(objpfx)tst-tls14: $(objpfx)tst-tlsmod14a.so $(libdl)
+$(objpfx)tst-tls14.out: $(objpfx)tst-tlsmod14b.so
+
+$(objpfx)tst-tls15: $(libdl)
+$(objpfx)tst-tls15.out: $(objpfx)tst-tlsmod15a.so $(objpfx)tst-tlsmod15b.so
 
 CFLAGS-tst-align.c = $(stack-align-test-flags)
 CFLAGS-tst-align2.c = $(stack-align-test-flags)
index 56cd39f..a2ca24e 100644 (file)
@@ -1306,8 +1306,7 @@ ld.so does not support TLS, but program uses it!\n");
 
          /* Since we start using the auditing DSOs right away we need to
             initialize the data structures now.  */
-         if (!TLS_INIT_TP_EXPENSIVE)
-           tcbp = init_tls ();
+         tcbp = init_tls ();
 #endif
          struct dlmopen_args dlmargs;
          dlmargs.fname = al->name;
diff --git a/elf/tst-tls15.c b/elf/tst-tls15.c
new file mode 100644 (file)
index 0000000..7ac963a
--- /dev/null
@@ -0,0 +1,32 @@
+#include <dlfcn.h>
+#include <stdio.h>
+
+static int
+do_test (void)
+{
+  void *h = dlopen ("tst-tlsmod15a.so", RTLD_NOW);
+  if (h != NULL)
+    {
+      puts ("unexpectedly succeeded to open tst-tlsmod15a.so");
+      exit (1);
+    }
+
+  h = dlopen ("tst-tlsmod15b.so", RTLD_NOW);
+  if (h == NULL)
+    {
+      puts ("failed to open tst-tlsmod15b.so");
+      exit (1);
+    }
+
+  int (*fp) (void) = (int (*) (void)) dlsym (h, "in_dso");
+  if (fp == NULL)
+    {
+      puts ("cannot find in_dso");
+      exit (1);
+    }
+
+  return fp ();
+}
+
+#define TEST_FUNCTION do_test ()
+#include "../test-skeleton.c"
diff --git a/elf/tst-tlsmod15a.c b/elf/tst-tlsmod15a.c
new file mode 100644 (file)
index 0000000..66c7071
--- /dev/null
@@ -0,0 +1,6 @@
+extern int nonexistent_dummy_var;
+int *
+foo (void)
+{
+  return &nonexistent_dummy_var;
+}
diff --git a/elf/tst-tlsmod15b.c b/elf/tst-tlsmod15b.c
new file mode 100644 (file)
index 0000000..4f63eab
--- /dev/null
@@ -0,0 +1,17 @@
+#include "tst-tls10.h"
+
+#ifdef USE_TLS__THREAD
+__thread int mod15b_var __attribute__((tls_model("initial-exec")));
+
+int
+in_dso (void)
+{
+  return mod15b_var;
+}
+#else
+int
+in_dso (void)
+{
+  return 0;
+}
+#endif
index fdd569b..4fed570 100644 (file)
@@ -71,26 +71,24 @@ _dl_next_tls_modid (void)
         NB: the offset +1 is due to the fact that DTV[0] is used
         for something else.  */
       result = GL(dl_tls_static_nelem) + 1;
-      /* If the following would not be true we mustn't have assumed
-        there is a gap.  */
-      assert (result <= GL(dl_tls_max_dtv_idx));
-      do
-       {
-         while (result - disp < runp->len)
-           {
-             if (runp->slotinfo[result - disp].map == NULL)
-               break;
-
-             ++result;
-             assert (result <= GL(dl_tls_max_dtv_idx) + 1);
-           }
-
-         if (result - disp < runp->len)
-           break;
-
-         disp += runp->len;
-       }
-      while ((runp = runp->next) != NULL);
+      if (result <= GL(dl_tls_max_dtv_idx))
+       do
+         {
+           while (result - disp < runp->len)
+             {
+               if (runp->slotinfo[result - disp].map == NULL)
+                 break;
+
+               ++result;
+               assert (result <= GL(dl_tls_max_dtv_idx) + 1);
+             }
+
+           if (result - disp < runp->len)
+             break;
+
+           disp += runp->len;
+         }
+       while ((runp = runp->next) != NULL);
 
       if (result > GL(dl_tls_max_dtv_idx))
        {