【发布时间】:2022-01-01 20:42:52
【问题描述】:
我有一个像这样的动态链接模块:
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());
}
我有什么办法可以完成这项工作,还是完全超出范围?
我可以手动“解析”函数指针吗?
【问题讨论】:
-
你试过什么?由于某些原因,您在此处发布的代码无法编译。 (例如,
num没有定义。)但是如果你修复了这些错误,这或多或少是有效的。另外,您是什么意思“手动解析”函数指针?这就是dlsym的全部意义,按名称为您解决。 -
对不起,我在撰写帖子时对代码进行了一些修改,并遗漏了一些内容。现已修复
-
如果你用
dlsym(module, "func")替换dlsym(module, "func_p")就可以了 -
@Rillian:我不完全确定您所说的“
func_p的定义已经取消引用”是什么意思,但我认为您对 C 中的一个奇怪的极端情况感到困惑。确实func_p()隐式取消引用func_p,因此无需编写(*func_p)()。 (但隐式取消引用是在它的使用上下文中,而不是它的定义。)但是dlsym不会返回您查找的符号的 value。它返回它的地址。换句话说,dysym返回的不是func_p,而是&func_p。而(&func_p)()不是合法的函数调用。 -
您的帖子没有说明您在实施此操作时遇到了什么问题。 cmets中已经指出了一些事情,但是您需要更新帖子以描述特定问题并提出特定问题。一个特定的问题可能是“
dlsym返回一个空指针”或“我尝试在返回的地址dlsym调用一个函数,然后程序崩溃”。对于失败的情况,它应该有完整的具体代码。
标签: c pointers segmentation-fault dynamic-linking dlopen