编译内核模块后出错:sys/syscall.h:没有这样的文件或目录

编译内核模块后出错:sys/syscall.h:没有这样的文件或目录

问题描述:

我正在执行一个内核模块,在插入后编辑whoami命令,我用Makefile编译它的内容如下:编译内核模块后出错:sys/syscall.h:没有这样的文件或目录

obj-m+=holamundo.o 
obj-m+=acumulador.o 
obj-m+=cliente.o 
obj-m+=intercept.o 

all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 
clean: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

和我的模块代码:

#define MODULE 
#define __KERNEL__ 
#include <linux/module.h> 
#include <linux/kernel.h> 
#include </usr/src/kernels/linux/arch/x86/include/asm/unistd.h> 
#include <asm/unistd.h> 
#include <linux/unistd.h> 
#include <linux/syscalls.h> 
#include <sys/syscall.h> 
#include <asm/fcntl.h> 
#include <asm/errno.h> 
#include <linux/types.h> 
#include <linux/dirent.h> 
#include <linux/mman.h> 
#include <linux/string.h> 
#include <linux/fs.h> 

extern void *sys_call_table[]; 
int (*orig_geteuid)(const char *path); 

int hacked_geteuid(const char *path) { 
return 78; 
} 

int init_module(void) { 

orig_geteuid = sys_call_table[SYS_geteuid32]; 

sys_call_table[SYS_geteuid32] = hacked_geteuid; 
return 0; 

} 

void cleanup_module(void) { 
    sys_call_table[SYS_geteuid32] = orig_geteuid; 
} 

我现在面临的问题是,当我执行命令make我得到的错误:

/usr/src/kernels/intercept.c:9:25: fatal error: sys/syscall.h: No such file or directory 

我使用的是Linux内核4.12.10在RedHat 7.3

从代码中移除#include <sys/syscall.h>后,我得到以下错误:

/usr/src/kernels/intercept.c:27:31: error: ‘SYS_geteuid32’ undeclared (first use in this function) 
orig_geteuid = sys_call_table[SYS_geteuid32]; 
          ^
/usr/src/kernels/intercept.c:27:31: note: each undeclared identifier is reported only once for each function it appears in 
/usr/src/kernels/intercept.c: In function ‘cleanup_module’: 
/usr/src/kernels/intercept.c:35:17: error: ‘SYS_geteuid32’ undeclared (first use in this function) 
    sys_call_table[SYS_geteuid32] = orig_geteuid; 

有谁知道我做错了什么?

+1

构建一个模块使用内核源代码。它不应该使用来自用户空间的包含文件。用户空间的 – stark

+0

文件? – rainman

+1

内核中没有'sys /'头文件。不知道你想在那里找到什么。另外,'#define MODULE'和'#define __KERNEL__'是错误的:如果需要,这些宏由内核构建系统(KBuild)定义。使用**绝对路径**包含'/ usr/src/kernels/linux/arch/x86/include/asm/unistd.h'看起来很可疑。不包括'asm/unistd.h'是否足够? – Tsyvarev

你正在寻找的常数是__NR_geteuid它定义在asm/unistd.h

+0

程序编译没有错误,但是当我尝试插入模块:'insmod intercept.ko'整个操作系统被阻止,我必须重新启动机器:( – rainman

+0

在你的init函数中,打印出sys_call_table的地址并将其与System.map进行比较,并且你不显示module_init和module_exit调用。 – stark

+0

我该怎么做? – rainman