linux动态链接库出现段错误的原因分析

运行下面这段代码,就会提示:段错误。          

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时,也有同样的现象。

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

草根大哥

进军大神程序员路上,谢谢支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值