This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.
Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
On Sun, Mar 13, 2005 at 09:39:04PM +0200, Martin Schlemmer wrote: > Basically the issue above. This is valid for glibc 2.3.[234] if I did > not miss anything. Here is a good test case: > > http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=219352#msg122 > > I came up with attached patch that seems to work and passes all the > tests (except for the one or two usual ones). Is this the correct fix, > or are the problem deeper? That patch certainly doesn't apply to neither HEAD nor glibc-2_3-branch, see especially: 2005-01-10 Ulrich Drepper <drepper@redhat.com> * sysdeps/generic/dl-tls.c (_dl_next_tls_modid): Fix assertion and recognition of last entry. The fix can either be that dl-open.c only sets GL(dl_tls_dtv_gaps) to true if GL(dl_tls_static_nelem) < GL(dl_tls_max_dtv_idx) (if it is equal, there are certainly no gaps), or handling that case in _dl_next_tls_modid. In _dl_next_tls_modid, the choices are either to do what the patch below does, i.e. just clear GL(dl_tls_dtv_gaps) if that happens, or just change the assert and let the do ... while loop run, it shouldn't increment result anyway. 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. --- libc/sysdeps/generic/dl-tls.c.jj 2005-02-25 14:45:06.000000000 +0100 +++ libc/sysdeps/generic/dl-tls.c 2005-03-15 15:36:55.593127093 +0100 @@ -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)) { --- libc/elf/Makefile.jj 2005-03-08 22:09:39.000000000 +0100 +++ libc/elf/Makefile 2005-03-15 15:17:02.105752389 +0100 @@ -158,7 +158,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 \ 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 @@ -189,6 +189,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 \ @@ -469,6 +470,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 @@ -681,8 +683,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-align2.c = $(stack-align-test-flags) --- libc/elf/tst-tls15.c.jj 2005-03-15 15:06:07.000474699 +0100 +++ libc/elf/tst-tls15.c 2005-03-15 15:09:43.096964047 +0100 @@ -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" --- libc/elf/tst-tlsmod15a.c.jj 2005-03-15 15:13:26.850098066 +0100 +++ libc/elf/tst-tlsmod15a.c 2005-03-15 15:13:22.082947275 +0100 @@ -0,0 +1,6 @@ +extern int nonexistent_dummy_var; +int * +foo (void) +{ + return &nonexistent_dummy_var; +} --- libc/elf/tst-tlsmod15b.c.jj 2005-03-15 15:13:54.578158642 +0100 +++ libc/elf/tst-tlsmod15b.c 2005-03-15 15:15:38.723606220 +0100 @@ -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 Jakub
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |