有一天我编译内核模块驱动的时候发现如下错误

Linux kernel版本:4.1.15

error: negative width in bit-field '<anonymous>'

代码如下:

static struct device_attribute sysfs_keypad_list[] = {
__ATTR(virt_key, ,
keypad_show_error, keypad_virt_key_store),
};

当我做这样的修改后:

static struct device_attribute sysfs_keypad_list[] = {
__ATTR(virt_key, ,
keypad_show_error, keypad_virt_key_store),
};

编译就不报错了

这样让我很是奇怪,接下来咱们跟入代码一看究竟

首先我们看下__ATTR的实现:

继续跟入,我们发现如下的算法,显而易见,此版本的内核对权限做了一个小小的算法,如下算法大家可以写一个简单的c代码进行解读

当我传入perms=0x666的时候,BUILD_BUG_ON_ZERO(perms & 2) 这个会报错,因为如下:

为什么 BUILD_BUG_ON_ZERO( (0x666) & 2 )会报错呢?

我们可以写这样的代码来验证一下:

#include <stdio.h>

int main()
{
struct a {
int: -;
}; return ;
}

运行:

出现了同样的错误,那么我们应该明白了吧,gcc会在编译的时候对位域的定义进行检查,struct {int: -1}这样的定义编译器会认为是错误的

那至于为什么会打印这样的错误呢?这就需要对编译器进行了解了,也就是编译器是如何检查结构体位域的定义的,这块我没有深入研究过

如有人有这块的资料和信息欢迎评论和分享。

如下引用一段话,摘自网上(https://stackoverflow.com/questions/31395602/giving-s-iwugo-permission-to-module-parameter-results-in-compilation-error-whil)

Linux probably refuses to make module parameters world-writable for security reasons.

You should be able to use narrower permissions such as S_IWUSR | S_IWGRP

通俗的理解就是内核希望这样做的安全一点,减少其他组的写权限,体现在 BUILD_BUG_ON_ZERO(perms & 2)这个设计上

那么我们如何修改呢?

有如下两种方式的思路给大家借鉴:

第一种:

这样设计的思路是为了遵循作者的思想,保障安全(但__ATTR这个宏的用法不同版本是有差别的在这块,比如说3.6.5的版本是不会检查这个权限问题的)

static struct device_attribute sysfs_keypad_list[] = {
__ATTR(virt_key, ,
keypad_show_error, keypad_virt_key_store),
};

第二种:

这样设计的思路是因为搞驱动开发的相信大家都清楚,如果这个接口是我们曾经释放出去的,开放了这样的权限

那么我们后期开发的时候必须兼容之前的接口设计,不能这样随意的更改权限,因为如果你修改了,某个客户之前有这样子使用权限的话,你改了权限后,他可能就用不了了,

因此我们可以做如下处理,思路就是我们自己定义,不使用内核的设计

#undef __ATTR
#define __ATTR(_name, _mode, _show, _store) { \
.attr = {.name = __stringify(_name), \
.mode = _mode}, \
.show = _show, \
.store = _store, \
} static struct device_attribute sysfs_keypad_list[] = {
__ATTR(virt_key, ,
keypad_show_error, keypad_virt_key_store),
};

方法三:

#undef VERIFY_OCTAL_PERMISSIONS
#define VERIFY_OCTAL_PERMISSIONS(perms) (perms)

static DEVICE_ATTR(reg_value, 0666, zbh_reg_show, zbh_reg_store);

分析如上,如有描述不准确的地方还请告知,Thanks

__ATTR引发的编译错误【原创】的更多相关文章

  1. Linux下由于注释引发udf编译错误

    我们编写如下的UDF: 然后我们放到Linux下进行编译 Linux编译以后会报如下错误: 这是由于C语言的C90标准不支持行注释,而我们只需要将行注释修改为块注释 问题即可解决

  2. 编译错误“The run destination My Mac is not valid for Running the scheme '***',解决办法

    [转载]   http://blog.csdn.net/duanyipeng/article/details/8007684   编译错误"The run destination My Ma ...

  3. 常见C语言编译错误解析【转】

    C语言编译错误信息及说明1. 在函数 ‘transform’ 中:7: 错误:expected ‘;’ before ‘{’ token    解释:‘{’之前的某个语句缺少分号‘;’: 2. 在函数 ...

  4. I.MX6 linux kernel编译错误处理

    /******************************************************************************** * I.MX6 linux kern ...

  5. xxx was built without full bitcode" 编译错误解决

    xxx was built without full bitcode" 编译错误解决 iOS 打包上线 All object files and libraries for bitcode ...

  6. 关于Android Studio中点9图的编译错误问题

    Android中的点9图想必大家都非常熟悉了,能够指定背景图片的缩放区域和文本内容的显示区域,常见如QQ聊天界面的背景气泡这种文本内容不固定并需要适配的应用场景. 这里也给大家准备了一张图,详细介绍了 ...

  7. xamarin.forms新建项目android编译错误

    vs2015 update3 新建的xamarin.forms项目中的android项目编译错误.提示缺少android_m2repository_r22.zip,96659D653BDE0FAEDB ...

  8. 《转载》使用org.w3c.dom.Element的setTextContent()、getTextContent()方法时出现编译错误

    今天在更新项目后进行编译时,出现如下错误一堆: 编译错误 Google之,在stackoverflow上看到如下的解决方法: I came here with the same problem. Ev ...

  9. asp.net教程:编译错误同时存在于不同dll中

    asp.net 编译错误类型“同时存在于”不同的dll中. 出现这种错误大概有三种情况: 1.ASPX页面,一个*.ASPX,对应着一个*.cs文件,两者其实是一个文件,通过两者实现代码分离,每个*. ...

随机推荐

  1. sharepoint 2007页面显示真实的错误信息

    打开下面path的web.config文件:C:\Program Files\Common Files\Microsoft Shared\Web ServerExtensions\12\TEMPLAT ...

  2. SharePoint 2013 APP 开发示例 系列

    SharePoint 2013 APP 安全: SharePoint 2013 APP 开发示例 (一)List 读写 SharePoint 2013 APP 开发示例 (二)获取用户信息 Share ...

  3. bzoj5280/luogu4376 MilkingOrder (二分答案+拓扑序)

    二分答案建图,然后判环,就可以了. 字典序输出的话,只要做拓扑序的时候用优先队列来维护就可以了. (其实判环也可以用拓扑序...) #include<cstdio> #include< ...

  4. javascript:location.reload()和location.replace()的区别,及对图片缓存的影响。

    有段时间没有清理IE的临时文件(缓存文件),在我清理的时候,我突然发现一个问题. 我打开的一个网站,图片默认缓存一个月的,但我发现,当我上传图片或删除图片之后,图片重新缓存,也就意味着,在我上传新图片 ...

  5. 文件操作(十二)——open,read,close,write,seek,truncate

    open函数 #!/usr/bin/env python #-*- coding:utf8 -*- f = open('xxx','r',encoding='utf-8') data = f.read ...

  6. [持续更新] 文章列表 Last Update: 8/21/2017

    1.前端 HTML5快速学习二 Canvas@20141125 HTML5快速学习一@20141122 2.ASP.NET(MVC) MVC5+EF6 完整教程17--升级到EFCore2.0@201 ...

  7. Python复习笔记(二)变量进阶

    02. 可变和不可变类型 不可变类型,内存中的数据不允许被修改: 数字类型 int , bool , float , complex , long(2.x) 字符串 str 元组 tuple 可变类型 ...

  8. Uva439:BFS题目总结

    #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring> #include <cstd ...

  9. 微信现金红包 python

    微信现金红包发送接口,好像没法限制一个用户一个活动只能领取一次红包,在调用红包接口上,自己做了限制 REDPACK_RECORD 建表sql -- Create table create table ...

  10. C++使用目录

    VS2017的安装和配置 常用指令 C++ 数据类型   常量 运算符 数组 字符串  Ansi与Unicode  指针   模态与非模态对话框  变量的引用& new和delete动态分配和 ...