all.
I want to link a library which calls malloc()
function.
However, my target environment is different one and
malloc()
is supplied as in
The GNU linker (ld) supports a --wrap=functionname
parameter. I'll simply quote the documentation from the man page as it includes an example which should do exactly what you need:
--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 (size_t c)
{
printf ("malloc called with %zu\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
".
What about:
#define malloc my_malloc
#include <my_environment.h>
#undef malloc
int malloc(size_t sz)
{
return my_malloc(sz);
}
#define malloc my_malloc
// use your malloc here
I think the alias
attribute might solve your problem:
alias ("target")
The alias attribute causes the declaration to be emitted as an alias for another symbol, which must be specified. For instance,
void __f () { /* Do something. */; }
void f () __attribute__ ((weak, alias ("__f")));
defines `f' to be a weak alias for `__f'. In C++, the mangled name for the target must be used. It is an error if `__f' is not defined in the same translation unit.
Not all target machines support this attribute.
http://gcc.gnu.org/onlinedocs/gcc/Function-Attributes.html