我有一个动态链接模块,如下所示:
int func() {
return 5;
}
extern int(*func_p)() = func;以及加载函数指针的主函数:
#include <stdio.h>
#include <dlfcn.h>
int main() {
void *module = dlopen("/tmp/mod/mod.so", RTLD_NOW);
if (!module)
{
printf("Cannot load module: %s\n", dlerror());
return 1;
}
typedef int(*func_f)();
func_f func;
func = dlsym(module, "func_p");
char *error = dlerror();
if (error)
{
printf("Cannot find init in module: %s\n", error);
return 1;
}
printf("Func returns: %i\n", func());
}有什么办法可以让这件事成功吗?还是完全超出了界限?
我可以手动“解析”函数指针吗?
发布于 2022-01-02 00:30:03
在C中,func是函数,func_p是指向函数的指针。当一个名称作为参数给dlsym时,dlsym返回命名事物的地址。因此,对于"func",它返回名为func的函数的地址。对于"func_p",它返回名为func_p的指针的地址。
当然,指针func_p的地址不能用来调用函数。为此,您需要指针的值。
这两种方法中的任何一种都应起作用:
// Get address of function.
int (*func)() = (int (*)()) dlsym(module, "func");
// Call function.
func();// Get address of pointer to function.
int (**p)() = dlsym(module, "func_p");
// Deference to get pointer to function, then call function.
(*p)();除非函数在外部不可见,后者是不必要的。只要func可以被dlsym查询,前者就足够了。
还请注意,关于链接器和相关事物的文档(可能是dlsym )指的是符号的值,但是,对于这些类型的符号,这些值是符号所指事物的地址。也就是说,对于C,func是一个函数,func_p是一个指针,但是对于链接器,func是它在对象模块中找到的某个名称,它的“值”是它将在内存中的地址,同样,func_p的值是它将位于的地址。在阅读此类文档时,您必须注意链接器和符号解析器正在执行不同的任务,并与C编译器不同地对待名称。
https://stackoverflow.com/questions/70551737
复制相似问题