[PATCH] audit: put the correct st_value in pltexit callback

Jiri Olsa olsajiri@gmail.com
Wed Feb 2 13:49:00 GMT 2011


On Sat, Jan 22, 2011 at 1:56 AM, Jiri Olsa <jolsa@redhat.com> wrote:
> On Fri, Jan 21, 2011 at 12:52:52PM -0500, Ulrich Drepper wrote:
>> On Fri, Jan 21, 2011 at 11:21, Jiri Olsa <jolsa@redhat.com> wrote:
>> > the ElfW(Sym) param in the PLT entry callback gives
>> > different st_value than the same symbol in adjacent
>> > PLT exit callback.
>>
>> Where is the test case showing that there is a problem in the first place?
>
> sure.. running following program
>
> ---
> #include <stdio.h>
> #include <stdlib.h>
>
> int main(int argc, char **argv)
> {
>        printf("krava\n");
>        malloc(100);
>        return 0;
> }
> ---
>
> with attached library (used via LD_AUDIT env),
> I got following:
>
> [jolsa@jolsa pex]$ sudo ./pex/runner
> /home/jolsa/projects/latrace/pex/root /ex
> ROOT '/home/jolsa/projects/latrace/pex/root' app '/ex'
> entry __libc_start_main 0x7f1be788fd80
> entry puts 0x7f1be78d6700
> krava
> exit  puts 0x65700
> entry malloc 0x7f1be78e7c90
> exit  malloc 0x76c90
>
>
> with the fix applied I got:
>
> [jolsa@jolsa pex]$ sudo ./pex/runner
> /home/jolsa/projects/latrace/pex/root /ex
> ROOT '/home/jolsa/projects/latrace/pex/root' app '/ex'
> entry __libc_start_main 0x7f6197ca6d80
> entry puts 0x7f6197ced700
> krava1
> exit  puts 0x7f6197ced700
> entry malloc 0x7f6197cfec90
> exit  malloc 0x7f6197cfec90
>
>
> please let me know if you need more info
>
> hope this helps,
> jirka
>
>
> ---
> #include <link.h>
> #include <dlfcn.h>
> #include <stdio.h>
> #include <sys/time.h>
>
>
> unsigned int la_version (unsigned int v)
> {
>        return v;
> }
>
> unsigned int la_objopen(struct link_map *l, Lmid_t a, uintptr_t *cookie)
> {
>        return 3;
> }
>
> uintptr_t la_symbind32(Elf32_Sym *sym, unsigned int ndx, uintptr_t *refcook,
>          uintptr_t *defcook, unsigned int *flags, const char *symname)
> {
>        return sym->st_value;
> }
>
> uintptr_t la_symbind64(Elf64_Sym *sym, unsigned int ndx, uintptr_t *refcook,
>                uintptr_t *defcook, unsigned int *flags, const char *symname)
> {
>        return sym->st_value;
> }
>
> static int depth_current = 0;
> static int depth_vfork   = -1;
> Elf64_Addr la_x86_64_gnu_pltenter (Elf64_Sym *__sym,
>                                          unsigned int __ndx,
>                                          uintptr_t *__refcook,
>                                          uintptr_t *__defcook,
>                                          La_x86_64_regs *__regs,
>                                          unsigned int *__flags,
>                                          const char *__symname,
>                                          long int *__framesizep)
> {
>        printf("entry %s %p\n", __symname, __sym->st_value);
>        fflush(NULL);
>        *__framesizep = 100;
>        return __sym->st_value;
> }
>
> unsigned int la_x86_64_gnu_pltexit (Elf64_Sym *__sym,
>                                           unsigned int __ndx,
>                                           uintptr_t *__refcook,
>                                           uintptr_t *__defcook,
>                                           const La_x86_64_regs *__inregs,
>                                           La_x86_64_retval *__outregs,
>                                           const char *__symname)
> {
>        printf("exit  %s %p\n", __symname, __sym->st_value);
>        fflush(NULL);
>        return 0;
> }
>
> void la_activity(uintptr_t *cookie, unsigned int act)
> {
> }
>
> char* la_objsearch(const char *name, uintptr_t *cookie, unsigned int flag)
> {
>        return (char*) name;
> }
>
> void la_preinit(uintptr_t *__cookie)
> {
> }
>
> unsigned int la_objclose(uintptr_t *__cookie)
> {
>        return 0;
> }
>

hi, any news?

thanks,
jirka



More information about the Libc-alpha mailing list