为了账号安全,请及时绑定邮箱和手机立即绑定

覆盖C中的函数调用

覆盖C中的函数调用

C
qq_遁去的一_1 2019-07-26 14:43:16
覆盖C中的函数调用我想为了记录调用而覆盖对各种API的某些函数调用,但我也可能希望在将数据发送到实际函数之前对其进行操作。例如,假设我getObjectName在源代码中使用了一个名为数千次的函数。我想暂时覆盖此函数,因为我想更改此函数的行为以查看不同的结果。我创建了一个像这样的新源文件:#include <apiheader.h>    const char *getObjectName (object *anObject){     if (anObject == NULL)         return "(null)";     else         return "name should be here";}我像往常一样编译所有其他源代码,但是在链接API的库之前我首先将它链接到此函数。这工作正常,但我显然不能在我的重写函数中调用真正的函数。是否有一种更简单的方法来“覆盖”一个函数而不会链接/编译错误/警告?理想情况下,我希望能够通过编译和链接一个或多个额外的文件来覆盖该函数,而不是通过链接选项或改变我的程序的实际源代码。
查看完整描述

3 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

如果您只想为您的源捕获/修改调用,最简单的解决方案是将头文件(intercept.h)放在一起:

#ifdef INTERCEPT    #define getObjectName(x) myGetObectName(x)#endif

并实现如下功能(intercept.c其中包括intercept.h):

const char *myGetObjectName (object *anObject) {
    if (anObject == NULL)
        return "(null)";
    else
        return getObjectName(anObject);}

然后确保要拦截呼叫的每个源文件具有:

#include "intercept.h"

在顶部。

然后,当你用“ -DINTERCEPT” 编译时,所有文件都会调用你的函数而不是真正的函数,你的函数仍然可以调用真函数。

没有“ -DINTERCEPT”的编译将防止发生拦截。

如果你想拦截所有的电话(不仅仅是来自你的电话),这有点棘手 - 这通常可以通过动态加载和解析真实函数(带dlload-dlsym-类型调用)来完成,但我不认为这是你的必要案件。


查看完整回答
反对 回复 2019-07-26
?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

使用gcc,在Linux下你可以--wrap像这样使用链接器标志:

gcc program.c -Wl,-wrap,getObjectName -o program

并将您的功能定义为:

const char *__wrap_getObjectName (object *anObject){
    if (anObject == NULL)
        return "(null)";
    else
        return __real_getObjectName( anObject ); // call the real function}

这将确保将所有调用getObjectName()重新路由到您的包装函数(在链接时)。然而,在Mac OS X下的gcc中没有这个非常有用的标志。

extern "C"如果您正在使用g ++编译,请记住声明包装函数。


查看完整回答
反对 回复 2019-07-26
  • 3 回答
  • 0 关注
  • 571 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号