【发布时间】: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 errno。errno的适当声明/定义包含在errno.h中,它可能不是extern int -
@AndrewHenle 我总是关注
do_sys_open()的实现,而不是vfs_open()。那不是原来的系统调用吗?
标签: c linux linux-kernel kernel kernel-module