2013-05-13 2 views
0

교육용으로 다음과 같은 오류가 발생하기 쉬운 커널 모듈을 만들었습니다.커널 모듈을 삽입하는 중에 "알 수없는 기호가 모듈에 있습니다"오류가 발생했습니다.

#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/init.h> 
#include <linux/proc_fs.h> 
#include <linux/string.h> 
#include <asm/uaccess.h> 

void *(my_funptr)(void); 

int bug1_write(struct file *file, 
       const char *buf, 
       unsigned long len) { 
     my_funptr(); 
     return len; 
} 

int init_module(void) { 
     static struct proc_dir_entry *proc; 
     proc = create_proc_entry("bug1", 0666, 0); 
     proc->write_proc = bug1_write; 
     return 0; 
} 

나는 다음과 같은 Makefile을 사용하여 컴파일 : - : 커널 모듈을 설치하려고

$ make 
make -C /lib/modules/3.0.0-13-generic-pae/build M=/home/fusion/kernel_exp modules 
make[1]: Entering directory `/usr/src/linux-headers-3.0.0-13-generic-pae' 
    Building modules, stage 2. 
    MODPOST 1 modules 
WARNING: "my_funptr" [/home/fusion/kernel_exp/bug1.ko] undefined! 
make[1]: Leaving directory `/usr/src/linux-headers-3.0.0-13-generic-pae' 

: - -

obj-m += bug1.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 

컴파일이 내게 준

$ sudo insmod bug1.ko 
[sudo] password for fusion: 
insmod: error inserting 'bug1.ko': -1 Unknown symbol in module 

코드가 의도적이라는 것을 감안할 때 일반적으로 커널 모듈을 컴파일하고 삽입 할 수 있기를 바란다. 이렇게 할 수있는 컴파일러 플래그가 있는가? 당신이 나를 가리킬 수있는 어떤 문서라도 제가 참조 할 수 있습니까? 감사.

+0

는이 문제의 수정을 검색 했습니까? 나는 당신이 하나를 얻을 것이라고 확신합니다. –

답변

1

이것은 C 문제입니다.

void *(my_funptr)(void); 

는 포인터를 반환 my_funptr라는 이름의 함수를 선언합니다.

이, 함수에 대한 포인터를 선언하려면 사용

void (*my_funptr)(void); 
관련 문제