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

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


all.

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

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

How can I make the library's call to malloc() direct to my target environment's malloc() routine?

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

Is it any way to change the exported function name? If so I can code my_malloc() first and export it as malloc() and link the library to that one:

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

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

More specifically, the library is one from linux distro so it depends on libc. But my environment is embedded one and has no libc library and malloc(), free(), ... are custom-implemented. Some are inline functions and some are library functions.

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

3 个解决方案

#1


30  

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:

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

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

--wrap = symbol对符号使用包装函数。任何未定义的符号引用都将解析为“__wrap_symbol”。对“__real_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".

这可以用于为系统功能提供包装器。包装函数应该被称为“__wrap_symbol”。如果希望调用系统函数,则应调用“__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.

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

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

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

#2


4  

I think the alias attribute might solve your problem:

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

#3


-1  

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
智能推荐

注意!

本站翻译的文章,版权归属于本站,未经许可禁止转摘,转摘请注明本文地址:http://www.silva-art.net/blog/2012/08/29/4dfca4f7a3baebf0f5222541c6414254.html



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告