This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: [PATCH] audit: put the correct st_value in pltexit callback
- From: Jiri Olsa <olsajiri at gmail dot com>
- To: Jiri Olsa <jolsa at redhat dot com>
- Cc: Ulrich Drepper <drepper at gmail dot com>, libc-alpha at sourceware dot org
- Date: Wed, 2 Feb 2011 14:20:45 +0100
- Subject: Re: [PATCH] audit: put the correct st_value in pltexit callback
- References: <20110121162155.GA28563@jolsa.brq.redhat.com><AANLkTikk-yUBFgG7qgq9qbkNay6cQaOsVD8AjESMwM9r@mail.gmail.com><20110122005628.GA2268@jolsa.Belkin>
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