[英]Unable to call a pointer to function returning a pointer
我遇到了一个奇怪的问题。 我有两个文件ac和bc如下:bc:
#include <stdlib.h>
int *foo() {
int *x;
x = (int *) malloc(sizeof(int));
*x = 4;
return x;
}
我使用gcc编译bc到b.so:$ gcc -o b.so -shared -fpic
AC:
#include <stdio.h>
#include <dlfcn.h>
int main() {
void *hdl;
hdl = dlopen("./b.so", RTLD_LAZY);
int *((*fn)(void));
int *x;
x = (*fn)();
fn = dlsym(hdl, "foo");
printf("%d", *x);
}
我用gcc编译ac:
$ gcc -fpic -ldl ac
现在当我运行它:
$ ./a.out分段错误
我哪里错了? 这在bc中的函数不返回指针时有效。
而且,我尝试使用dlerror()检查错误,但它没有报告。
通过检查,您在初始化之前使用fn
。 它还没有指向foo
,它还没有特别指出任何东西,我怀疑结果行为是未定义的。
您没有找到符号并调用该函数。
当你做x = (*fn)();
它不会从bc
调用函数foo
。
您必须先将符号加载到函数指针中。
int *x;
fn = dlsym(hdl, "foo");
x = fn();
printf("%d", *x);
以上应该有效。
编辑:
dlopen的示例程序,dlsym可以在这里找到相同的手册页信息。
可能只是您示例的问题,但在您提供的代码中,您需要切换以下行:
x = (*fn)();
fn = dlsym(hdl, "foo");
这两行看起来顺序错误:
x = (*fn)();
fn = dlsym(hdl, "foo");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.