我认为问题在于一个头文件包含我的源文件需要的所有项,但我该如何解决这个问题?是否可以使用一个或者我必须将它们拆分为自己的包含功能。
我不确定我的所有源文件中包含的.h
文件有什么问题。我读到问题是每个源文件都是用这个.h
文件单独编译的,当把所有源文件链接在一起时,编译发现有多个定义,即使我有一个包含保护。
我该如何解决这个问题?我的prototype.h
包含我所有的函数原型,包含, extern 变量和结构} STRONG>。我有一些源文件都需要这个.h
文件的一部分。
我的make文件如下
TARGET = betty
obj-m := $(TARGET).o
betty-objs := main.o helpers.o syscall_overrides.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
$(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
$(RM) .*.cmd *.o *.ko -r .tmp*
它给出的错误信息(它们的一部分)是:
/home/admin/Dropbox/COMP3000/FinalModule/helpers.o:(.bss+0x4): multiple definition of `clean_sys_mkdir'
/home/admin/Dropbox/COMP3000/FinalModule/main.o:(.bss+0x0): first defined here
/home/admin/Dropbox/COMP3000/FinalModule/helpers.o:(.bss+0x8): multiple definition of `clean_sys_execve'
/home/admin/Dropbox/COMP3000/FinalModule/main.o:(.bss+0x4): first defined here
/home/admin/Dropbox/COMP3000/FinalModule/helpers.o:(.bss+0xc): multiple definition of `clean_getdents64_syscall'
代码:
的main.c
#define MODULE_NAME "Betty"
#include "prototypes.h"
extern unsigned long **syscall_table;
static int __init init(void)
{
...
}
static void __exit shutdown(void)
{
...
}
module_init(init);
module_exit(shutdown);
MODULE_LICENSE("..");
MODULE_AUTHOR("..");
MODULE_DESCRIPTION("..");
prototype.h
#ifndef PROTOTYPE_H
#define PROTOTYPE_H
#include <linux/module.h> // mandatory kernel module
#include <linux/kernel.h> // KERN_INFO
#include <linux/init.h> // __init and __exit
#include <asm/unistd.h> // __NR syscall nums
#include <linux/printk.h>
#include <linux/tty.h> // tty_struct
#include <linux/tty_driver.h>// write (already included by tty.h)
#include <linux/sched.h> // current
#include <linux/random.h> // get_random_bytes
#include <linux/syscalls.h> // from sys_execve asmlinkage
#include <linux/dirent.h>
#include <linux/string.h>
#include <linux/fs.h>
#include <linux/slab.h> // kmalloc()
#include <linux/time.h> // time
#include <linux/rtc.h> // rtc_time_to_tm
/*
Function prototypes for both original and custom syscalls that Betty uses
*/
asmlinkage long (*clean_sys_mkdir)(const char __user *pathname, umode_t mode);
asmlinkage long (*clean_sys_execve)(const char __user *filename,
const char __user *const __user *argv,
const char __user *const __user *envp);
asmlinkage long (*clean_getdents64_syscall) (unsigned int fd,
struct linux_dirent64 __user * dirent,
unsigned int count);
static void find_process_id_to_hide(char* process_nm);
extern unsigned long **syscall_table;
#endif
helpers.c
#include "prototypes.h"
extern unsigned long **syscall_table; // extern variable
... just functions in this one defined in prototype.h