* sysdeps/generic/libc-tls.c (__libc_setup_tls): Initialize the static
authorRoland McGrath <roland@gnu.org>
Tue, 22 Oct 2002 06:22:53 +0000 (06:22 +0000)
committerRoland McGrath <roland@gnu.org>
Tue, 22 Oct 2002 06:22:53 +0000 (06:22 +0000)
slotinfo list's len member to the proper size, not just 1.
Initialize static_map.l_tls_initimage.

* elf/dl-open.c (dl_open_worker): Fix loop searching for
dtv_slotinfo_list element containing new modules' l_tls_modid.

* elf/tst-tls9.c, elf/tst-tls9-static.c: New files.
* elf/tst-tlsmod5.c, elf/tst-tlsmod6.c: New files.
* elf/Makefile (tests): Add tst-tls9.
(tests-static): Add tst-tls9-static.
(tst-tls9-static-ENV): New variable.
($(objpfx)tst-tls9-static, $(objpfx)tst-tls9-static.out): New targets.

* elf/dl-close.c (remove_slotinfo): Remove an assert; the number of
modids used by partially loaded modules being closed can't be known.

ChangeLog
elf/dl-close.c
elf/dl-open.c
sysdeps/generic/libc-tls.c

index 3e4829b..e712c98 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,22 @@
+2002-10-21  Roland McGrath  <roland@redhat.com>
+
+       * sysdeps/generic/libc-tls.c (__libc_setup_tls): Initialize the static
+       slotinfo list's len member to the proper size, not just 1.
+       Initialize static_map.l_tls_initimage.
+
+       * elf/dl-open.c (dl_open_worker): Fix loop searching for
+       dtv_slotinfo_list element containing new modules' l_tls_modid.
+
+       * elf/tst-tls9.c, elf/tst-tls9-static.c: New files.
+       * elf/tst-tlsmod5.c, elf/tst-tlsmod6.c: New files.
+       * elf/Makefile (tests): Add tst-tls9.
+       (tests-static): Add tst-tls9-static.
+       (tst-tls9-static-ENV): New variable.
+       ($(objpfx)tst-tls9-static, $(objpfx)tst-tls9-static.out): New targets.
+
+       * elf/dl-close.c (remove_slotinfo): Remove an assert; the number of
+       modids used by partially loaded modules being closed can't be known.
+
 2002-10-21  Isamu Hasegawa  <isamu@yamato.ibm.com>
 
        * posix/Makefile: Add a test case for the bug reported by Aharon
index 3d8122a..094db53 100644 (file)
@@ -44,9 +44,8 @@ remove_slotinfo (size_t idx, struct dtv_slotinfo_list *listp, size_t disp,
       if (listp->next == NULL)
        {
          /* The index is not actually valid in the slotinfo list,
-            because this object was closed before it was fully setup
-            due to some error.  */
-         assert (idx - disp == listp->len);
+            because this object was closed before it was fully set
+            up due to some error.  */
          assert (! should_be_there);
        }
       else
index 08efe69..0e74996 100644 (file)
@@ -378,17 +378,19 @@ dl_open_worker (void *a)
 
        assert (new->l_searchlist.r_list[i]->l_type == lt_loaded);
 
-       /* Find the place in the stv slotinfo list.  */
+       /* Find the place in the dtv slotinfo list.  */
        listp = GL(dl_tls_dtv_slotinfo_list);
        prevp = NULL;           /* Needed to shut up gcc.  */
        do
          {
            /* Does it fit in the array of this list element?  */
-           if (idx <= listp->len)
+           if (idx < listp->len)
              break;
+           idx -= listp->len;
            prevp = listp;
+           listp = listp->next;
          }
-       while ((listp = listp->next) != NULL);
+       while (listp != NULL);
 
        if (listp == NULL)
          {
index df8dc2c..92ea62f 100644 (file)
@@ -39,10 +39,10 @@ static struct
 {
   struct dtv_slotinfo_list si;
   /* The dtv_slotinfo_list data structure does not include the actual
-     informatin since it is defined as an array of size zero.  We
-     define here the necessary entries.  Not that it is not important
-     whether there is padding or not since we will always access the
-     informatin through the 'si' element.  */
+     information since it is defined as an array of size zero.  We define
+     here the necessary entries.  Note that it is not important whether
+     there is padding or not since we will always access the information
+     through the 'si' element.  */
   struct dtv_slotinfo info[2 + TLS_SLOTINFO_SURPLUS];
 } static_slotinfo;
 
@@ -160,13 +160,16 @@ __libc_setup_tls (size_t tcbsize, size_t tcbalign)
      make the TLS routines happy.  */
   static_map.l_tls_align = align;
   static_map.l_tls_blocksize = memsz;
+  static_map.l_tls_initimage = initimage;
   static_map.l_tls_initimage_size = filesz;
   static_map.l_tls_offset = tcb_offset;
   static_map.l_type = lt_executable;
   static_map.l_tls_modid = 1;
 
   /* Create the slotinfo list.  */
-  static_slotinfo.si.len = 1;  /* Only one element.  */
+  static_slotinfo.si.len = (((char *) (&static_slotinfo + 1)
+                            - (char *) &static_slotinfo.si.slotinfo[0])
+                           / sizeof static_slotinfo.si.slotinfo[0]);
   // static_slotinfo.si.next = NULL;   already zero
 
   static_slotinfo.si.slotinfo[1].gen = 0;