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

所有。

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

如何使库对malloc()的调用直接指向我的目标环境的malloc()例程?

是否可以通过任何方式更改导出的函数名称? 如果是这样,我可以先编码my_malloc()并将其导出为malloc()并将库链接到该库:

 #include  // malloc() is inline function declared there void my_malloc (void) { malloc (void); } 

更具体地说,该库是来自linux发行版的库,因此它依赖于libc。 但我的环境是嵌入式的,没有libc库, malloc()free() ,…是自定义实现的。 一些是内联函数,一些是库函数。

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

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

这可以用于为系统function提供包装器。 包装函数应该被称为“__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 ”中对“ __wrap_malloc ”的调用将调用真正的“ malloc ”函数。

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

我认为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

关于什么:

 #define malloc my_malloc #include  #undef malloc int malloc(size_t sz) { return my_malloc(sz); } #define malloc my_malloc // use your malloc here