c - 如何用自定义代码包装库函数?

标签 c function overriding

我有一个库实现了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 to symbol. 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 to malloc will call the function __wrap_malloc instead. The call to __real_malloc in __wrap_malloc will call the real malloc 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/

相关文章:

c - 开管警告

javascript - javascript 函数应该有可选参数和选项吗?

java - 尽管使用了 super 关键字,为什么我的派生类方法没有从基类调用重写方法?

c - 信号量无破坏/取消竞争条件

c - 解析时忽略文件中的字符

c - 函数 'GetInt' 的隐式声明在 C99 中无效

c - 将结构指针传递给 C 中的函数

postgresql - liquibase 中的 Postgres 删除函数显示错误

ruby - 在初始化方法中自定义 ArgumentError 消息

Java动态绑定(bind)调用父类方法