13

全部。

我想链接一个调用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(), ... 是自定义实现的。有些是内联函数,有些是库函数。

4

3 回答 3

39

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”中的“ __wrap_malloc”将调用真正的“ malloc”函数。

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

于 2012-08-29T07:49:18.420 回答
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

于 2012-08-29T07:41:46.837 回答
-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
于 2012-08-29T07:52:09.350 回答