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/dl-audit.c | |
parent | eff687e8462b0eaf65992a6031b54a4b1cd16796 (diff) | |
download | glibc-8c0664e2b861fd3789602cc0b0b1922b0e20cb3a.tar glibc-8c0664e2b861fd3789602cc0b0b1922b0e20cb3a.tar.gz glibc-8c0664e2b861fd3789602cc0b0b1922b0e20cb3a.tar.bz2 glibc-8c0664e2b861fd3789602cc0b0b1922b0e20cb3a.zip |
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/dl-audit.c')
-rw-r--r-- | elf/dl-audit.c | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/elf/dl-audit.c b/elf/dl-audit.c index 15250c67e8..152712b12f 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; + } +} |