Reputation: 2566
I have a library which implements malloc
. I want to override this function with a custom malloc function that does something and then calls the malloc function of the library.
How can i redefine the symbol malloc
without losing the function from the library?
Upvotes: 1
Views: 2032
Reputation: 108968
If both functions have the same prototype, you can use a function pointer
#include <stdlib.h>
void *my_malloc(size_t len) {
return malloc(len);
}
int main(void) {
void *(*malloc_pointer)(size_t);
malloc_pointer = my_malloc;
malloc_pointer(42); // uses my_malloc;
malloc_pointer = malloc;
malloc_pointer(42); // uses malloc;
return 0;
}
Upvotes: 0
Reputation: 2566
The GNU linker provides the --wrap symbol
flag to wrap a custom function around an existing function.
As you can read here, last flag: http://ieee.uwaterloo.ca/coldfire/gcc-doc/docs/ld_3.html#SEC3
--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 tosymbol
. This can 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 tomalloc
will call the function__wrap_malloc
instead. The call to__real_malloc
in__wrap_malloc
will call the realmalloc
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.
Upvotes: 3
Reputation: 351
it is not a good practice to create new functions with the names of library functions. If at all you want to create such a function, your new function will work fine but you can not use the library function. If you want to create your own version of printf(), you can do so but you can not use the original printf() function as you are overriding.
Upvotes: 0