当前位置: 技术问答>linux和unix
dlopen加载so动态链接库出现段错误的问题
来源: 互联网 发布时间:2017-01-30
本文导语: so库中暴露出来的函数(写在某基类头文件中)大体如下: …… #ifdef __cplusplus extern "C" { #endif Object* construct() { return new Object; } void destroy(Object* object) { delete object; ...
so库中暴露出来的函数(写在某基类头文件中)大体如下:
……
#ifdef __cplusplus
extern "C" {
#endif
Object* construct() {
return new Object;
}
void destroy(Object* object) {
delete object;
}
#ifdef __cplusplus
}
#endif
……
调用so的程序结构如下:
定义了一个函数(根据传入的so_name来执行相关操作):
void so_test(so_name, other_arg) {
……
handle = dlopen(so_name, RTLD_LAZY);
……
Type1* create = (Type1*)dlsym(handle, "construct");
Type2* destroy = (Type2*)dlsym(handle, "destroy");
……
Object* object = create();
……
destroy(object );
……
dlclose(handle);
}
在其它函数中调用如上函数,调用时有2种情况:
情况1(同一个函数中):
void func() {
so_test(so_name, other_arg1);
so_test(so_name, other_arg2);
}
情况2(在不同的函数中):
void func1() {
so_test(so_name1, other_arg);
}
void func2() {
so_test(so_name2, other_arg);
}
编译运行后,不管是哪一种情况,前一次调用so_test正常,后一次调用so_test就会出现段错误
弄了好几天都没弄好,快疯了,求大侠指点一下
……
#ifdef __cplusplus
extern "C" {
#endif
Object* construct() {
return new Object;
}
void destroy(Object* object) {
delete object;
}
#ifdef __cplusplus
}
#endif
……
调用so的程序结构如下:
定义了一个函数(根据传入的so_name来执行相关操作):
void so_test(so_name, other_arg) {
……
handle = dlopen(so_name, RTLD_LAZY);
……
Type1* create = (Type1*)dlsym(handle, "construct");
Type2* destroy = (Type2*)dlsym(handle, "destroy");
……
Object* object = create();
……
destroy(object );
……
dlclose(handle);
}
在其它函数中调用如上函数,调用时有2种情况:
情况1(同一个函数中):
void func() {
so_test(so_name, other_arg1);
so_test(so_name, other_arg2);
}
情况2(在不同的函数中):
void func1() {
so_test(so_name1, other_arg);
}
void func2() {
so_test(so_name2, other_arg);
}
编译运行后,不管是哪一种情况,前一次调用so_test正常,后一次调用so_test就会出现段错误
弄了好几天都没弄好,快疯了,求大侠指点一下
|
也就是说你的函数so_test能成功调用一遍,在第二遍的时候出的问题?那么就应该和你的so没有关系啊!你不用so,直接把代码放在一起编译试试?
|
最基本的调试技术:GDB单步调试。
如果代码不多,请帖出全部代码,说不定还能帮你调试下!
如果代码不多,请帖出全部代码,说不定还能帮你调试下!