(root)/
glibc-2.38/
elf/
tst-nodelete-opened.c
       1  /* Verify that an already opened DSO opened agained with RTLD_NODELETE actually
       2     sets the NODELETE flag.
       3  
       4     Copyright (C) 2015-2023 Free Software Foundation, Inc.
       5     This file is part of the GNU C Library.
       6  
       7     The GNU C Library is free software; you can redistribute it and/or
       8     modify it under the terms of the GNU Lesser General Public
       9     License as published by the Free Software Foundation; either
      10     version 2.1 of the License, or (at your option) any later version.
      11  
      12     The GNU C Library is distributed in the hope that it will be useful,
      13     but WITHOUT ANY WARRANTY; without even the implied warranty of
      14     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      15     Lesser General Public License for more details.
      16  
      17     You should have received a copy of the GNU Lesser General Public
      18     License along with the GNU C Library; if not, see
      19     <https://www.gnu.org/licenses/>.  */
      20  
      21  #include <dlfcn.h>
      22  #include <stdio.h>
      23  
      24  int
      25  do_test (void)
      26  {
      27    void *h1 = dlopen ("$ORIGIN/tst-nodelete-opened-lib.so", RTLD_LAZY);
      28    if (h1 == NULL)
      29      {
      30        printf ("h1: failed to open DSO: %s\n", dlerror ());
      31        return 1;
      32      }
      33  
      34    void *h2 = dlopen ("$ORIGIN/tst-nodelete-opened-lib.so",
      35  		     RTLD_LAZY | RTLD_NODELETE);
      36    if (h2 == NULL)
      37      {
      38        printf ("h2: failed to open DSO: %s\n", dlerror ());
      39        return 1;
      40      }
      41  
      42    int *foo = dlsym (h2, "foo_var");
      43    if (foo == NULL)
      44      {
      45        printf ("failed to load symbol foo_var: %s\n", dlerror ());
      46        return 1;
      47      }
      48  
      49    if (dlclose (h1) != 0)
      50      {
      51        printf ("h1: dlclose failed: %s\n", dlerror ());
      52        return 1;
      53      }
      54  
      55    if (dlclose (h2) != 0)
      56      {
      57        printf ("h2: dlclose failed: %s\n", dlerror ());
      58        return 1;
      59      }
      60  
      61    /* This FOO dereference will crash with a segfault if the DSO was
      62       unloaded.  */
      63    printf ("foo == %d\n", *foo);
      64  
      65    return 0;
      66  }
      67  
      68  #include <support/test-driver.c>