diff options
author | Florian Weimer <fweimer@redhat.com> | 2020-10-08 10:57:09 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2020-10-08 12:05:47 +0200 |
commit | 2bf9e641fd50ec34b04b70829679abf64fc0ed78 (patch) | |
tree | 9eaebbb027ecf478a6bb62ac54309ed3166cf529 /elf/dl-main.h | |
parent | 72d36ffd7db55ae599f4c77feb0eae25a0f3714e (diff) | |
download | glibc-2bf9e641fd50ec34b04b70829679abf64fc0ed78.zip glibc-2bf9e641fd50ec34b04b70829679abf64fc0ed78.tar.gz glibc-2bf9e641fd50ec34b04b70829679abf64fc0ed78.tar.bz2 |
elf: Extract command-line/environment variables state from rtld.c
Introduce struct dl_main_state and move it to <dl-main.h>. Rename
enum mode to enum rtld_mode and add the rtld_mode_ prefix to the enum
constants.
This avoids the need for putting state that is only needed during
startup into the ld.so data segment.
Diffstat (limited to 'elf/dl-main.h')
-rw-r--r-- | elf/dl-main.h | 98 |
1 files changed, 98 insertions, 0 deletions
diff --git a/elf/dl-main.h b/elf/dl-main.h new file mode 100644 index 0000000..bcc9bcf --- /dev/null +++ b/elf/dl-main.h @@ -0,0 +1,98 @@ +/* Information collection during ld.so startup. + Copyright (C) 1995-2020 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +#ifndef _DL_MAIN +#define _DL_MAIN + +#include <limits.h> + +/* Length limits for names and paths, to protect the dynamic linker, + particularly when __libc_enable_secure is active. */ +#ifdef NAME_MAX +# define SECURE_NAME_LIMIT NAME_MAX +#else +# define SECURE_NAME_LIMIT 255 +#endif +#ifdef PATH_MAX +# define SECURE_PATH_LIMIT PATH_MAX +#else +# define SECURE_PATH_LIMIT 1024 +#endif + +/* Strings containing colon-separated lists of audit modules. */ +struct audit_list +{ + /* Array of strings containing colon-separated path lists. Each + audit module needs its own namespace, so pre-allocate the largest + possible list. */ + const char *audit_strings[DL_NNS]; + + /* Number of entries added to audit_strings. */ + size_t length; + + /* Index into the audit_strings array (for the iteration phase). */ + size_t current_index; + + /* Tail of audit_strings[current_index] which still needs + processing. */ + const char *current_tail; + + /* Scratch buffer for returning a name which is part of the strings + in audit_strings. */ + char fname[SECURE_NAME_LIMIT]; +}; + +/* This is a list of all the modes the dynamic loader can be in. */ +enum rtld_mode + { + rtld_mode_normal, rtld_mode_list, rtld_mode_verify, rtld_mode_trace, + }; + +/* Aggregated state information extracted from environment variables + and the ld.so command line. */ +struct dl_main_state +{ + struct audit_list audit_list; + + /* The library search path. */ + const char *library_path; + + /* The list preloaded objects from LD_PRELOAD. */ + const char *preloadlist; + + /* The preload list passed as a command argument. */ + const char *preloadarg; + + enum rtld_mode mode; + + /* True if any of the debugging options is enabled. */ + bool any_debug; + + /* True if information about versions has to be printed. */ + bool version_info; +}; + +/* Helper function to invoke _dl_init_paths with the right arguments + from *STATE. */ +static inline void +call_init_paths (const struct dl_main_state *state) +{ + _dl_init_paths (state->library_path); +} + +#endif /* _DL_MAIN */ |