在C中,是否可以将导出的函数名称更改为不同的名称?

时间:2012-08-29 07:38:13

标签: c linker inline static-linking

所有

我想链接一个调用malloc()函数的库。 但是,我的目标环境是不同的 malloc()作为内联函数提供。

如何让图书馆的malloc()直接致电 我的目标环境的malloc()例程?

是否可以更改导出的函数名称?如果是这样 我可以先对my_malloc()进行编码,然后将其导出为malloc()并进行链接 那个图书馆:

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

更具体地说, 这个库是linux发行版中的一个,所以它依赖于libc。 但我的环境是嵌入式的,没有libc库,malloc()free(),...是自定义实现的。一些是内联函数,一些是库函数。

3 个答案:

答案 0 :(得分:33)

GNU链接器(ld)支持--wrap=functionname参数。我只是引用手册页中的文档,因为它包含了一个应该完全符合您需要的示例:

  

- wrap = symbol使用符号的包装函数。任何未定义的符号引用都将解析为“__wrap_symbol”。对“__real_symbol”的任何未定义引用都将被解析为符号。

     

这可用于为系统功能提供包装器。包装函数应该被称为“__wrap_symbol”。如果它想调用系统函数,它应该调用“__real_symbol”。

     

这是一个简单的例子:

void *
__wrap_malloc (size_t c)
{
    printf ("malloc called with %zu\n", c);
    return __real_malloc (c);
}
  

如果您使用--wrap malloc将其他代码与此文件相关联,则所有对“malloc”的调用都会调用函数"__wrap_malloc“。调用”__real_malloc “in”__wrap_malloc“将调用真正的”malloc“函数。

     

您可能还希望提供“__real_malloc”功能,这样没有--wrap选项的链接就会成功。如果您这样做,则不应将“__real_malloc”的定义放在与“__wrap_malloc”相同的文件中;如果这样做,汇编器可以在链接器有机会将其包装到“malloc”之前解析调用。

答案 1 :(得分:4)

我认为alias属性可能会解决您的问题:

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

答案 2 :(得分:-1)

怎么样:

#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