【发布时间】:2017-09-05 23:02:48
【问题描述】:
这是C 的独特情况。
假设我们有一个名为 libfoo.so 和 libbar.so 的库,并且我们在这两个库中使用相同的函数名称 Get_A,假设系统调用了 Get_A。
假设 libbar 已加载,然后使用参数 G 调用其 Get_A。 G 是一个带有一些函数指针的结构,其中一个感兴趣:
(*G)->RegisterBaz
所以在libbar 对Get_A 的调用中,我们希望改变指向该RegisterBaz 函数的指针,然后通过dlopen + dlsym 调用libfoo 的Get_A 版本。
我尝试过的一件事是直接赋值,但随后出现编译器错误,即 READ ONLY 变量不可赋值,因此我尝试通过指针:
// not void * but actually some function signature typedefed.
void *f_ptr = (*G)->RegisterBaz;
*&f_ptr = r_n;
r_n 是一个普通的 C 函数,与 RegisterBaz 具有相同的签名
在r_n我调用RegisterBaz的原始实现
因此,虽然这不会出现段错误,但它最终也不会调用我的包装函数。
【问题讨论】: