My intent is to write a tool that waits for another process to write
client addresses to a pipe, and then execute the specified function
with a fixed number of arguments.  I'm unconcerned about whether the
specified function actually has the assumed arity or not, though.  I
tried the following, but it seems that the function is not called.
However, this is what I am wanting to do.
---------------------------------------------
static void SE_(start_client_code)(ThreadId tid, ULong blocks_dispatched) {
  if (!client_running && tid == client_thread_id) {
    VG_(umsg)
    ("Thread %u is starting executing at instruction 0x%lx with "
     "blocks_dispatched=%llu\n",
     tid, VG_(get_IP)(tid), blocks_dispatched);
    client_running = True;
    VG_(umsg)("Thread %u is about to call target function\n", tid);
    OrigFn fn;
    fn.nraddr = (Addr)0x401145; // Function address in client
    CALL_FN_v_v(fn);  // Assume no arguments are passed in
    VG_(umsg)("Thread %u returned\n", tid);
    client_running = False;
  }
}

static void SE_(pre_clo_init)(void) {
    ....
    VG_(track_start_client_code)(SE_(start_client_code));
}

VG_DETERMINE_INTERFACE_VERSION(SE_(pre_clo_init))
--------------------------------------
Reading the documentation, it seems that CALL_FN_v_v should be called
from the client code, but I want to use my tool with any binary.  I
also tried using the VG_(set_IP) function (admittedly against the
valgrind tool contract), but that seemingly didn't work either.  Any
other thoughts, or is this just something I cannot do with valgrind?

On Tue, Mar 3, 2020 at 11:01 AM Derrick McKee <derrick.mc...@gmail.com> wrote:
>
> I am also interested in instrumenting the guest binary, as well as
> change which guest function I execute at run time.  So LD_PRELOAD
> won't help me here.
>
> On Tue, Mar 3, 2020 at 10:41 AM John Reiser <jrei...@bitwagon.com> wrote:
> >
> > > I am trying to make a tool that intercepts the call to main, and then
> > > call an arbitrary function within the guest with arbitrary function
> > > arguments.
> >
> > This can be done without valgrind by using LD_PRELOAD environment variable
> > and RTLD_NEXT (see "man dlsym"):
> >
> >      LD_PRELOAD=main_interceptor.so  ./my_app args...
> >
> > where main_interceptor.so is a shared library that has a function main()
> > and that can call the original main() by using dlsym(RTLD_NEXT, "main").
> >
> >
> >
> >
> >
> >
> >
> > _______________________________________________
> > Valgrind-users mailing list
> > Valgrind-users@lists.sourceforge.net
> > https://lists.sourceforge.net/lists/listinfo/valgrind-users
>
>
>
> --
> Derrick McKee
> Phone: (703) 957-9362
> Email: derrick.mc...@gmail.com



-- 
Derrick McKee
Phone: (703) 957-9362
Email: derrick.mc...@gmail.com


_______________________________________________
Valgrind-users mailing list
Valgrind-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/valgrind-users

Reply via email to