Warning: This file is not a C or C++ file. It does not have highlighting.

1/* Support for reading /etc/ld.so.cache files written by Linux ldconfig.
2 Copyright (C) 2003-2022 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>
98

Warning: This file is not a C or C++ file. It does not have highlighting.

source code of glibc/sysdeps/unix/sysv/linux/riscv/dl-cache.h