在多个源文件上创建内核模块时的多个定义

时间:2015-11-06 05:43:31

标签: c linker makefile kernel-module

我认为问题在于一个头文件包含我的源文件需要的所有项,但我该如何解决这个问题?是否可以使用一个或者我必须将它们拆分为自己的包含功能。

我不确定我的所有源文件中包含的.h文件有什么问题。我读到问题是每个源文件都是用这个.h文件单独编译的,当把所有源文件链接在一起时,编译发现有多个定义,即使我有一个包含保护。

我该如何解决这个问题?我的prototype.h包含我所有的函数原型包含 extern 变量和结构。我有一些源文件都需要这个.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

0 个答案:

没有答案