kylin3.0代码适配

    技术2025-03-21  32

    问题:原本代码在kernel > 2.6.32的版本上编译通过,移植到当前的环境,kylin3.0,kernel = 2.6.18-SKL1.9.4.ky3.173.4.1 上,编译出现如下错误:

    错误:‘CSUM_MANGLED_0’ 未声明 (在此函数内第一次使用) 错误:(即使在一个函数内多次出现,每个未声明的标识符在其 错误:所在的函数内只报告一次。)

    解决步骤如下: 1.因为高版本的是可用的,所以我们先看看高版本上这个是什么

    # grep "CSUM_MANGLED_0" /usr/src/kernels/3.10.0-862.el7.x86_64/ -rin /usr/src/kernels/3.10.0-862.el7.x86_64/include/net/checksum.h:108:#define CSUM_MANGLED_0 ((__force __sum16)0xffff)

    搜索当前版本,并没有这个变量

    2.可以看出,CSUM_MANGLED_0这个宏是由__force 和__sum16这两个私有宏代替的,先看一下__sum16,找到他在include/types.h中定义

    ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200704101244689.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2Jvb3RsZWFkZXI=,size_16,color_FFFFFF,t_70)

    通过上图可以看到,左边是高版本的,右边是当前版本,在当前版本中没有__sum16,这是由__u16 __bitwise的别名,两边都有一个相同类型的__le16,我觉得这个比那辆有搞头。

    3.再看__force,通过查询,发现在linux/compiler.h中定义,再对比新旧版本,发现都有这个文件相同定义,我觉得可以用 4.找到了两个代替的变量,进行替换,编译通过,解决

    519 if ( th->check == 0 ){ 520 //th->check = CSUM_MANGLED_0; 521 th->check = ((__force __le16)0xffff); 522 }
    Processed: 0.010, SQL: 9