问题描述
我正在编写内核模块,我需要使用 errno
变量。
我添加了 <linux/errno.h>
没有问题,并添加了 extern int errno;
,
到我的代码。
我以下列方式使用变量:errno = ENOENT;
。
当我编译程序时,我收到以下警告,并且无法加载模块:
WARNING: "errno" [module path] undefined!
为什么会这样?
我使用的是 Ubuntu 12.0.4 的虚拟机
编辑: 我上钩的打开系统调用如下所示:
asmlinkage int hooked_open(char* path,int flags){
if(strstr(path,file_to_hide) != NULL){
return -ENOENT;
}
return original_open(path,flags);
}
在加载模块时运行strace cat file_to_hide 返回值为4294967294,没有错误。
在不存在的文件上运行 strace 时,返回值为 -1 并引发 ENOENT。我希望能够模仿。
解决方法
来自 errno: 的手册页
-
errno 由 ISO C 标准定义为 int 类型的可修改左值,并且不得显式声明;
-
在一些古老的系统上,
不存在或不存在 声明errno,所以需要手动声明errno (即,extern int errno)。 不要这样做。 它很久以前就停止了 是必要的,它会导致现代版本的问题 C 库。
无需显式声明 errno
。