Blame elf/tst-initfinilazyfail.c

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