Blame elf/tst-nodelete2.c

Packit Service 82fcde
#include "../dlfcn/dlfcn.h"
Packit Service 82fcde
#include <stdio.h>
Packit Service 82fcde
#include <stdlib.h>
Packit Service 82fcde
#include <gnu/lib-names.h>
Packit Service 82fcde
Packit Service 82fcde
static int
Packit Service 82fcde
do_test (void)
Packit Service 82fcde
{
Packit Service 82fcde
  int result = 0;
Packit Service 82fcde
Packit Service 82fcde
  printf ("\nOpening pthread library.\n");
Packit Service 82fcde
  void *pthread = dlopen (LIBPTHREAD_SO, RTLD_LAZY);
Packit Service 82fcde
Packit Service 82fcde
  /* This is a test for correct DF_1_NODELETE clearing when dlopen failure
Packit Service 82fcde
     happens.  We should clear DF_1_NODELETE for failed library only, because
Packit Service 82fcde
     doing this for others (e.g. libpthread) might cause them to be unloaded,
Packit Service 82fcde
     that may lead to some global references (e.g. __rtld_lock_unlock) to be
Packit Service 82fcde
     broken.  The dlopen should fail because of undefined symbols in shared
Packit Service 82fcde
     library, that cause DF_1_NODELETE to be cleared.  For libpthread, this
Packit Service 82fcde
     flag should be set, because if not, SIGSEGV will happen in dlclose.  */
Packit Service 82fcde
  if (dlopen ("tst-nodelete2mod.so", RTLD_NOW) != NULL)
Packit Service 82fcde
    {
Packit Service 82fcde
      printf ("Unique symbols test failed\n");
Packit Service 82fcde
      result = 1;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  if (pthread)
Packit Service 82fcde
    dlclose (pthread);
Packit Service 82fcde
Packit Service 82fcde
  if (result == 0)
Packit Service 82fcde
    printf ("SUCCESS\n");
Packit Service 82fcde
Packit Service 82fcde
  return result;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#include <support/test-driver.c>