Chul-Woong Yang
Chul-Woong Yang

Reputation: 1243

In C, is it possible to change exported function name to different one?

all.

I want to link a library which calls malloc() function. However, my target environment is different one and malloc() is supplied as inline-function.

How can I make the library's call to malloc() direct to my target environment's malloc() routine?

Is it any way to change the exported function name? If so I can code my_malloc() first and export it as malloc() and link the library to that one:

#include <my_environment.h>  // malloc() is inline function declared there 
void my_malloc (void) {
   malloc (void);             
}

More specifically, the library is one from linux distro so it depends on libc. But my environment is embedded one and has no libc library and malloc(), free(), ... are custom-implemented. Some are inline functions and some are library functions.

Upvotes: 15

Views: 7371

Answers (3)

nshy
nshy

Reputation: 1074

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

Upvotes: -1

BjoernD
BjoernD

Reputation: 4780

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".

Upvotes: 43

user1202136
user1202136

Reputation: 11567

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

Upvotes: 4

Related Questions