内核模块中未定义警告“errno”

问题描述

我正在编写内核模块,我需要使用 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: 的手册页

  1. errno 由 ISO C 标准定义为 int 类型的可修改左值,并且不得显式声明

  2. 在一些古老的系统上, 不存在或不存在 声明errno,所以需要手动声明errno (即,extern int errno)。 不要这样做它很久以前就停止了 是必要的,它会导致现代版本的问题 C 库。

无需显式声明 errno