Author: dj
Date: 2005-11-20 11:06:40 -0700 (Sun, 20 Nov 2005)
New Revision: 1269

Added:
   trunk/glibc/glibc-2.3.4-tls_assert-1.patch
   trunk/glibc/glibc-2.3.5-tls_assert-1.patch
Log:
added tls assert patches for glibc 2.3.4 and 2.3.5.

Added: trunk/glibc/glibc-2.3.4-tls_assert-1.patch
===================================================================
--- trunk/glibc/glibc-2.3.4-tls_assert-1.patch  2005-11-20 00:43:54 UTC (rev 
1268)
+++ trunk/glibc/glibc-2.3.4-tls_assert-1.patch  2005-11-20 18:06:40 UTC (rev 
1269)
@@ -0,0 +1,191 @@
+Submitted By: DJ Lucas <dj_AT_linuxfromscratch_DOT_org>
+Date: 2005-11-20
+Initial Package Version: 2.3.4
+Upstream Status: Comitted
+Origin:  http://bugs.gentoo.org/show_bug.cgi?id=52374#c23
+Description:  Fixes the follwoing error:
+Inconsistency detected by ld.so: ../sysdeps/generic/dl-tls.c: 72:
+_dl_next_tls_modid: Assertion `result <= _rtld_local._dl_tls_max_dtv_idx' 
+failed!
+
+diff -urpN glibc-2.3.4.az/elf/Makefile glibc-2.3.4/elf/Makefile
+--- glibc-2.3.4.az/elf/Makefile        2005-03-15 17:38:36.000000000 +0200
++++ glibc-2.3.4/elf/Makefile   2005-03-15 17:39:07.000000000 +0200
+@@ -152,7 +152,7 @@ tests += loadtest restest1 preloadtest l
+        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 \
+        $(tests-execstack-$(have-z-execstack)) tst-dlmodcount \
+        tst-dlopenrpath tst-deep1 tst-dlmopen1 tst-dlmopen2 tst-dlmopen3
+ #      reldep9
+@@ -182,6 +182,7 @@ modules-names = testobj1 testobj2 testob
+               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 \
+@@ -454,6 +455,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
+@@ -664,8 +666,11 @@ $(objpfx)tst-tls12: $(objpfx)tst-tlsmod1
+ $(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-alignmod.c = $(stack-align-test-flags)
+diff -urpN glibc-2.3.4.az/elf/tst-tls15.c glibc-2.3.4/elf/tst-tls15.c
+--- glibc-2.3.4.az/elf/tst-tls15.c     1970-01-01 02:00:00.000000000 +0200
++++ glibc-2.3.4/elf/tst-tls15.c        2005-03-15 17:39:07.000000000 +0200
+@@ -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 -urpN glibc-2.3.4.az/elf/tst-tlsmod15a.c glibc-2.3.4/elf/tst-tlsmod15a.c
+--- glibc-2.3.4.az/elf/tst-tlsmod15a.c 1970-01-01 02:00:00.000000000 +0200
++++ glibc-2.3.4/elf/tst-tlsmod15a.c    2005-03-15 17:39:07.000000000 +0200
+@@ -0,0 +1,6 @@
++extern int nonexistent_dummy_var;
++int *
++foo (void)
++{
++  return &nonexistent_dummy_var;
++}
+diff -urpN glibc-2.3.4.az/elf/tst-tlsmod15b.c glibc-2.3.4/elf/tst-tlsmod15b.c
+--- glibc-2.3.4.az/elf/tst-tlsmod15b.c 1970-01-01 02:00:00.000000000 +0200
++++ glibc-2.3.4/elf/tst-tlsmod15b.c    2005-03-15 17:39:07.000000000 +0200
+@@ -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
+diff -urpN glibc-2.3.4.az/sysdeps/generic/dl-tls.c 
glibc-2.3.4/sysdeps/generic/dl-tls.c
+--- glibc-2.3.4.az/sysdeps/generic/dl-tls.c    2005-03-15 17:40:56.000000000 
+0200
++++ glibc-2.3.4/sysdeps/generic/dl-tls.c       2005-03-15 17:39:07.000000000 
+0200
+@@ -65,34 +65,35 @@ _dl_next_tls_modid (void)
+       /* Note that this branch will never be executed during program
+        start since there are no gaps at that time.  Therefore it
+        does not matter that the dl_tls_dtv_slotinfo is not allocated
+-       yet when the function is called for the first times.  */
+-      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);
+-          }
++       yet when the function is called for the first times.
+ 
+-        if (result - disp < runp->len)
+-          break;
+-
+-        disp += runp->len;
+-      }
+-      while ((runp = runp->next) != NULL);
++       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 (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))
++      if (result > GL(dl_tls_max_dtv_idx))
+       {
+         /* The new index must indeed be exactly one higher than the
+            previous high.  */
+-        assert (result == GL(dl_tls_max_dtv_idx));
++        assert (result == GL(dl_tls_max_dtv_idx) + 1);
+ 
+         /* There is no gap anymore.  */
+         GL(dl_tls_dtv_gaps) = false;
+@@ -577,7 +578,7 @@ __tls_get_addr (GET_ADDR_ARGS)
+           {
+             size_t cnt;
+ 
+-            for (cnt = total = 0 ? 1 : 0; cnt < listp->len; ++cnt)
++            for (cnt = total == 0 ? 1 : 0; cnt < listp->len; ++cnt)
+               {
+                 size_t gen = listp->slotinfo[cnt].gen;
+                 struct link_map *map;
+

Added: trunk/glibc/glibc-2.3.5-tls_assert-1.patch
===================================================================
--- trunk/glibc/glibc-2.3.5-tls_assert-1.patch  2005-11-20 00:43:54 UTC (rev 
1268)
+++ trunk/glibc/glibc-2.3.5-tls_assert-1.patch  2005-11-20 18:06:40 UTC (rev 
1269)
@@ -0,0 +1,53 @@
+Submitted By: DJ Lucas <dj_AT_linuxfromscratch_DOT_org>
+Date: 2005-11-20
+Initial Package Version: 2.3.4
+Upstream Status: Comitted
+Origin:  http://bugs.gentoo.org/show_bug.cgi?id=52374#c35
+Description:  Fixes the follwoing error:
+Inconsistency detected by ld.so: ../sysdeps/generic/dl-tls.c: 72:
+_dl_next_tls_modid: Assertion `result <= _rtld_local._dl_tls_max_dtv_idx'
+failed!
+
+
+diff -Naur glibc-2.3.5-orig/sysdeps/generic/dl-tls.c 
glibc-2.3.5/sysdeps/generic/dl-tls.c
+--- glibc-2.3.5-orig/sysdeps/generic/dl-tls.c  2005-02-16 10:23:02.000000000 
+0000
++++ glibc-2.3.5/sysdeps/generic/dl-tls.c       2005-11-20 11:55:11.000000000 
+0000
+@@ -70,24 +70,22 @@
+        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;
++      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);
++            }
+ 
+-            ++result;
+-            assert (result <= GL(dl_tls_max_dtv_idx) + 1);
+-          }
+-
+-        if (result - disp < runp->len)
+-          break;
++          if (result - disp < runp->len)
++            break;
+ 
+-        disp += runp->len;
++          disp += runp->len;
+       }
+       while ((runp = runp->next) != NULL);
+ 

-- 
http://linuxfromscratch.org/mailman/listinfo/patches
FAQ: http://www.linuxfromscratch.org/faq/
Unsubscribe: See the above information page

Reply via email to