(root)/
glibc-2.38/
support/
xdlfcn.c
       1  /* Support functionality for using dlopen/dlclose/dlsym.
       2     Copyright (C) 2017-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 <stddef.h>
      20  #include <support/check.h>
      21  #include <support/xdlfcn.h>
      22  
      23  void *
      24  xdlopen (const char *filename, int flags)
      25  {
      26    void *dso = dlopen (filename, flags);
      27  
      28    if (dso == NULL)
      29      FAIL_EXIT1 ("error: dlopen: %s\n", dlerror ());
      30  
      31    return dso;
      32  }
      33  
      34  void *
      35  xdlsym (void *handle, const char *symbol)
      36  {
      37    /* Clear any pending errors.  */
      38    dlerror ();
      39  
      40    void *sym = dlsym (handle, symbol);
      41  
      42    if (sym == NULL)
      43      {
      44        const char *error = dlerror ();
      45        if (error != NULL)
      46          FAIL_EXIT1 ("error: dlsym: %s\n", error);
      47        /* If there was no error, we found a NULL symbol.  Return the
      48           NULL value in this case.  */
      49      }
      50  
      51    return sym;
      52  }
      53  
      54  void *
      55  xdlvsym (void *handle, const char *symbol, const char *version)
      56  {
      57    /* Clear any pending errors.  */
      58    dlerror ();
      59  
      60    void *sym = dlvsym (handle, symbol, version);
      61  
      62    if (sym == NULL)
      63      {
      64        const char *error = dlerror ();
      65        if (error != NULL)
      66          FAIL_EXIT1 ("error: dlvsym: %s\n", error);
      67        /* If there was no error, we found a NULL symbol.  Return the
      68           NULL value in this case.  */
      69      }
      70  
      71    return sym;
      72  }
      73  
      74  void
      75  xdlclose (void *handle)
      76  {
      77    if (dlclose (handle) != 0)
      78      FAIL_EXIT1 ("error: dlclose: %s\n", dlerror ());
      79  }