有条件地在运行时替换C函数

时间:2013-05-21 03:02:06

标签: c dynamic runtime

是否可以在C中有条件地替换运行时的函数(特别是动态加载的库中的函数)?

我知道您可以使用LD_PRELOAD或只使用相同名称的函数,例如:

// Silly example intercepting exit
typedef void (*exit_func)(int code);

void exit(int code)
{
    exit_func orig_exit = (exit_func)dlsym(RTLD_NEXT, "exit");

    NSLog(@"EXIT CALLED WITH CODE %d!!!!", code);

    orig_exit(code);
}

但是,在程序加载并运行后,是否可以在运行时有条件地替换函数?

if(some_condition)
{
    swap_impementations(exit, my_exit);
}

编辑:这有点类似于Is it possible to swap C functions?,但具体来说,我试图拦截对操作系统加载的不同库中的函数的调用。

这意味着,例如,我是从stdlib截取exit()函数,从ANYWHERE调用exit()会调用我的实现而不是原来的,就像我上面的例子一样,除了可控制的运行时。

有人建议通过使用跳转指令覆盖原始来挂钩调用,但是我希望能找到一些不需要重写可执行内存的东西,比如我可以在动态链接器中调用“重新链接“程序启动后的功能并将其指向其他地方?”

1 个答案:

答案 0 :(得分:0)

为此目的使用函数指针。