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(),...是自定义实现的。一些是内联函数,一些是库函数。
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”之前解析调用。
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.
-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。