You could hijack the GOT entry, but that assumes the symbol has been resolved first (either LD_BIND_NOW or the function has been called at least once). You could also use LD_PRELOAD. On Jul 04, 2014 04:12 PM +0400, Ivan A. Kosarev wrote: > Hello, > > Consider the following: > > --- > #include <stdio.h> > #include <string.h> > > extern "C" void* memset(void *block, int c, size_t size) > __attribute__((weak, alias("__int_memset"), visibility("default"))); > > extern "C" __attribute__((visibility("default"))) > void* __int_memset(void *block, int c, size_t size) { > puts("Hello"); > return NULL; > } > > int main() > { > void *(*F)(void *b, int c, size_t len) = memset; > char a[5]; > memset(a, 0, sizeof(a)); > F(a, 0, sizeof(a)); > return 0; > } > --- > > It intercepts the memset() calls without issue on both x86-64 FreeBSD > 9.2 and Linux. However, with the -fPIC option specified in the cc's > command line, only the first (direct) call work on FreeBSD, but not the > second (indirect) one. Note is that on Linux both the calls are > intercepted--no matter whether the -fPIC option is specified or not. > > The question is: is there a way to intercept indirect calls on FreeBSD? > > Thanks, > > -- > > _______________________________________________ > freebsd-current_at_freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-current > To unsubscribe, send any mail to "freebsd-current-unsubscribe_at_freebsd.org"
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:40:50 UTC