如何使用这个简单的C测试程序来加载模块?

时间:2011-04-08 02:16:20

标签: c gcc dlopen lvalue dlsym

我打算在linux上使用dlopen和dlsym来使这两个源文件工作:

 #include <dlfcn.h>
 #include <stdio.h>
 int main()
 {
     int *(func)(void);

     func=dlsym( dlopen("/home/noah/tmp/libmod.so.1", RTLD_LAZY), "func");

     printf("%d\n", *func());
     return 0;
}

int func()
{
return 42;
}

但是当我编译第一个时,它一直在说:

  

main.c:9:错误:左值作为赋值的左操作数

编辑: 我尝试添加一个演员,并使其成为一个函数指针,但现在它说: main.c :(。text + 0x1f):对dlopen' main.c:(.text+0x2b): undefined reference to dlsym'

的未定义引用

3 个答案:

答案 0 :(得分:4)

您对func的声明很困惑:

int *(func)(void);

相当于:

int *func(void);

所以你只是给编译器一个func的原型而不声明一个变量;发生错误是因为函数不是有效的左值;但是,函数的指针是一个有效的左值,所以你需要这个:

int (*func)(void);

然后你的printf应该是这样的:

printf("%d\n", func());

您还需要将dlsym的回报转换为严格符合标准C:

func = (int (*)(void))dlsym(dlopen("/home/noah/tmp/libmod.so.1", RTLD_LAZY), "func");

void*指针可以静默升级到除指向函数的指针之外的任何其他指针类型;例如,gcc -pedantic将警告“ISO C禁止在没有强制转换的情况下在函数指针和'void *'之间进行分配”。我没有标准方便的副本(但这里肯定有人这样做)所以我不能引用章节和诗句,但咖啡馆在这一点上是正确的(感谢caf)。

您还要为cdecl.org添加书签。

答案 1 :(得分:0)

你不能真正做你正在尝试的事情

但它应该是int(func *)()

并且printf应该是func()

但你不能将dlsym及其所有参数指定为函数指针

提示....函数指针“func”只是一个指针,它没有状态,它只是一个内存地址

并且你不应该提供一个名为func的函数.....因为你正在创建一个名为func的指针。你可以创建一个函数“int test_function(){return 42;}

然后在main go func = test_function;只是用函数指针测试

答案 2 :(得分:0)

无需*func()

printf("%d\n", func());

没问题,因为func()将返回int,并且你试图得到整数的取消引用(*)

查看运算符(link

的优先级