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格式问题了。

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-11-11
负天下
第2个回答  2011-11-11
应该是有个指针指错了

LINUX 环境下 调用动态库 出现segmentation fault 异常 请高手解答!
你这段代码应该没问题,我那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 (...

执行linux定时脚本是报错 Segmentation fault,求高手指正!在线等。
这一行是你执行的程序把 ?请你查看一下你的程序,是否出现了空指针未指向内存就引用或者数组越界。你说你正常执行时候没有问题,很有可能你在正常执行你的程序的时候传递的没有导致程序出现错误,可以打印出发生段错误的时候的脚本中传递给程序的参数值,然后另开终端以此参数值调用下程序看下。段错误,...

...运行后出现Segmentation fault (core dumped)
您可以gcc -g标签,生成可调试的文件。出错后会生成一个core文件 您输入命令gdb a.out -c core,进入gdb的命令界面后,输入bt,就可以显示您当前发生段错误的代码。我运行的时候,一直输出"can not found"。

Linux下出现Segmentation fault (core dumped)
是不是dict.txt文件有问题?

poj提示Segmentation fault:段错误,检查是否有数组越界,指针异常,访问...
2:指针指向了非法内存,例如申明一个指针,但是没有对指针进行初始化,直接就引用,或者引用里面的元素或者函数,或者没有分配内存就进行释放等,另外,申请内存还要检查是否申请成功,如果没有申请成功也会出现这种情况;3:单步调试或者加打印信息,细心一点总可以找到错误的,注意编译成调试版本;4:如果是linux,...

linuxsigsegv转换成异常
具体实现时,可以定义一个继承自标准异常类的自定义异常类,如`SegmentationFaultException`。然后,在信号处理函数中,不是直接终止程序,而是抛出一个`SegmentationFaultException`实例。这样,程序的其余部分就可以通过catch块来捕获并处理这个异常,而不是由操作系统直接终止程序。实现这一机制的关键在于正确...

linux下安装完mongoose 之后用shell命令无法找到mongodb,提示我要...
但在生产环境下(操作系统CentOS6.2,内存64G,CPU12核),却出现频繁的宕机,有时候一天就要宕2次,虽然设置了replicasets,却很容易挂掉2台,导致不可用。查看mongod.log,发现每次宕机时都会打印Gotsignal:11(Segmentationfault),但从这个查找不到能够解决问题的资料。有人认为mongodb频繁宕机大多数是...

asp.net高手来回答,急用,在线等...
***Oracle有没有api库可调?在什么地方?用sdk帮助吗?***程序N次正常运行后突然无法通过编译,dimm.h是什么东西?请进...dephi朋友,什么时候要用游标啊,怎么使用啊???有分啊!!!:)高手,请问我将一个*.exe转化为*.dll,需要注意些什么问题?请指教MFC的打印原理?有什么Frame等我怎么也不明白?在PB中有什么函数...

c语言未经处理的异常,求大佬指点
因为您定义的x为字符型数据,那么它对应的输入输出格式符为%c,但是您在输入语句中写的是%s,是字符串格式,不符合字符型单个变量的输入输出。根据题目意思,应该是要输入字符串,那么定义的时候就要写成char x[2],因为存放的是性别中文字,所以数组长度定义为2就可以了。您再试试哦。

...的演示、怎样才能够防范它呢?请各位大虾帮帮忙!!谢谢!!
当然,随便往缓冲区中填东西造成它溢出一般只会出现“分段错误”(Segmentation fault),而不能达到攻击的目的。最常见的手段是通过制造缓冲区溢出使程序运行一个用户shell,再通过shell执行其它命令。如果该程序属于root且有suid权限的话,攻击者就获得了一个有root权限的shell,可以对系统进行任意操作了。

相似回答