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

Chu*_*ang 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);             
}
Run Code Online (Sandbox Code Playgroud)

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

Bjo*_*rnD 35

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);
}
Run Code Online (Sandbox Code Playgroud)

如果您使用此文件链接其他代码--wrap malloc,则所有对" malloc"的调用都将调用该函数"__wrap_malloc"." __real_malloc"中的" __wrap_malloc"将调用真正的" malloc"函数.

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