2016-02-24 3 views
1

Я новичок в программировании Linux, и я борюсь с созданием в make-файле. Я получил 3 файла: hello.cmakefile в linux, не в состоянии вставить модуль

#include <linux/module.h> /* Needed by all modules */ 
#include <linux/kernel.h> /* Needed for KERN_INFO */ 
#include "funcs.h" 

int init_module(void) { 
    asgard(); 
    return 0; 
} 

void cleanup_module(void) { 
    printk(KERN_INFO "Goodbye world 1.\n"); 
} 

funcs.c

#include <linux/module.h> /* Needed by all modules */ 
#include <linux/kernel.h> /* Needed for KERN_INFO */ 
#include "funcs.h" 

void asgard(void) { 
    printk(KERN_INFO "Asgard balordo\n"); 
    return; 
} 

funcs.h

#include <linux/module.h> /* Needed by all modules */ 

void asgard(void); 

Тогда Makefile:

obj-m += hello.o 
hello-objs := funcs.o 

first: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

all: funcs.o hello.o 
    gcc -o start funcs.o hello.o 

funcs.o: funcs.c funcs.h 
    gcc -C funcs.c 

hello.o: hello.c funcs.h 
    gcc -C hello.c 

clean: 
    rm -f *.o 
    rm -f ./start 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

Когда я компилирую , все нормально, когда я звоню в insmod. /hello.ko сказано, что невозможно вставить модуль. Можете ли вы сказать мне, где я ошибаюсь, пожалуйста?

+0

Есть 2 исходных файла, hello.c и funcs.c, hello.o - это двусмысленность здесь. Поэтому, пожалуйста, попробуйте переименовать hello.c на hello_1.c и установите hello-objs: = funcs.o hello_1.o и rebuild – Eric

+0

Хорошо, теперь это работает, спасибо 4 помощи! – alteration

ответ

1

Ну, вам не нужно вызывать GCC в вашем Makefile построить модуль, попробуйте этот Makefile:

obj-m += hello.o 
hello-objs := funcs.o 

all: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 

Кроме того, вы могли бы сказать модуль, который является точкой входа и точки выхода , и его хорошо объявить описание модуля, автора и лицензирования. (Why here)

Попробуйте это:

static int __init enter_module(void) 
{ 
    return 0; 
} 

static void __exit exit_module(void) 
{ 
} 

module_init(enter_module); 
module_exit(exit_module); 

MODULE_LICENSE("Dual BSD/GPL"); 
MODULE_AUTHOR("John <[email protected]>"); 
MODULE_DESCRIPTION("This is the module description."); 

ядра ключевые слова __init и __exit используются, чтобы позволить Kernel сделать оптимизацию путем удаления функции из памяти всякий раз, когда это возможно.

В то время как макросы module_init и module_exit будут регистрировать функции ввода и выхода модуля.

+0

Изменен, все тот же результат :( – alteration

+0

@alteration Что такое версия ядра, против которой вы строите? –

+0

Я верю, что это 4.6 – alteration

Смежные вопросы