所有。
我要连结调用库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()
,......是定制实现的。 有些是内联函数,有些是库函数。
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
”。
我觉得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
关于什么:
#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