Blame elf/tst-initfinilazyfail.c

Packit Service ef54c5
/* Test that lazy binding failures in constructors and destructors are fatal.
Packit Service ef54c5
   Copyright (C) 2019 Free Software Foundation, Inc.
Packit Service ef54c5
   This file is part of the GNU C Library.
Packit Service ef54c5
Packit Service ef54c5
   The GNU C Library is free software; you can redistribute it and/or
Packit Service ef54c5
   modify it under the terms of the GNU Lesser General Public
Packit Service ef54c5
   License as published by the Free Software Foundation; either
Packit Service ef54c5
   version 2.1 of the License, or (at your option) any later version.
Packit Service ef54c5
Packit Service ef54c5
   The GNU C Library is distributed in the hope that it will be useful,
Packit Service ef54c5
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service ef54c5
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service ef54c5
   Lesser General Public License for more details.
Packit Service ef54c5
Packit Service ef54c5
   You should have received a copy of the GNU Lesser General Public
Packit Service ef54c5
   License along with the GNU C Library; if not, see
Packit Service ef54c5
   <https://www.gnu.org/licenses/>.  */
Packit Service ef54c5
Packit Service ef54c5
#include <dlfcn.h>
Packit Service ef54c5
#include <string.h>
Packit Service ef54c5
#include <support/capture_subprocess.h>
Packit Service ef54c5
#include <support/check.h>
Packit Service ef54c5
#include <support/xdlfcn.h>
Packit Service ef54c5
Packit Service ef54c5
static void
Packit Service ef54c5
test_constructor (void *closure)
Packit Service ef54c5
{
Packit Service ef54c5
  void *handle = dlopen ("tst-initlazyfailmod.so", RTLD_LAZY);
Packit Service ef54c5
  if (handle == NULL)
Packit Service ef54c5
    FAIL_EXIT (2, "dlopen did not terminate the process: %s", dlerror ());
Packit Service ef54c5
  else
Packit Service ef54c5
    FAIL_EXIT (2, "dlopen did not terminate the process (%p)", handle);
Packit Service ef54c5
}
Packit Service ef54c5
Packit Service ef54c5
static void
Packit Service ef54c5
test_destructor (void *closure)
Packit Service ef54c5
{
Packit Service ef54c5
  void *handle = xdlopen ("tst-finilazyfailmod.so", RTLD_LAZY);
Packit Service ef54c5
  int ret = dlclose (handle);
Packit Service ef54c5
  const char *message = dlerror ();
Packit Service ef54c5
  if (message != NULL)
Packit Service ef54c5
    FAIL_EXIT (2, "dlclose did not terminate the process: %d, %s",
Packit Service ef54c5
               ret, message);
Packit Service ef54c5
  else
Packit Service ef54c5
    FAIL_EXIT (2, "dlopen did not terminate the process: %d", ret);
Packit Service ef54c5
}
Packit Service ef54c5
Packit Service ef54c5
static int
Packit Service ef54c5
do_test (void)
Packit Service ef54c5
{
Packit Service ef54c5
  {
Packit Service ef54c5
    struct support_capture_subprocess proc
Packit Service ef54c5
      = support_capture_subprocess (test_constructor, NULL);
Packit Service ef54c5
    support_capture_subprocess_check (&proc, "constructor", 127,
Packit Service ef54c5
                                      sc_allow_stderr);
Packit Service ef54c5
    printf ("info: constructor failure output: [[%s]]\n", proc.err.buffer);
Packit Service ef54c5
    TEST_VERIFY (strstr (proc.err.buffer,
Packit Service ef54c5
                         "tst-initfinilazyfail: symbol lookup error: ")
Packit Service ef54c5
                 != NULL);
Packit Service ef54c5
    TEST_VERIFY (strstr (proc.err.buffer,
Packit Service ef54c5
                         "tst-initlazyfailmod.so: undefined symbol:"
Packit Service ef54c5
                         " undefined_function\n") != NULL);
Packit Service ef54c5
    support_capture_subprocess_free (&proc;;
Packit Service ef54c5
  }
Packit Service ef54c5
Packit Service ef54c5
  {
Packit Service ef54c5
    struct support_capture_subprocess proc
Packit Service ef54c5
      = support_capture_subprocess (test_destructor, NULL);
Packit Service ef54c5
    support_capture_subprocess_check (&proc, "destructor", 127,
Packit Service ef54c5
                                      sc_allow_stderr);
Packit Service ef54c5
    printf ("info: destructor failure output: [[%s]]\n", proc.err.buffer);
Packit Service ef54c5
    TEST_VERIFY (strstr (proc.err.buffer,
Packit Service ef54c5
                         "tst-initfinilazyfail: symbol lookup error: ")
Packit Service ef54c5
                 != NULL);
Packit Service ef54c5
    TEST_VERIFY (strstr (proc.err.buffer,
Packit Service ef54c5
                         "tst-finilazyfailmod.so: undefined symbol:"
Packit Service ef54c5
                         " undefined_function\n") != NULL);
Packit Service ef54c5
    support_capture_subprocess_free (&proc;;
Packit Service ef54c5
  }
Packit Service ef54c5
Packit Service ef54c5
  return 0;
Packit Service ef54c5
}
Packit Service ef54c5
Packit Service ef54c5
#include <support/test-driver.c>