(root)/
glibc-2.38/
sysdeps/
unix/
sysv/
linux/
riscv/
dl-cache.h
       1  /* Support for reading /etc/ld.so.cache files written by Linux ldconfig.
       2     Copyright (C) 2003-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 <ldconfig.h>
      20  #include <assert.h>
      21  
      22  /* For now we only support the natural XLEN ABI length on all targets, so the
      23     only bits that need to go into ld.so.cache are the FLEG ABI length.  */
      24  #if defined __riscv_float_abi_double
      25  # define _DL_CACHE_DEFAULT_ID    (FLAG_RISCV_FLOAT_ABI_DOUBLE | FLAG_ELF_LIBC6)
      26  #else
      27  # define _DL_CACHE_DEFAULT_ID    (FLAG_RISCV_FLOAT_ABI_SOFT | FLAG_ELF_LIBC6)
      28  #endif
      29  
      30  #define _dl_cache_check_flags(flags)		    			\
      31    ((flags) == _DL_CACHE_DEFAULT_ID)
      32  
      33  /* If given a path to one of our library directories, adds every library
      34     directory via add_dir (), otherwise just adds the giver directory.  On
      35     RISC-V, libraries can be found in paths ending in:
      36       - /lib64/lp64d
      37       - /lib64/lp64
      38       - /lib32/ilp32d
      39       - /lib32/ilp32
      40       - /lib (only ld.so)
      41     so this will add all of those paths.
      42  
      43     According to Joseph Myers:
      44         My reasoning for that would be: generic autoconf-configured (etc.)
      45         software may only know about using the lib directory, so you want the
      46         lib directory to be searched regardless of the ABI - but it's also
      47         useful to be able to e.g. list /usr/local/lib in /etc/ld.so.conf for all
      48         architectures and have that automatically imply /usr/local/lib64/lp64d
      49         etc. so that libraries can be found that come from software that does
      50         use the ABI-specific directories.  */
      51  #define add_system_dir(dir) 						\
      52    do							    		\
      53      {									\
      54        static const char* lib_dirs[] = {					\
      55  	"/lib64/lp64d",							\
      56  	"/lib64/lp64",							\
      57  	"/lib32/ilp32d",						\
      58  	"/lib32/ilp32",							\
      59  	NULL,								\
      60        };								\
      61        const size_t lib_len = sizeof ("/lib") - 1;			\
      62        size_t len = strlen (dir);					\
      63        char path[len + 10];						\
      64        const char **ptr;							\
      65  									\
      66        memcpy (path, dir, len + 1);					\
      67  									\
      68        for (ptr = lib_dirs; *ptr != NULL; ptr++)				\
      69  	{								\
      70  	  const char *lib_dir = *ptr;					\
      71  	  size_t dir_len = strlen (lib_dir);				\
      72  									\
      73  	  if (len >= dir_len						\
      74  	      && !memcmp (path + len - dir_len, lib_dir, dir_len))	\
      75  	    {								\
      76  	      len -= dir_len - lib_len;					\
      77  	      path[len] = '\0';						\
      78  	      break;							\
      79  	    }								\
      80  	}								\
      81        add_dir (path);							\
      82        if (len >= lib_len						\
      83  	  && !memcmp (path + len - lib_len, "/lib", lib_len))		\
      84  	for (ptr = lib_dirs; *ptr != NULL; ptr++)			\
      85  	  {								\
      86  	    const char *lib_dir = *ptr;					\
      87  	    size_t dir_len = strlen (lib_dir);				\
      88  									\
      89  	    assert (dir_len >= lib_len);				\
      90  	    memcpy (path + len, lib_dir + lib_len,			\
      91  		    dir_len - lib_len + 1);				\
      92  	    add_dir (path);						\
      93  	  }								\
      94      } while (0)
      95  
      96  
      97  #include_next <dl-cache.h>