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

前端 未结 3 1268
故里飘歌
故里飘歌 2020-12-17 16:34

all.

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

相关标签:
3条回答
  • 2020-12-17 16:47

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

    0 讨论(0)
  • 2020-12-17 17:06

    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
    
    0 讨论(0)
  • 2020-12-17 17:07

    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

    0 讨论(0)
提交回复
热议问题