是否可以在 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);
}
编辑:这有点类似于是否可以交换 C 函数?但具体来说,我试图拦截对操作系统加载的不同库中的函数的调用。
这意味着,例如,如果我从 stdlib 拦截 exit() 函数,从 ANYWHERE 对 exit() 的任何调用都会调用我的实现而不是原始实现,就像我上面的示例一样,除了在运行时可控。
有人建议通过用跳转指令覆盖原始调用来挂钩调用,但我希望有一些不需要踩踏可执行内存的东西,比如我可以在动态链接器中调用一些东西来“重新链接” " 程序启动后的函数并将其指向其他地方?