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文件,

你这段代码应该没问题,我那libstdc++试过了,没错。
问题应该在你的/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格式问题了。

参考技术A 负天下 参考技术B 应该是有个指针指错了

以上是关于LINUX 环境下 调用动态库 出现segmentation fault 异常 请高手解答!的主要内容,如果未能解决你的问题,请参考以下文章

Ubuntu环境下使用Unity3D调用C++编写的Linux so动态链接库

golang 调用 c++动态库(winlinux环境)

在linux环境下静态库(.a)的编译和使用

linuxopencv生成的静态或动态库怎样在调用的时候不用安装openvcv环境

windows下动态库,如何在linux下布置

VS2015环境下生成和调用DLL动态链接库