我遇到了一个奇怪的问题。 我有两个文件a.c和b.c如下: b.c:
#include <stdlib.h>
int *foo() {
int *x;
x = (int *) malloc(sizeof(int));
*x = 4;
return x;
}
我使用gcc将b.c编译为b.so: $ gcc -o b.so -shared -fpic
交流转换器:
#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编译a.c:
$ gcc -fpic -ldl a.c
现在我跑的时候:
$ ./a.out 分段错误
我哪里出错? 当b.c中的函数没有返回指针时,这是有效的。
此外,我尝试使用dlerror()检查错误,但它没有报告。
答案 0 :(得分:6)
通过检查,您在初始化之前使用fn
。它还没有指向foo
,它还没有特别指出任何东西,我怀疑结果行为是未定义的。
答案 1 :(得分:4)
您没有找到符号并调用该函数。
执行x = (*fn)();
后,它不会从foo
调用b.c
函数。
您必须首先将符号加载到函数指针中。
int *x;
fn = dlsym(hdl, "foo");
x = fn();
printf("%d", *x);
上述情况应该有效。
编辑:
dlopen的示例程序,dlsym可以找到here,同时包含手册页信息。
答案 2 :(得分:3)
可能只是您示例的问题,但在您提供的代码中,您需要切换以下行:
x = (*fn)();
fn = dlsym(hdl, "foo");
答案 3 :(得分:3)
这两行似乎顺序错误:
x = (*fn)();
fn = dlsym(hdl, "foo");