glibc/elf/tst-tls19.c
Martin von Gagern d26dfc60ed Fix handling of static TLS in dlopen'ed objects
When dynamically loading a library along with several dependencies, calls to
_dl_add_to_slotinfo and _dl_update_slotinfo can become intermixed. As a
consequence, _dl_update_slotinfo will update the generation counter of the dtv
although not all of the slots belonging to that generation have been added.
Subsequent calls to _dl_add_to_slotinfo will add more slots to the same
generation, for which no storage will be allocated, as the dtv generation
checks will claim no work is necessary. This will lead to uninitialized dtv
entries and will likely cause a SIGSEGV when thread local variables are
accessed.
2011-05-14 21:25:43 -04:00

28 lines
476 B
C

// BZ 12453
#include <stdio.h>
#include <dlfcn.h>
static int
do_test (void)
{
void* dl = dlopen ("tst-tls19mod1.so", RTLD_LAZY | RTLD_GLOBAL);
if (dl == NULL)
{
printf ("Error loading tst-tls19mod1.so: %s\n", dlerror ());
return 1;
}
int (*fn) (void) = dlsym (dl, "foo");
if (fn == NULL)
{
printf("Error obtaining symbol foo\n");
return 1;
}
return fn ();
}
#define TEST_FUNCTION do_test ()
#include "../test-skeleton.c"