Date: Sun, 22 Nov 1998 02:02:43 -0500 From: "Marty Leisner" <leisner@rochester.rr.com> To: Nate Williams <nate@mt.sri.com> Cc: hackers@FreeBSD.ORG Subject: Re: Wrapping a function Message-ID: <199811220702.CAA01604@rochester.rr.com> In-Reply-To: Your message of "Mon, 16 Nov 1998 22:17:47 MST." <199811170517.WAA22627@mt.sri.com>
next in thread | previous in thread | raw e-mail | index | archive | help
In recent gnu ld's:
`--wrap SYMBOL'
Use a wrapper function for SYMBOL. Any undefined reference to
SYMBOL will be resolved to `__wrap_SYMBOL'. Any undefined
reference to `__real_SYMBOL' will be resolved to SYMBOL.
This can be used to provide a wrapper for a system function. The
wrapper function should be called `__wrap_SYMBOL'. If it wishes
to call the system function, it should call `__real_SYMBOL'.
Here is a trivial example:
void *
__wrap_malloc (int c)
{
printf ("malloc called with %ld\n", c);
return __real_malloc (c);
}
If you link other code with this file using `--wrap malloc', then
all calls to `malloc' will call the function `__wrap_malloc'
instead. The call to `__real_malloc' in `__wrap_malloc' will call
the real `malloc' function.
You may wish to provide a `__real_malloc' function as well, so that
links without the `--wrap' option will succeed. If you do this,
you should not put the definition of `__real_malloc' in the same
file as `__wrap_malloc'; if you do, the assembler may resolve the
call before the linker has a chance to wrap it to `malloc'.
In message <199811170517.WAA22627@mt.sri.com>, you write:
>Does anyone have an easy way of 'wrapping' an already existing library
>function so that any programs linked against your .o will call your
>function, but so your function can call the 'real' library function?
>
>Example:
>
>my_malloc.c:
>
>void *malloc(size_t size)
>{
> void *ret;
>
> printf("Calling malloc\n");
> ret = REALMALLOC(size);
> printf("Leaving malloc\n");
> return ret;
>}
>
>Ignoring all of the functions where there is loss of errno and such, are
>they any good ideas? Note, the use of the dl* functions is explicitly
>not allowed since those happen to be the functions I want to wrap in
>this case.
>
>I'm at a loss here how to do this in C, so any good hacks are welcomed.
>
>
>Nate
>
>To Unsubscribe: send mail to majordomo@FreeBSD.org
>with "unsubscribe freebsd-hackers" in the body of the message
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199811220702.CAA01604>
