| 1 | /* Information collection during ld.so startup. |
| 2 | Copyright (C) 1995-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 | #ifndef _DL_MAIN |
| 20 | #define _DL_MAIN |
| 21 | |
| 22 | #include <ldsodefs.h> |
| 23 | #include <limits.h> |
| 24 | #include <stdlib.h> |
| 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, |
| 66 | rtld_mode_list_tunables, rtld_mode_list_diagnostics, rtld_mode_help, |
| 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 | |
| 78 | /* Where library_path comes from. LD_LIBRARY_PATH or --library-path. */ |
| 79 | const char *library_path_source; |
| 80 | |
| 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 | |
| 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 | |
| 95 | enum rtld_mode mode; |
| 96 | |
| 97 | /* True if any of the debugging options is enabled. */ |
| 98 | bool any_debug; |
| 99 | |
| 100 | /* True if information about versions has to be printed. */ |
| 101 | bool version_info; |
| 102 | }; |
| 103 | |
| 104 | /* Helper function to invoke _dl_init_paths with the right arguments |
| 105 | from *STATE. */ |
| 106 | static inline void |
| 107 | call_init_paths (const struct dl_main_state *state) |
| 108 | { |
| 109 | _dl_init_paths (state->library_path, state->library_path_source, |
| 110 | state->glibc_hwcaps_prepend, state->glibc_hwcaps_mask); |
| 111 | } |
| 112 | |
| 113 | /* Print ld.so usage information and exit. */ |
| 114 | _Noreturn void _dl_usage (const char *argv0, const char *wrong_option) |
| 115 | attribute_hidden; |
| 116 | |
| 117 | /* Print ld.so version information and exit. */ |
| 118 | _Noreturn void _dl_version (void) attribute_hidden; |
| 119 | |
| 120 | /* Print ld.so --help output and exit. */ |
| 121 | _Noreturn void _dl_help (const char *argv0, struct dl_main_state *state) |
| 122 | attribute_hidden; |
| 123 | |
| 124 | /* Print a diagnostics dump. */ |
| 125 | _Noreturn void _dl_print_diagnostics (char **environ) attribute_hidden; |
| 126 | |
| 127 | #endif /* _DL_MAIN */ |
| 128 | |