[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