我有一个库实现了malloc
。我想用自定义 malloc 函数重写此函数,该函数执行某些操作,然后调用库的 malloc 函数。
如何在不丢失库函数的情况下重新定义符号 malloc
?
最佳答案
GNU 链接器提供了 --wrap symbol
标志来将自定义函数包装在现有函数周围。
如您所见,最后一个标志:http://ieee.uwaterloo.ca/coldfire/gcc-doc/docs/ld_3.html#SEC3
--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 tosymbol
. This can 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
. Here is a trivial example:void * __wrap_malloc (int c) { printf ("malloc called with %ld\n", c); return __real_malloc (c); }
If you link other code with this file using
--wrap malloc
, then all calls tomalloc
will call the function__wrap_malloc
instead. The call to__real_malloc
in__wrap_malloc
will call the realmalloc
function. 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.
关于c - 如何用自定义代码包装库函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23078219/