diff options
| author | "Steven J. Hill" <sjhill@realitydiluted.com> | 2005-10-30 04:33:48 +0000 |
|---|---|---|
| committer | "Steven J. Hill" <sjhill@realitydiluted.com> | 2005-10-30 04:33:48 +0000 |
| commit | 4fc0cd60dfa59fbd89f9f6737db69d3794701dfc (patch) | |
| tree | 53b0181c20035ed05aa5a9def6dad0e7a50dcc7f /test/tls/tst-tls7.c | |
| parent | c82f7be400838c99fdbf7635610f799a1154ccdd (diff) | |
| download | uClibc-alpine-4fc0cd60dfa59fbd89f9f6737db69d3794701dfc.tar.bz2 uClibc-alpine-4fc0cd60dfa59fbd89f9f6737db69d3794701dfc.tar.xz | |
Add TLS test suite for testing TLS relocation functionality in the dynamic loader. Make sure your read the README file before asking any questions, and then read it again.
Diffstat (limited to 'test/tls/tst-tls7.c')
| -rw-r--r-- | test/tls/tst-tls7.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/test/tls/tst-tls7.c b/test/tls/tst-tls7.c new file mode 100644 index 000000000..37f1a63e1 --- /dev/null +++ b/test/tls/tst-tls7.c @@ -0,0 +1,61 @@ +#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 != (size_t) modid) + { + printf ("round %d: modid now %zu, 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" |
