diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2021-07-22 18:02:42 -0300 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2021-12-28 08:40:38 -0300 |
commit | 8c0664e2b861fd3789602cc0b0b1922b0e20cb3a (patch) | |
tree | 8c6812231676fd89e69282941d0a59a2087a0ed1 /elf | |
parent | eff687e8462b0eaf65992a6031b54a4b1cd16796 (diff) | |
download | glibc-8c0664e2b861fd3789602cc0b0b1922b0e20cb3a.zip glibc-8c0664e2b861fd3789602cc0b0b1922b0e20cb3a.tar.gz glibc-8c0664e2b861fd3789602cc0b0b1922b0e20cb3a.tar.bz2 |
elf: Add _dl_audit_pltexit
It consolidates the code required to call la_pltexit audit
callback.
Checked on x86_64-linux-gnu, i686-linux-gnu, and aarch64-linux-gnu.
Reviewed-by: Florian Weimer <fweimer@redhat.com>
Diffstat (limited to 'elf')
-rw-r--r-- | elf/dl-audit.c | 47 | ||||
-rw-r--r-- | elf/dl-runtime.c | 69 | ||||
-rw-r--r-- | elf/dl-support.c | 8 |
3 files changed, 58 insertions, 66 deletions
diff --git a/elf/dl-audit.c b/elf/dl-audit.c index 15250c6..152712b 100644 --- a/elf/dl-audit.c +++ b/elf/dl-audit.c @@ -20,6 +20,8 @@ #include <link.h> #include <ldsodefs.h> #include <dl-machine.h> +#include <dl-runtime.h> +#include <dl-fixup-attribute.h> void _dl_audit_activity_map (struct link_map *l, int action) @@ -320,3 +322,48 @@ _dl_audit_pltenter (struct link_map *l, struct reloc_result *reloc_result, *value = DL_FIXUP_ADDR_VALUE (sym.st_value); } + +void +DL_ARCH_FIXUP_ATTRIBUTE +_dl_audit_pltexit (struct link_map *l, ElfW(Word) reloc_arg, + const void *inregs, void *outregs) +{ + const uintptr_t pltgot = (uintptr_t) D_PTR (l, l_info[DT_PLTGOT]); + + /* This is the address in the array where we store the result of previous + relocations. */ + // XXX Maybe the bound information must be stored on the stack since + // XXX with bind_not a new value could have been stored in the meantime. + struct reloc_result *reloc_result = + &l->l_reloc_result[reloc_index (pltgot, reloc_arg, sizeof (PLTREL))]; + ElfW(Sym) *defsym = ((ElfW(Sym) *) D_PTR (reloc_result->bound, + l_info[DT_SYMTAB]) + + reloc_result->boundndx); + + /* Set up the sym parameter. */ + ElfW(Sym) sym = *defsym; + sym.st_value = DL_FIXUP_VALUE_ADDR (reloc_result->addr); + + /* Get the symbol name. */ + const char *strtab = (const void *) D_PTR (reloc_result->bound, + l_info[DT_STRTAB]); + const char *symname = strtab + sym.st_name; + + struct audit_ifaces *afct = GLRO(dl_audit); + for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) + { + if (afct->ARCH_LA_PLTEXIT != NULL + && (reloc_result->enterexit + & (LA_SYMB_NOPLTEXIT >> (2 * cnt))) == 0) + { + struct auditstate *l_state = link_map_audit_state (l, cnt); + struct auditstate *bound_state + = link_map_audit_state (reloc_result->bound, cnt); + afct->ARCH_LA_PLTEXIT (&sym, reloc_result->boundndx, + &l_state->cookie, &bound_state->cookie, + inregs, outregs, symname); + } + + afct = afct->next; + } +} diff --git a/elf/dl-runtime.c b/elf/dl-runtime.c index dfedeaf..e42f6e8 100644 --- a/elf/dl-runtime.c +++ b/elf/dl-runtime.c @@ -16,8 +16,6 @@ License along with the GNU C Library; if not, see <https://www.gnu.org/licenses/>. */ -#define IN_DL_RUNTIME 1 /* This can be tested in dl-machine.h. */ - #include <alloca.h> #include <assert.h> #include <stdlib.h> @@ -31,19 +29,6 @@ #include <dl-runtime.h> -#if (!ELF_MACHINE_NO_RELA && !defined ELF_MACHINE_PLT_REL) \ - || ELF_MACHINE_NO_REL -# define PLTREL ElfW(Rela) -#else -# define PLTREL ElfW(Rel) -#endif - -/* The fixup functions might have need special attributes. If none - are provided define the macro as empty. */ -#ifndef ARCH_FIXUP_ATTRIBUTE -# define ARCH_FIXUP_ATTRIBUTE -#endif - /* This function is called through a special trampoline from the PLT the first time each PLT entry is called. We must perform the relocation specified in the PLT of the given shared object, and return the resolved @@ -52,7 +37,7 @@ function. */ DL_FIXUP_VALUE_TYPE -attribute_hidden __attribute ((noinline)) ARCH_FIXUP_ATTRIBUTE +attribute_hidden __attribute ((noinline)) DL_ARCH_FIXUP_ATTRIBUTE _dl_fixup ( # ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS ELF_MACHINE_RUNTIME_FIXUP_ARGS, @@ -148,7 +133,8 @@ _dl_fixup ( #ifndef PROF DL_FIXUP_VALUE_TYPE -__attribute ((noinline)) ARCH_FIXUP_ATTRIBUTE +__attribute ((noinline)) +DL_ARCH_FIXUP_ATTRIBUTE _dl_profile_fixup ( #ifdef ELF_MACHINE_RUNTIME_FIXUP_ARGS ELF_MACHINE_RUNTIME_FIXUP_ARGS, @@ -332,52 +318,3 @@ _dl_profile_fixup ( } #endif /* PROF */ - - -#include <stdio.h> -void -ARCH_FIXUP_ATTRIBUTE -_dl_call_pltexit (struct link_map *l, ElfW(Word) reloc_arg, - const void *inregs, void *outregs) -{ -#ifdef SHARED - const uintptr_t pltgot = (uintptr_t) D_PTR (l, l_info[DT_PLTGOT]); - - /* This is the address in the array where we store the result of previous - relocations. */ - // XXX Maybe the bound information must be stored on the stack since - // XXX with bind_not a new value could have been stored in the meantime. - struct reloc_result *reloc_result = - &l->l_reloc_result[reloc_index (pltgot, reloc_arg, sizeof (PLTREL))]; - ElfW(Sym) *defsym = ((ElfW(Sym) *) D_PTR (reloc_result->bound, - l_info[DT_SYMTAB]) - + reloc_result->boundndx); - - /* Set up the sym parameter. */ - ElfW(Sym) sym = *defsym; - sym.st_value = DL_FIXUP_VALUE_ADDR (reloc_result->addr); - - /* Get the symbol name. */ - const char *strtab = (const void *) D_PTR (reloc_result->bound, - l_info[DT_STRTAB]); - const char *symname = strtab + sym.st_name; - - struct audit_ifaces *afct = GLRO(dl_audit); - for (unsigned int cnt = 0; cnt < GLRO(dl_naudit); ++cnt) - { - if (afct->ARCH_LA_PLTEXIT != NULL - && (reloc_result->enterexit - & (LA_SYMB_NOPLTEXIT >> (2 * cnt))) == 0) - { - struct auditstate *l_state = link_map_audit_state (l, cnt); - struct auditstate *bound_state - = link_map_audit_state (reloc_result->bound, cnt); - afct->ARCH_LA_PLTEXIT (&sym, reloc_result->boundndx, - &l_state->cookie, &bound_state->cookie, - inregs, outregs, symname); - } - - afct = afct->next; - } -#endif -} diff --git a/elf/dl-support.c b/elf/dl-support.c index 98d5d8d..d2aa52d 100644 --- a/elf/dl-support.c +++ b/elf/dl-support.c @@ -436,3 +436,11 @@ _dl_get_dl_main_map (void) return &_dl_main_map; } #endif + +/* This is used by _dl_runtime_profile, not used on static code. */ +void +DL_ARCH_FIXUP_ATTRIBUTE +_dl_audit_pltexit (struct link_map *l, ElfW(Word) reloc_arg, + const void *inregs, void *outregs) +{ +} |