syscalls.h 中的 sys_ 函数未定义
sys_ functions in syscalls.h are undefined
我只是在制作一个内核模块。
我遇到了这个警告:
WARNING: "sys_getpid" [/PATH/NAME.ko] undefined!
WARNING: "sys_stat" [/PATH/NAME.ko] undefined!
WARNING: "sys_rmdir" [/PATH/NAME.ko] undefined!
WARNING: "sys_mremap" [/PATH/NAME.ko] undefined!
WARNING: "sys_fchmod" [/PATH/NAME.ko] undefined!
WARNING: "sys_gettimeofday" [/PATH/NAME.ko] undefined!
WARNING: "sys_utimes" [/PATH/NAME.ko] undefined!
WARNING: "sys_fcntl" [/PATH/NAME.ko] undefined!
WARNING: "sys_getcwd" [/PATH/NAME.ko] undefined!
WARNING: "sys_unlink" [/PATH/NAME.ko] undefined!
WARNING: "localtime" [/PATH/NAME.ko] undefined!
WARNING: "sys_write" [/PATH/NAME.ko] undefined!
WARNING: "sys_fsync" [/PATH/NAME.ko] undefined!
WARNING: "sys_fchown" [/PATH/NAME.ko] undefined!
WARNING: "sys_ftruncate" [/PATH/NAME.ko] undefined!
WARNING: "sys_fstat" [/PATH/NAME.ko] undefined!
WARNING: "sys_munmap" [/PATH/NAME.ko] undefined!
WARNING: "sys_geteuid" [/PATH/NAME.ko] undefined!
WARNING: "sys_read" [/PATH/NAME.ko] undefined!
WARNING: "sys_access" [/PATH/NAME.ko] undefined!
WARNING: "sys_old_mmap" [/PATH/NAME.ko] undefined!
WARNING: "errno" [/PATH/NAME.ko] undefined!
WARNING: "getenv" [/PATH/NAME.ko] undefined!
WARNING: "sys_mkdir" [/PATH/NAME.ko] undefined!
WARNING: "sys_time" [/PATH/NAME.ko] undefined!
WARNING: "sys_lseek" [/PATH/NAME.ko] undefined!
WARNING: "sysconf" [/PATH/NAME.ko] undefined!
我该如何解决这个问题?
这是我的代码:
#include <linux/string.h>
#include <linux/kernel.h>
#include <linux/syscalls.h>
#include <linux/fs.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/stat.h>
#include <linux/fcntl.h>
#include <asm-generic/unistd.h>
#include <uapi/asm-generic/fcntl.h>
#include <linux/time.h>
#include <linux/errno.h>
#include <linux/mman.h>
// And use functions(sys_open, sys_write, ...)
我的工作区是 Ubuntu 3.13.0-66-generic。
我需要使用文件描述符。
所以,我不能使用 filp_
函数(比如 filp_open
)。
编辑 1:
我的生成文件:
obj-m += NAME.o
NAME-objs := FILE1.o FILE2.o FILE3.o FILE4.o
ccflags-y := -mhard-float -msse -mpreferred-stack-boundary=4 -w -I/usr/include -I/usr/include/x86_64-linux-gnu/
ldflags-y += -lpthread -ldl
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
rm -rf *.ko *.mod *.cmd *.o *.mod.c *.order *.symvers .tmp_versions
从内核代码调用系统调用(sys_*
函数)不是一个好主意。实际上,很多系统调用都可以用函数来表示,供内核模块使用。
I need to use file descriptor. So, I can't use filp_ functions(like filp_open).
使用 fdget
可以轻松地将文件描述符转换为文件指针。例如,参见 fallocate 系统调用的实现(fs/open.h
中的 SYSCALL_DEFINE4(fallocate...)
)。
至于errno
,这个变量只是用户space。系统调用 return 错误使用 -E
约定,是 libc 将此值存储到 errno
.
我只是在制作一个内核模块。 我遇到了这个警告:
WARNING: "sys_getpid" [/PATH/NAME.ko] undefined!
WARNING: "sys_stat" [/PATH/NAME.ko] undefined!
WARNING: "sys_rmdir" [/PATH/NAME.ko] undefined!
WARNING: "sys_mremap" [/PATH/NAME.ko] undefined!
WARNING: "sys_fchmod" [/PATH/NAME.ko] undefined!
WARNING: "sys_gettimeofday" [/PATH/NAME.ko] undefined!
WARNING: "sys_utimes" [/PATH/NAME.ko] undefined!
WARNING: "sys_fcntl" [/PATH/NAME.ko] undefined!
WARNING: "sys_getcwd" [/PATH/NAME.ko] undefined!
WARNING: "sys_unlink" [/PATH/NAME.ko] undefined!
WARNING: "localtime" [/PATH/NAME.ko] undefined!
WARNING: "sys_write" [/PATH/NAME.ko] undefined!
WARNING: "sys_fsync" [/PATH/NAME.ko] undefined!
WARNING: "sys_fchown" [/PATH/NAME.ko] undefined!
WARNING: "sys_ftruncate" [/PATH/NAME.ko] undefined!
WARNING: "sys_fstat" [/PATH/NAME.ko] undefined!
WARNING: "sys_munmap" [/PATH/NAME.ko] undefined!
WARNING: "sys_geteuid" [/PATH/NAME.ko] undefined!
WARNING: "sys_read" [/PATH/NAME.ko] undefined!
WARNING: "sys_access" [/PATH/NAME.ko] undefined!
WARNING: "sys_old_mmap" [/PATH/NAME.ko] undefined!
WARNING: "errno" [/PATH/NAME.ko] undefined!
WARNING: "getenv" [/PATH/NAME.ko] undefined!
WARNING: "sys_mkdir" [/PATH/NAME.ko] undefined!
WARNING: "sys_time" [/PATH/NAME.ko] undefined!
WARNING: "sys_lseek" [/PATH/NAME.ko] undefined!
WARNING: "sysconf" [/PATH/NAME.ko] undefined!
我该如何解决这个问题?
这是我的代码:
#include <linux/string.h>
#include <linux/kernel.h>
#include <linux/syscalls.h>
#include <linux/fs.h>
#include <linux/delay.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/stat.h>
#include <linux/fcntl.h>
#include <asm-generic/unistd.h>
#include <uapi/asm-generic/fcntl.h>
#include <linux/time.h>
#include <linux/errno.h>
#include <linux/mman.h>
// And use functions(sys_open, sys_write, ...)
我的工作区是 Ubuntu 3.13.0-66-generic。
我需要使用文件描述符。
所以,我不能使用 filp_
函数(比如 filp_open
)。
编辑 1:
我的生成文件: obj-m += NAME.o
NAME-objs := FILE1.o FILE2.o FILE3.o FILE4.o
ccflags-y := -mhard-float -msse -mpreferred-stack-boundary=4 -w -I/usr/include -I/usr/include/x86_64-linux-gnu/
ldflags-y += -lpthread -ldl
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
rm -rf *.ko *.mod *.cmd *.o *.mod.c *.order *.symvers .tmp_versions
从内核代码调用系统调用(sys_*
函数)不是一个好主意。实际上,很多系统调用都可以用函数来表示,供内核模块使用。
I need to use file descriptor. So, I can't use filp_ functions(like filp_open).
使用 fdget
可以轻松地将文件描述符转换为文件指针。例如,参见 fallocate 系统调用的实现(fs/open.h
中的 SYSCALL_DEFINE4(fallocate...)
)。
至于errno
,这个变量只是用户space。系统调用 return 错误使用 -E
约定,是 libc 将此值存储到 errno
.