Blame elf/tst-audit2.c

Packit Service 82fcde
/* Test case for early TLS initialization in dynamic linker.  */
Packit Service 82fcde
Packit Service 82fcde
#include <stdio.h>
Packit Service 82fcde
#include <stdlib.h>
Packit Service 82fcde
#include <string.h>
Packit Service 82fcde
#include <dlfcn.h>
Packit Service 82fcde
Packit Service 82fcde
#define MAGIC1 0xabcdef72
Packit Service 82fcde
#define MAGIC2 0xd8675309
Packit Service 82fcde
static __thread unsigned int magic[] = { MAGIC1, MAGIC2 };
Packit Service 82fcde
static __thread int calloc_called;
Packit Service 82fcde
Packit Service 82fcde
#undef calloc
Packit Service 82fcde
Packit Service 82fcde
/* This calloc definition will be called by the dynamic linker itself.
Packit Service 82fcde
   We test that interposed calloc is called by the dynamic loader, and
Packit Service 82fcde
   that TLS is fully initialized by then.  */
Packit Service 82fcde
Packit Service 82fcde
void *
Packit Service 82fcde
calloc (size_t n, size_t m)
Packit Service 82fcde
{
Packit Service 82fcde
  if (!calloc_called)
Packit Service 82fcde
    {
Packit Service 82fcde
      /* Allow our calloc to be called more than once.  */
Packit Service 82fcde
      calloc_called = 1;
Packit Service 82fcde
      if (magic[0] != MAGIC1 || magic[1] != MAGIC2)
Packit Service 82fcde
	{
Packit Service 82fcde
	  printf ("{%x, %x} != {%x, %x}\n",
Packit Service 82fcde
		  magic[0], magic[1], MAGIC1, MAGIC2);
Packit Service 82fcde
	  abort ();
Packit Service 82fcde
	}
Packit Service 82fcde
      magic[0] = MAGIC2;
Packit Service 82fcde
      magic[1] = MAGIC1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  n *= m;
Packit Service 82fcde
  void *ptr = malloc (n);
Packit Service 82fcde
  if (ptr != NULL)
Packit Service 82fcde
    memset (ptr, '\0', n);
Packit Service 82fcde
  return ptr;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
static int
Packit Service 82fcde
do_test (void)
Packit Service 82fcde
{
Packit Service 82fcde
  /* Make sure that our calloc is called from the dynamic linker at least
Packit Service 82fcde
     once.  */
Packit Service 82fcde
  void *h = dlopen("$ORIGIN/tst-auditmod9b.so", RTLD_LAZY);
Packit Service 82fcde
  if (h != NULL)
Packit Service 82fcde
    dlclose (h);
Packit Service 82fcde
  if (magic[1] != MAGIC1 || magic[0] != MAGIC2)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("{%x, %x} != {%x, %x}\n", magic[0], magic[1], MAGIC2, MAGIC1);
Packit Service 82fcde
      return 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  return 0;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#include <support/test-driver.c>