More NEWS entries / fixes for float_t / double_t changes.
[glibc.git] / elf / tst-audit2.c
blob1d69cd669ee8f57131cfebbfac429ee24a4defc5
1 /* Test case for early TLS initialization in dynamic linker. */
3 #include <stdio.h>
4 #include <stdlib.h>
5 #include <string.h>
6 #include <dlfcn.h>
8 #define MAGIC1 0xabcdef72
9 #define MAGIC2 0xd8675309
10 static __thread unsigned int magic[] = { MAGIC1, MAGIC2 };
11 static __thread int calloc_called;
13 #undef calloc
15 /* This calloc definition will be called by the dynamic linker itself.
16 We test that interposed calloc is called by the dynamic loader, and
17 that TLS is fully initialized by then. */
19 void *
20 calloc (size_t n, size_t m)
22 if (!calloc_called)
24 /* Allow our calloc to be called more than once. */
25 calloc_called = 1;
26 if (magic[0] != MAGIC1 || magic[1] != MAGIC2)
28 printf ("{%x, %x} != {%x, %x}\n",
29 magic[0], magic[1], MAGIC1, MAGIC2);
30 abort ();
32 magic[0] = MAGIC2;
33 magic[1] = MAGIC1;
36 n *= m;
37 void *ptr = malloc (n);
38 if (ptr != NULL)
39 memset (ptr, '\0', n);
40 return ptr;
43 static int
44 do_test (void)
46 /* Make sure that our calloc is called from the dynamic linker at least
47 once. */
48 void *h = dlopen("$ORIGIN/tst-auditmod9b.so", RTLD_LAZY);
49 if (h != NULL)
50 dlclose (h);
51 if (magic[1] != MAGIC1 || magic[0] != MAGIC2)
53 printf ("{%x, %x} != {%x, %x}\n", magic[0], magic[1], MAGIC2, MAGIC1);
54 return 1;
57 return 0;
60 #define TEST_FUNCTION do_test ()
61 #include "../test-skeleton.c"