在C,是有可能改变的导出函数的名字不同吗?(In C, is it possible to chan

2019-06-27 12:29发布

所有。

我要连结调用库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() ,......是定制实现的。 有些是内联函数,有些是库函数。

Answer 1:

GNU链接器(LD)支持--wrap=functionname参数。 我只是引述该名男子页的文件,因为它包括哪些应该做的正是你需要的一个例子:

--wrap =符号使用包装函数的符号。 任何未定义的参考符号将被解析为“__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在”“ __wrap_malloc ”将调用真正的“ malloc ”功能。

您可能希望提供一个“ __real_malloc ”功能一样,所以,如果没有链接--wrap选项会成功。 如果你这样做,你不应该把“的定义__real_malloc ”在同一个文件为“ __wrap_malloc ”; 如果你这样做,汇编器可能会解决呼叫的连接器有机会就换到“之前malloc ”。



Answer 2:

我觉得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



Answer 3:

关于什么:

#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


文章来源: In C, is it possible to change exported function name to different one?