[英]Linux kernel module compile error: implicit declaration of function ‘open’
I'm trying to write a simple sniffer-driver for linux, which will redirect all the requests to the real serial port (and also will print all the messages into system log).我正在尝试为 linux 编写一个简单的嗅探器驱动程序,它将所有请求重定向到真正的串行端口(并将所有消息打印到系统日志中)。 I found some examples on the Internet and implemented few functions.
我在网上找了一些例子,实现的功能很少。 For example, function that invokes when ouw fake device is opened:
例如,打开 ouw fake device 时调用的函数:
static int dev_open(struct inode *inodep, struct file *filep) {
numberOpens++;
printk(KERN_INFO "sniffer: Device has been opened %d time(s)\n", numberOpens);
/// Connecting to real device
fd = open (real_device, O_RDWR | O_NOCTTY | O_SYNC);
if (fd < 0) {
printk(KERN_INFO "sniffer: cannot open device %s\n", real_device);
return 1;
}
set_interface_attribs (fd, B115200, 0); // set speed to 115,200 bps, 8n1 (no parity)
set_blocking (fd, 0); // set no blocking
return 0;
}
As you can see, this function just opens the real device using standart linux open
system call.如您所见,此函数只是使用标准的 linux
open
系统调用打开真实设备。 Or function that sets real device settings (speed and parity):或设置真实设备设置(速度和奇偶校验)的函数:
int set_interface_attribs (int fd, int speed, int parity) {
struct termios tty;
memset (&tty, 0, sizeof tty);
if (tcgetattr (fd, &tty) != 0) {
// error_message ("error %d from tcgetattr", errno);
printk(KERN_INFO "sniffer: cannot get device attributes\n");
return -1;
}
cfsetospeed (&tty, speed);
cfsetispeed (&tty, speed);
tty.c_cflag = (tty.c_cflag & ~CSIZE) | CS8; // 8-bit chars
// disable IGNBRK for mismatched speed tests; otherwise receive break
// as \000 chars
tty.c_iflag &= ~IGNBRK; // disable break processing
tty.c_lflag = 0; // no signaling chars, no echo,
// no canonical processing
tty.c_oflag = 0; // no remapping, no delays
tty.c_cc[VMIN] = 0; // read doesn't block
tty.c_cc[VTIME] = 5; // 0.5 seconds read timeout
tty.c_iflag &= ~(IXON | IXOFF | IXANY); // shut off xon/xoff ctrl
tty.c_cflag |= (CLOCAL | CREAD);// ignore modem controls,
// enable reading
tty.c_cflag &= ~(PARENB | PARODD); // shut off parity
tty.c_cflag |= parity;
tty.c_cflag &= ~CSTOPB;
tty.c_cflag &= ~CRTSCTS;
if (tcsetattr (fd, TCSANOW, &tty) != 0) {
printk(KERN_INFO "sniffer: cannot set device attributes\n");
return -1;
}
return -1;
}
It uses tcgetattr
and tcsetattr
system calls.它使用
tcgetattr
和tcsetattr
系统调用。
I included all required header files:我包含了所有必需的头文件:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/kernel.h>
#include <linux/fcntl.h>
#include <linux/unistd.h>
#include <linux/string.h>
#include <linux/termios.h>
#include <linux/fs.h>
#include <asm/uaccess.h>
But when I try to compile this module i get "implicit declaration of function" errors for this system calls.但是当我尝试编译这个模块时,我得到了这个系统调用的“隐式函数声明”错误。
My Makefile:我的生成文件:
obj-m += sniffer.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
Compile errors:编译错误:
sniffer.c: In function ‘set_interface_attribs’:
sniffer.c:51:9: error: implicit declaration of function ‘tcgetattr’ [-Werror=implicit-function-declaration]
if (tcgetattr (fd, &tty) != 0) {
^
sniffer.c:57:5: error: implicit declaration of function ‘cfsetospeed’ [-Werror=implicit-function-declaration]
cfsetospeed (&tty, speed);
^
sniffer.c:58:5: error: implicit declaration of function ‘cfsetispeed’ [-Werror=implicit-function-declaration]
cfsetispeed (&tty, speed);
^
sniffer.c:79:9: error: implicit declaration of function ‘tcsetattr’ [-Werror=implicit-function-declaration]
if (tcsetattr (fd, TCSANOW, &tty) != 0) {
^
sniffer.c: In function ‘dev_open’:
sniffer.c:151:9: error: implicit declaration of function ‘open’ [-Werror=implicit-function-declaration]
fd = open (real_device, O_RDWR | O_NOCTTY | O_SYNC);
^
sniffer.c: In function ‘dev_read’:
sniffer.c:164:18: error: implicit declaration of function ‘read’ [-Werror=implicit-function-declaration]
error_count = read(fd, buffer, len);
^
sniffer.c: In function ‘dev_write’:
sniffer.c:177:4: error: implicit declaration of function ‘write’ [-Werror=implicit-function-declaration]
write (fd, buffer, len);
^
sniffer.c: In function ‘dev_release’:
sniffer.c:184:4: error: implicit declaration of function ‘close’ [-Werror=implicit-function-declaration]
close(fd);
^
What can it be?它可以是什么? All the examples that i found just say that I should include
<linux/unistd.h>
and <linux/termios.h>
.我发现的所有示例都说我应该包括
<linux/unistd.h>
和<linux/termios.h>
。
I had the similar problem, what I found out is that adding我遇到了类似的问题,我发现添加
#include <linux/uaccess.h>
to the list of includes solved my problem on Ubuntu 18.04(Linux Kernel Version : 4.15.0).到包含列表解决了我在 Ubuntu 18.04(Linux 内核版本:4.15.0)上的问题。
NOTE : leave #include <asm/uaccess.h>
as well注意:也留下
#include <asm/uaccess.h>
There is a case where reordering of the include statements can help.在某些情况下,重新排序 include 语句会有所帮助。 See the answers in this question:
请参阅此问题中的答案:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.