LINUX 环境下 调用动态库 出现segmentation fault 异常 请高手解答!
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LINUX 环境下 调用动态库 出现segmentation fault 异常 请高手解答!相关的知识,希望对你有一定的参考价值。
#include "stdio.h"
#include "stdlib.h"
#include "dlfcn.h"
int main(void)
int (*So)(const char* pszTimestamp, const char* pszSDRType, const char* pszCallID,
const char* pszUserNo, const char* pszCallerNo, const char* pszCalledNo,
const char* pszOldNumber, const char* pszLocationID, const char* pszField1,
const char* pszField2, const char* pszField3, const char* pszField4);
const char *errmsg = "";
printf("begin!\n");
void *SoLib = dlopen("/root/RecordDll//Release/libRecordDll.so", RTLD_LAZY);
printf("111");
if (NULL == SoLib)
printf("222");
fprintf(stderr, "Failed to load libRecordDll.so:%s\n", dlerror());
return 1;
dlerror();
printf("333");
*(void **)(&So) = dlsym(SoLib, "GetInfo");
printf("444");
if (NULL != (errmsg = dlerror()))
printf("%s\n", errmsg);
return 1;
printf("555");
int ret = So("2011-11-11 11:11:11", "8", "11",
"111", "1111", "11111",
"111111", "1111111", "1~1~1",
"2011-11-11 11:11:11~2012-11-11 11:11:11~0~03", "", "");
printf("%d", ret);
dlclose(SoLib);
return 0;
还有就是:dlopen()报的错 ,但是明确的是可以找到SO文件,
问题应该在你的/root/RecordDll//Release/libRecordDll.so,
这个动态库GetInfo函数有bug。指针错误或者数据越界。
我这代码:
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
int main(void)
// /usr/lib/libstdc++.so.6
int (*mygetchar)(void);
const char *errmsg = "";
printf("begin!\n");
void *SoLib = dlopen("/usr/lib/libstdc++.so.6", RTLD_LAZY);
printf("111\n");
if (NULL == SoLib)
printf("222\n");
fprintf(stderr, "Failed to load libstdc++.so.6:%s\n", dlerror());
return 1;
dlerror();
printf("333\n");
*(void **)(&mygetchar) = dlsym(SoLib, "getchar");//
printf("444\n");
if (NULL != (errmsg = dlerror()))
printf("%s\n", errmsg);
return 1;
printf("555\n");
int ret = mygetchar();
printf("%d\n", ret);
dlclose(SoLib);
return 0;
上面代码跑没问题的,你的要错就是在动态库本身了。
“还有就是:dlopen()报的错 ,但是明确的是可以找到SO文件,”
/root/RecordDll//Release/libRecordDll.so
看到了,/RecordDll//Release这中间多了一根右斜杆,路径错误,找到就见鬼了。追问
动态库有问题吗 会不会是makefile的问题啊 ?
追答/root/RecordDll//Release/libRecordDll.so
看到了,/RecordDll//Release这中间多了一根右斜杆,路径错误,找到就见鬼了。
粗心大意,低级错误。
呵呵 谢了 但是还是不行 去掉之后
追答你确定路径正确还挂了?
再试试。
你代码没走到222那里?
我这边111都没走到 如果路径不正确会报找不到
追答路径错误会报错:
begin!
111
222
Failed to load libstdc++.so.6:/usrlib/libstdc++.so.6: cannot open shared object file: No such file or directory
你那个应该就是libRecordDll.so格式问题了。
以上是关于LINUX 环境下 调用动态库 出现segmentation fault 异常 请高手解答!的主要内容,如果未能解决你的问题,请参考以下文章
Ubuntu环境下使用Unity3D调用C++编写的Linux so动态链接库