]>
Commit | Line | Data |
---|---|---|
2bf9e641 | 1 | /* Information collection during ld.so startup. |
581c785b | 2 | Copyright (C) 1995-2022 Free Software Foundation, Inc. |
2bf9e641 FW |
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 | #ifndef _DL_MAIN | |
20 | #define _DL_MAIN | |
21 | ||
9590a71a | 22 | #include <ldsodefs.h> |
2bf9e641 | 23 | #include <limits.h> |
9590a71a | 24 | #include <stdlib.h> |
2bf9e641 FW |
25 | |
26 | /* Length limits for names and paths, to protect the dynamic linker, | |
27 | particularly when __libc_enable_secure is active. */ | |
28 | #ifdef NAME_MAX | |
29 | # define SECURE_NAME_LIMIT NAME_MAX | |
30 | #else | |
31 | # define SECURE_NAME_LIMIT 255 | |
32 | #endif | |
33 | #ifdef PATH_MAX | |
34 | # define SECURE_PATH_LIMIT PATH_MAX | |
35 | #else | |
36 | # define SECURE_PATH_LIMIT 1024 | |
37 | #endif | |
38 | ||
39 | /* Strings containing colon-separated lists of audit modules. */ | |
40 | struct audit_list | |
41 | { | |
42 | /* Array of strings containing colon-separated path lists. Each | |
43 | audit module needs its own namespace, so pre-allocate the largest | |
44 | possible list. */ | |
45 | const char *audit_strings[DL_NNS]; | |
46 | ||
47 | /* Number of entries added to audit_strings. */ | |
48 | size_t length; | |
49 | ||
50 | /* Index into the audit_strings array (for the iteration phase). */ | |
51 | size_t current_index; | |
52 | ||
53 | /* Tail of audit_strings[current_index] which still needs | |
54 | processing. */ | |
55 | const char *current_tail; | |
56 | ||
57 | /* Scratch buffer for returning a name which is part of the strings | |
58 | in audit_strings. */ | |
59 | char fname[SECURE_NAME_LIMIT]; | |
60 | }; | |
61 | ||
62 | /* This is a list of all the modes the dynamic loader can be in. */ | |
63 | enum rtld_mode | |
64 | { | |
65 | rtld_mode_normal, rtld_mode_list, rtld_mode_verify, rtld_mode_trace, | |
851f32cf | 66 | rtld_mode_list_tunables, rtld_mode_list_diagnostics, rtld_mode_help, |
2bf9e641 FW |
67 | }; |
68 | ||
69 | /* Aggregated state information extracted from environment variables | |
70 | and the ld.so command line. */ | |
71 | struct dl_main_state | |
72 | { | |
73 | struct audit_list audit_list; | |
74 | ||
75 | /* The library search path. */ | |
76 | const char *library_path; | |
77 | ||
27316f4a FW |
78 | /* Where library_path comes from. LD_LIBRARY_PATH or --library-path. */ |
79 | const char *library_path_source; | |
80 | ||
2bf9e641 FW |
81 | /* The list preloaded objects from LD_PRELOAD. */ |
82 | const char *preloadlist; | |
83 | ||
84 | /* The preload list passed as a command argument. */ | |
85 | const char *preloadarg; | |
86 | ||
dad90d52 FW |
87 | /* Additional glibc-hwcaps subdirectories to search first. |
88 | Colon-separated list. */ | |
89 | const char *glibc_hwcaps_prepend; | |
90 | ||
91 | /* Mask for the internal glibc-hwcaps subdirectories. | |
92 | Colon-separated list. */ | |
93 | const char *glibc_hwcaps_mask; | |
94 | ||
2bf9e641 FW |
95 | enum rtld_mode mode; |
96 | ||
d7703d31 AZ |
97 | /* True if program should be also printed for rtld_mode_trace. */ |
98 | bool mode_trace_program; | |
99 | ||
2bf9e641 FW |
100 | /* True if any of the debugging options is enabled. */ |
101 | bool any_debug; | |
102 | ||
103 | /* True if information about versions has to be printed. */ | |
104 | bool version_info; | |
105 | }; | |
106 | ||
107 | /* Helper function to invoke _dl_init_paths with the right arguments | |
108 | from *STATE. */ | |
109 | static inline void | |
110 | call_init_paths (const struct dl_main_state *state) | |
111 | { | |
dad90d52 FW |
112 | _dl_init_paths (state->library_path, state->library_path_source, |
113 | state->glibc_hwcaps_prepend, state->glibc_hwcaps_mask); | |
2bf9e641 FW |
114 | } |
115 | ||
9590a71a | 116 | /* Print ld.so usage information and exit. */ |
e0f1a58f FW |
117 | _Noreturn void _dl_usage (const char *argv0, const char *wrong_option) |
118 | attribute_hidden; | |
119 | ||
542923d9 FW |
120 | /* Print ld.so version information and exit. */ |
121 | _Noreturn void _dl_version (void) attribute_hidden; | |
122 | ||
e0f1a58f FW |
123 | /* Print ld.so --help output and exit. */ |
124 | _Noreturn void _dl_help (const char *argv0, struct dl_main_state *state) | |
125 | attribute_hidden; | |
9590a71a | 126 | |
851f32cf FW |
127 | /* Print a diagnostics dump. */ |
128 | _Noreturn void _dl_print_diagnostics (char **environ) attribute_hidden; | |
129 | ||
2bf9e641 | 130 | #endif /* _DL_MAIN */ |