【问题标题】:warning "errno" undefined in kernel module [duplicate]内核模块中未定义警告“errno”[重复]
【发布时间】:2021-04-05 12:06:48
【问题描述】:

我正在编写一个内核模块,我需要使用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?它既没有定义也没有在内核代码中使用。
  • 我正在挂接一个系统调用(打开)并尝试为某些输入返回错误(用于隐藏文件)。
  • @YonatanH errno 不用于将失败原因从 Linux 内核系统调用传递回用户空间。看看open() is implemented 是如何做到的。
  • 除了内核模块之外,即使在 ISO C 中,您也不应该将 errno 明确声明为 extern int errnoerrno 的适当声明/定义包含在 errno.h 中,它可能不是 extern int
  • @AndrewHenle 我总是关注do_sys_open() 的实现,而不是vfs_open()。那不是原来的系统调用吗?

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


【解决方案1】:

来自errno:的手册页

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

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

无需显式声明errno

【讨论】:

  • 当省略extern int errno 时,我得到error: errno undeclared。从您的回答中不清楚我应该做什么。
  • 从man page可以看出,不需要再声明了。
  • 这样做时我得到error: errno undeclared
  • 已经收录了
  • 这个答案与在实现系统调用的 Linux 内核模块中使用 errno 完全无关。 errno 不是Linux系统调用如何将失败原因返回给用户空间。
猜你喜欢
  • 2011-07-15
  • 2016-02-22
  • 2014-07-07
  • 2010-10-12
  • 1970-01-01
  • 2014-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多