Blame elf/tst-tls16.c

Packit Service 82fcde
#include <dlfcn.h>
Packit Service 82fcde
#include <stdlib.h>
Packit Service 82fcde
#include <stdio.h>
Packit Service 82fcde
Packit Service 82fcde
static int
Packit Service 82fcde
do_test (void)
Packit Service 82fcde
{
Packit Service 82fcde
  void *h = dlopen ("tst-tlsmod16a.so", RTLD_LAZY | RTLD_GLOBAL);
Packit Service 82fcde
  if (h == NULL)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("unexpectedly failed to open tst-tlsmod16a.so");
Packit Service 82fcde
      exit (1);
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  void *p = dlsym (h, "tlsvar");
Packit Service 82fcde
Packit Service 82fcde
  /* This dlopen should indeed fail, because tlsvar was assigned to
Packit Service 82fcde
     dynamic TLS, and the new module requests it to be in static TLS.
Packit Service 82fcde
     However, there's a possibility that dlopen succeeds if the
Packit Service 82fcde
     variable is, for whatever reason, assigned to static TLS, or if
Packit Service 82fcde
     the module fails to require static TLS, or even if TLS is not
Packit Service 82fcde
     supported.  */
Packit Service 82fcde
  h = dlopen ("tst-tlsmod16b.so", RTLD_NOW | RTLD_GLOBAL);
Packit Service 82fcde
  if (h == NULL)
Packit Service 82fcde
    {
Packit Service 82fcde
      return 0;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  puts ("unexpectedly succeeded to open tst-tlsmod16b.so");
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
  void *(*fp) (void) = (void *(*) (void)) dlsym (h, "in_dso");
Packit Service 82fcde
  if (fp == NULL)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("cannot find in_dso");
Packit Service 82fcde
      exit (1);
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* If the dlopen passes, at least make sure the address returned by
Packit Service 82fcde
     dlsym is the same as that returned by the initial-exec access.
Packit Service 82fcde
     If the variable was assigned to dynamic TLS during dlsym, this
Packit Service 82fcde
     portion will fail.  */
Packit Service 82fcde
  if (fp () != p)
Packit Service 82fcde
    {
Packit Service 82fcde
      puts ("returned values do not match");
Packit Service 82fcde
      exit (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>