编译内核模块后出错: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;
有谁知道我做错了什么?
构建一个模块使用内核源代码。它不应该使用来自用户空间的包含文件。用户空间的 – stark
文件? – rainman
内核中没有'sys /'头文件。不知道你想在那里找到什么。另外,'#define MODULE'和'#define __KERNEL__'是错误的:如果需要,这些宏由内核构建系统(KBuild)定义。使用**绝对路径**包含'/ usr/src/kernels/linux/arch/x86/include/asm/unistd.h'看起来很可疑。不包括'asm/unistd.h'是否足够? – Tsyvarev