glibc/elf/tst-tls7.c
Ulrich Drepper fc093be160 Update.
* elf/dl-close.c (remove_slotinfo): New function.  Handles everything
	for removing reference of module in slotinfo list.
	(_dl_close): Use remove_slotinfo.
	* sysdeps/generic/dl-tls.c: General pretty printing.
	(oom): Define only if SHARED.
	(_dl_next_tls_modid): Correct starting point for the case we assume
	there is a gap.  Add missing instruction grouping (doh!).  Correct
	tests for reaching maximum index.
	* elf/Makefile: Add rules to build and run tst-tls7.
	* elf/tst-tls7.c: New file.
	* elf/tst-tlsmod3.c: New file.

	* elf/tst-tlsmod1.c: Move #include "tls-macros.h" instead #ifdef
	USE_TLS.
	* elf/tst-tlsmod2.c: Likewise.
2002-02-14 07:57:19 +00:00

62 lines
1.1 KiB
C

#include <dlfcn.h>
#include <stdio.h>
#include <stdlib.h>
#include <link.h>
#include <tls.h>
#define TEST_FUNCTION do_test ()
static int
do_test (void)
{
#ifdef USE_TLS
static const char modname[] = "tst-tlsmod3.so";
int result = 0;
int (*fp) (void);
void *h;
int i;
int modid = -1;
for (i = 0; i < 10; ++i)
{
h = dlopen (modname, RTLD_LAZY);
if (h == NULL)
{
printf ("cannot open '%s': %s\n", modname, dlerror ());
exit (1);
}
/* Dirty test code here: we peek into a private data structure.
We make sure that the module gets assigned the same ID every
time. The value of the first round is used. */
if (modid == -1)
modid = ((struct link_map *) h)->l_tls_modid;
else if (((struct link_map *) h)->l_tls_modid != modid)
{
printf ("round %d: modid now %d, initially %d\n",
i, ((struct link_map *) h)->l_tls_modid, modid);
result = 1;
}
fp = dlsym (h, "in_dso2");
if (fp == NULL)
{
printf ("cannot get symbol 'in_dso2': %s\n", dlerror ());
exit (1);
}
result |= fp ();
dlclose (h);
}
return result;
#else
return 0;
#endif
}
#include "../test-skeleton.c"