首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >dlsym返回无效指针。

dlsym返回无效指针。
EN

Stack Overflow用户
提问于 2022-01-01 20:42:52
回答 1查看 148关注 0票数 0

我有一个动态链接模块,如下所示:

代码语言:javascript
复制
int func() {
    return 5;
}

extern int(*func_p)() = func;

以及加载函数指针的主函数:

代码语言:javascript
复制
#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());
}

有什么办法可以让这件事成功吗?还是完全超出了界限?

我可以手动“解析”函数指针吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-01-02 00:30:03

在C中,func是函数,func_p是指向函数的指针。当一个名称作为参数给dlsym时,dlsym返回命名事物的地址。因此,对于"func",它返回名为func的函数的地址。对于"func_p",它返回名为func_p的指针的地址。

当然,指针func_p的地址不能用来调用函数。为此,您需要指针的值。

这两种方法中的任何一种都应起作用:

代码语言:javascript
复制
// Get address of function.
int (*func)() = (int (*)()) dlsym(module, "func");

// Call function.
func();
代码语言:javascript
复制
// 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编译器不同地对待名称。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70551737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档