(root)/
glibc-2.38/
elf/
tst-dlmopen-twice.c
       1  /* Initialization of libc after dlmopen/dlclose/dlmopen (bug 29528).  Main.
       2     Copyright (C) 2022-2023 Free Software Foundation, Inc.
       3     This file is part of the GNU C Library.
       4  
       5     The GNU C Library is free software; you can redistribute it and/or
       6     modify it under the terms of the GNU Lesser General Public
       7     License as published by the Free Software Foundation; either
       8     version 2.1 of the License, or (at your option) any later version.
       9  
      10     The GNU C Library is distributed in the hope that it will be useful,
      11     but WITHOUT ANY WARRANTY; without even the implied warranty of
      12     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      13     Lesser General Public License for more details.
      14  
      15     You should have received a copy of the GNU Lesser General Public
      16     License along with the GNU C Library; if not, see
      17     <https://www.gnu.org/licenses/>.  */
      18  
      19  #include <stdio.h>
      20  #include <support/check.h>
      21  #include <support/xdlfcn.h>
      22  
      23  /* Run the test multiple times, to check finding a new namespace while
      24     another namespace is already in use.  This used to trigger bug 29600.  */
      25  static void
      26  recurse (int depth)
      27  {
      28    if (depth == 0)
      29      return;
      30  
      31    printf ("info: running at depth %d\n", depth);
      32    void *handle = xdlmopen (LM_ID_NEWLM, "tst-dlmopen-twice-mod1.so",
      33                             RTLD_NOW);
      34    xdlclose (handle);
      35    handle = xdlmopen (LM_ID_NEWLM, "tst-dlmopen-twice-mod2.so", RTLD_NOW);
      36    int (*run_check) (void) = xdlsym (handle, "run_check");
      37    TEST_COMPARE (run_check (), 0);
      38    recurse (depth - 1);
      39    xdlclose (handle);
      40  }
      41  
      42  static int
      43  do_test (void)
      44  {
      45    /* First run the test without nesting.  */
      46    recurse (1);
      47  
      48    /* Then with nesting.  The constant needs to be less than the
      49       glibc.rtld.nns tunable (which is 4 by default).  */
      50    recurse (3);
      51    return 0;
      52  }
      53  
      54  #include <support/test-driver.c>