C挂钩库函数调用

时间:2014-09-03 20:12:04

标签: c hook

我有一个C库源代码及其配置文件,我可以随时重建它。有一个库函数foo()由于它的不当行为我想替换它。我不应该编辑库源,只能修改配置文件。有没有办法如何用这个限制替换从foo()到bar()的所有调用?

我尝试使用宏定义:

#define foo    bar

但这并没有帮助,因为它也取代了函数名称(声明和定义)。

我找到了一个类似的帖子:C++ Replacing Functions with Macros。问题是我无法修改源代码,也没有条件代码。有什么建议吗?

编辑:澄清问题的简单示例。假设库有一个实用函数plus()用于求和两个整数,函数minus()用于减去两个整数,内部调用plus(a,-b)。但由于函数plus()没有计算出正确的结果,我写了一个函数myplus(),效果很好。现在问题是如何强制库调用myplus()而不是plus()

3 个答案:

答案 0 :(得分:0)

在源代码中添加foo的实施。在该功能中,请致电bar。链接器应该在库中的版本之前选择foo版本。

答案 1 :(得分:0)

#include "foolib.h"

#define foo bar

void bar()
{
    //foo() replaced with bar()
}

只要你的#define语句出现在#include之后,它就不会重命名库中的函数定义。这项技术一直在使用。

答案 2 :(得分:0)

假设foo()驻留在foo.c中,您可以执行以下操作:

不要将foo.c添加到项目中,而是添加foowrap.c,它将是:

#define __FOOWRAP__
#include "foo.c"

在您执行原始#define的标题中,请改为:

#ifndef __FOOWRAP__
#define foo bar
#endif

这也假设foo()不在foo.c本身内部调用。如果是,我认为没有更改源文件就无法解决问题。