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 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
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
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)
{
{
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;
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;