2

我打算在 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): undefined reference to dlopen' main.c:(.text+0x2b): undefined reference todlsym'

4

3 回答 3

4

您的声明func很困惑:

int *(func)(void);

相当于:

int *func(void);

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

int (*func)(void);

然后你printf应该是这样的:

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

您还需要将 return fromdlsym转换为严格符合标准 C:

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

除了指向函数的void*指针之外,指针可以静默升级为任何其他指针类型;gcc -pedantic,例如,将警告“ISO C 禁止在函数指针和 'void *' 之间进行赋值”而不进行强制转换。我手边没有标准的副本(但这里有人肯定有),所以我不能引用章节和经文,但 caf 在这一点上是正确的(感谢 caf)。

而且您还想为cdecl.org添加书签。

于 2011-04-08T02:25:08.617 回答
0

没有必要*func()

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

没问题,因为 func() 将返回 int,并且您尝试获取整数的取消引用 (*)

查看运算符的优先级(链接

于 2011-04-08T02:22:11.203 回答
0

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

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

并且 printf 应该是 func()

但是您不能将 dlsym 及其所有参数分配为函数指针

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

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

然后在 main go func = test_function; 只是为了使用函数指针进行测试

于 2011-04-08T02:19:47.177 回答