linux动态链接库出现段错误的原因分析
来源:互联网 发布:淘宝商城外包服务 编辑:程序博客网 时间:2024/05/05 16:53
运行下面这段代码,就会提示:段错误。
typedef int (*dl_ImageDirCtrl)(unsigned char ucMirrorSet);
dl_AllLedCtrl *pFunc1;
fHandle=dlopen("../drvlib/libdrv.so",RTLD_LAZY);
if(fHandle==NULL)
{
printf("Load drvlib.so failed!/n");
fprintf (stderr, "%s/n", dlerror());
return -1;
}
else
printf("Load drvlib.so successfully!/n");
dlerror(); //Clear any existing error
pFunc1=(dl_AllLedCtrl *)dlsym(fHandle,"DrvLib_AllLedCtrl");
error = dlerror();
if(error!=NULL)
printf("Load Func from drvlib.so failed!Error is:%s/n",error);
else
(*pFunc1)(0);
什么是段错误呢? 其实质上就是函数指针跑飞了,指向的并不是一个合法的函数地址。
可上面的代码看上去是没有问题的呀?问题究竟出在什么地方呢?
原因在于对typedef int (*dl_ImageDirCtrl)(unsigned char ucMirrorSet);理解不深刻。
这个宏定义了一个类型,就象typedef UINT16 unsigned short一样。UINT16就可以用来修饰一个变量了。而dl_ImageDirCtrl就可以用来修饰一个函数指针变量。因此,dl_AllLedCtrl *pFunc1定义了一个指针,这个指针指向dl_AllLedCtrl类型的函数指针变量。所以,pFunc1=(dl_AllLedCtrl *)dlsym(fHandle,"DrvLib_AllLedCtrl");是不对的,应该是*pFunc1=(dl_AllLedCtrl *)dlsym(fHandle,"DrvLib_AllLedCtrl");但这样居然也是错误的。正确的写法是:
dl_AllLedCtrl *pFunc1; 修改为: dl_AllLedCtrl pFunc1;
pFunc1=(dl_AllLedCtrl *)dlsym(fHandle,"DrvLib_AllLedCtrl");改为:
pFunc1=(dl_AllLedCtrl )dlsym(fHandle,"DrvLib_AllLedCtrl");
(*pFunc1)(0);改为: (pFunc1)(0);
这样就可以了。
我记得windowx平台上面使用dll时,也有同样的现象。
- linux动态链接库出现段错误的原因分析
- Qt中出现段错误的原因分析
- LINUX I2C驱动偶尔出现段错误原因之一
- linux下运行程序后出现段错误的原因和解决案例
- linux下运行程序后出现段错误的原因和解决案例
- Linux下运行C++程序出现“段错误(核心已转储)”的原因
- Linux开发中常见段错误问题原因分析
- Linux开发中常见段错误问题原因分析
- Linux开发中常见段错误问题原因分析
- Linux开发中常见段错误问题原因分析
- Linux开发中常见段错误问题原因分析
- Linux开发中常见段错误问题原因分析
- Linux开发中常见段错误问题原因分析
- Linux程序运行时找不到动态链接库的原因
- linux 段错误分析
- linux的段错误的分析
- Linux下的段错误分析
- Linux下的段错误分析
- java.lang.OutOfMemoryError: Java heap space解决方法
- [数据库连接字符串] SQL Server 2005 连接字符串
- Symbian Http post请求之ContentType
- 如何在NSIS中执行BAT文件
- listview得到一个选择的条目
- linux动态链接库出现段错误的原因分析
- Charlie Calvert: Silverlight Simple Animation
- 事件驱动用例中相关概念
- 使table在存在空行时也能显示边框线
- Rose与PowerDesigner:两款建模工具对比分析比较
- sql 显示当日业绩和累计业绩
- 怎样建设3G网站
- 实现输入为空不刷新页面
- ] 爆笑囧人囧事2009大合集![