diff options
author | Ulrich Drepper <drepper@redhat.com> | 2002-02-14 10:34:55 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2002-02-14 10:34:55 +0000 |
commit | ebda6173fc0fa6b91fa30f1ea83ddb89baec66b9 (patch) | |
tree | 73a802e1784ddd85c340d37f506dd1d186759e33 /elf/tst-tls8.c | |
parent | 425838aa4b78c3fa9d43d75d85ebdc15f96f52d7 (diff) | |
download | glibc-ebda6173fc0fa6b91fa30f1ea83ddb89baec66b9.tar glibc-ebda6173fc0fa6b91fa30f1ea83ddb89baec66b9.tar.gz glibc-ebda6173fc0fa6b91fa30f1ea83ddb89baec66b9.tar.bz2 glibc-ebda6173fc0fa6b91fa30f1ea83ddb89baec66b9.zip |
Update.
* elf/Makefile: Add rules to build and run tst-tls8.
* elf/tst-tls8.c: New file.
* elf/tst-tlsmod4.c: New file.
Diffstat (limited to 'elf/tst-tls8.c')
-rw-r--r-- | elf/tst-tls8.c | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/elf/tst-tls8.c b/elf/tst-tls8.c new file mode 100644 index 0000000000..971ee565cb --- /dev/null +++ b/elf/tst-tls8.c @@ -0,0 +1,174 @@ +#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 modname1[] = "tst-tlsmod3.so"; + static const char modname2[] = "tst-tlsmod4.so"; + int result = 0; + int (*fp1) (void); + int (*fp2) (int, int *); + void *h1; + void *h2; + int i; + int modid1 = -1; + int modid2 = -1; + int *bazp; + + for (i = 0; i < 10; ++i) + { + h1 = dlopen (modname1, RTLD_LAZY); + if (h1 == NULL) + { + printf ("cannot open '%s': %s\n", modname1, 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 (modid1 == -1) + modid1 = ((struct link_map *) h1)->l_tls_modid; + else if (((struct link_map *) h1)->l_tls_modid != modid1) + { + printf ("round %d: modid now %d, initially %d\n", + i, ((struct link_map *) h1)->l_tls_modid, modid1); + result = 1; + } + + fp1 = dlsym (h1, "in_dso2"); + if (fp1 == NULL) + { + printf ("cannot get symbol 'in_dso2' in %s\n", modname1); + exit (1); + } + + result |= fp1 (); + + + + h2 = dlopen (modname2, RTLD_LAZY); + if (h2 == NULL) + { + printf ("cannot open '%s': %s\n", modname2, 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 (modid2 == -1) + modid2 = ((struct link_map *) h1)->l_tls_modid; + else if (((struct link_map *) h1)->l_tls_modid != modid2) + { + printf ("round %d: modid now %d, initially %d\n", + i, ((struct link_map *) h1)->l_tls_modid, modid2); + result = 1; + } + + bazp = dlsym (h2, "baz"); + if (bazp == NULL) + { + printf ("cannot get symbol 'baz' in %s\n", modname2); + exit (1); + } + + *bazp = 42 + i; + + fp2 = dlsym (h2, "in_dso"); + if (fp2 == NULL) + { + printf ("cannot get symbol 'in_dso' in %s\n", modname2); + exit (1); + } + + result |= fp2 (42 + i, bazp); + + dlclose (h1); + dlclose (h2); + + + h1 = dlopen (modname1, RTLD_LAZY); + if (h1 == NULL) + { + printf ("cannot open '%s': %s\n", modname1, 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 (((struct link_map *) h1)->l_tls_modid != modid1) + { + printf ("round %d: modid now %d, initially %d\n", + i, ((struct link_map *) h1)->l_tls_modid, modid1); + result = 1; + } + + fp1 = dlsym (h1, "in_dso2"); + if (fp1 == NULL) + { + printf ("cannot get symbol 'in_dso2' in %s\n", modname1); + exit (1); + } + + result |= fp1 (); + + + + h2 = dlopen (modname2, RTLD_LAZY); + if (h2 == NULL) + { + printf ("cannot open '%s': %s\n", modname2, 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 (((struct link_map *) h1)->l_tls_modid != modid2) + { + printf ("round %d: modid now %d, initially %d\n", + i, ((struct link_map *) h1)->l_tls_modid, modid2); + result = 1; + } + + bazp = dlsym (h2, "baz"); + if (bazp == NULL) + { + printf ("cannot get symbol 'baz' in %s\n", modname2); + exit (1); + } + + *bazp = 62 + i; + + fp2 = dlsym (h2, "in_dso"); + if (fp2 == NULL) + { + printf ("cannot get symbol 'in_dso' in %s\n", modname2); + exit (1); + } + + result |= fp2 (62 + i, bazp); + + /* This time the dlclose calls are in reverse order. */ + dlclose (h2); + dlclose (h1); + } + + return result; +#else + return 0; +#endif +} + + +#include "../test-skeleton.c" |