diff options
author | Florian Weimer <fweimer@redhat.com> | 2020-02-18 14:42:41 +0100 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2020-02-18 15:12:25 +0100 |
commit | f4349837d93b4dfe9ba09791e280ee2d6c99919f (patch) | |
tree | 2d9b57dc8a2b38bc369e0e0f89232046d8be38ca /elf | |
parent | 6e05978f0c30e52420e086cc3156655471e6fb0a (diff) | |
download | glibc-f4349837d93b4dfe9ba09791e280ee2d6c99919f.tar.gz glibc-f4349837d93b4dfe9ba09791e280ee2d6c99919f.tar.xz glibc-f4349837d93b4dfe9ba09791e280ee2d6c99919f.zip |
Introduce <elf-initfini.h> and ELF_INITFINI for all architectures
This supersedes the init_array sysdeps directory. It allows us to check for ELF_INITFINI in both C and assembler code, and skip DT_INIT and DT_FINI processing completely on newer architectures. A new header file is needed because <dl-machine.h> is incompatible with assembler code. <sysdep.h> is compatible with assembler code, but it cannot be included in all assembler files because on some architectures, it redefines register names, and some assembler files conflict with that. <elf-initfini.h> is replicated for legacy architectures which need DT_INIT/DT_FINI support. New architectures follow the generic default and disable it.
Diffstat (limited to 'elf')
-rw-r--r-- | elf/dl-fini.c | 5 | ||||
-rw-r--r-- | elf/dl-init.c | 8 |
2 files changed, 5 insertions, 8 deletions
diff --git a/elf/dl-fini.c b/elf/dl-fini.c index 226a6f077a..231db3d66d 100644 --- a/elf/dl-fini.c +++ b/elf/dl-fini.c @@ -19,6 +19,7 @@ #include <assert.h> #include <string.h> #include <ldsodefs.h> +#include <elf-initfini.h> /* Type of the constructor functions. */ @@ -117,7 +118,7 @@ _dl_fini (void) /* Is there a destructor function? */ if (l->l_info[DT_FINI_ARRAY] != NULL - || l->l_info[DT_FINI] != NULL) + || (ELF_INITFINI && l->l_info[DT_FINI] != NULL)) { /* When debugging print a message first. */ if (__builtin_expect (GLRO(dl_debug_mask) @@ -139,7 +140,7 @@ _dl_fini (void) } /* Next try the old-style destructor. */ - if (l->l_info[DT_FINI] != NULL) + if (ELF_INITFINI && l->l_info[DT_FINI] != NULL) DL_CALL_DT_FINI (l, l->l_addr + l->l_info[DT_FINI]->d_un.d_ptr); } diff --git a/elf/dl-init.c b/elf/dl-init.c index 55d528c7a5..1234611a1c 100644 --- a/elf/dl-init.c +++ b/elf/dl-init.c @@ -18,6 +18,7 @@ #include <stddef.h> #include <ldsodefs.h> +#include <elf-initfini.h> /* Type of the initializer. */ @@ -40,11 +41,6 @@ call_init (struct link_map *l, int argc, char **argv, char **env) && l->l_type == lt_executable) return; - /* Are there any constructors? */ - if (l->l_info[DT_INIT] == NULL - && __builtin_expect (l->l_info[DT_INIT_ARRAY] == NULL, 1)) - return; - /* Print a debug message if wanted. */ if (__glibc_unlikely (GLRO(dl_debug_mask) & DL_DEBUG_IMPCALLS)) _dl_debug_printf ("\ncalling init: %s\n\n", @@ -54,7 +50,7 @@ call_init (struct link_map *l, int argc, char **argv, char **env) - the one named by DT_INIT - the others in the DT_INIT_ARRAY. */ - if (l->l_info[DT_INIT] != NULL) + if (ELF_INITFINI && l->l_info[DT_INIT] != NULL) DL_CALL_DT_INIT(l, l->l_addr + l->l_info[DT_INIT]->d_un.d_ptr, argc, argv, env); /* Next see whether there is an array with initialization functions. */ |