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

时间:2020-12-28 18:31:32

标签: c linux linux-kernel kernel kernel-module

我正在编写内核模块,我需要使用 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。我希望能够模仿。

1 个答案:

答案 0 :(得分:1)

来自 errno: 的手册页

  1. <块引用>

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

  2. <块引用>

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

无需显式声明 errno