所有
我想链接一个调用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()
,...是自定义实现的。一些是内联函数,一些是库函数。
答案 0 :(得分:33)
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
“in”__wrap_malloc
“将调用真正的”malloc
“函数。您可能还希望提供“
__real_malloc
”功能,这样没有--wrap
选项的链接就会成功。如果您这样做,则不应将“__real_malloc
”的定义放在与“__wrap_malloc
”相同的文件中;如果这样做,汇编器可以在链接器有机会将其包装到“malloc
”之前解析调用。
答案 1 :(得分: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.
答案 2 :(得分:-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