diff options
author | Roland McGrath <roland@gnu.org> | 2002-10-22 06:22:53 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2002-10-22 06:22:53 +0000 |
commit | 8265947da0173ae415bed7123c64ad97bb2af1b5 (patch) | |
tree | 8ae3555f5b74d1824257f5a0b5d922235cc220ad | |
parent | 6ef518c323c2bcdd8e633da3c0cd1f525f63c7d8 (diff) | |
download | glibc-8265947da0173ae415bed7123c64ad97bb2af1b5.zip glibc-8265947da0173ae415bed7123c64ad97bb2af1b5.tar.gz glibc-8265947da0173ae415bed7123c64ad97bb2af1b5.tar.bz2 |
* 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.
-rw-r--r-- | ChangeLog | 19 | ||||
-rw-r--r-- | elf/dl-close.c | 5 | ||||
-rw-r--r-- | elf/dl-open.c | 8 | ||||
-rw-r--r-- | sysdeps/generic/libc-tls.c | 13 |
4 files changed, 34 insertions, 11 deletions
@@ -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 diff --git a/elf/dl-close.c b/elf/dl-close.c index 3d8122a..094db53 100644 --- a/elf/dl-close.c +++ b/elf/dl-close.c @@ -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 diff --git a/elf/dl-open.c b/elf/dl-open.c index 08efe69..0e74996 100644 --- a/elf/dl-open.c +++ b/elf/dl-open.c @@ -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) { diff --git a/sysdeps/generic/libc-tls.c b/sysdeps/generic/libc-tls.c index df8dc2c..92ea62f 100644 --- a/sysdeps/generic/libc-tls.c +++ b/sysdeps/generic/libc-tls.c @@ -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; |