2014-10-14 2 views
2

프리 컴파일 된 객체 파일을 사용하는 커널 모듈을 빌드하고 삽입하려하고 있습니다. 사전 컴파일 된 오브젝트 파일이 asm (GNU 어셈블러)으로 컴파일되었습니다.커널 모듈과 프리 컴파일 된 객체의 연결

obj-m += klm.o 
klm-objs := a.o 
klm.o: 
     make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 
clean: 
     make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean 

및 klm.c : 여기

은 메이크입니다

#define LINUX 

#include <linux/module.h> 
#include <linux/kernel.h> 
#include <linux/slab.h> 
extern volatile unsigned long peak_create(); 
int init_module(void) 
{ 
    printk("<1>Hello world 1.\n"); 
    peak_create(); 
    return 0; 
} 


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

EXPORT_SYMBOL_GPL(peak_create); 
MODULE_LICENSE("GPL"); 

하지만이 코 파일을 삽입하기 위해 노력하고있어 때 dmesg를 오류를 보여줍니다 (insmod 명령 klm.ko 사용) :

KLM은 : 알 수없는 기호 peak_create은 (ERR 0)

는 AO의 소스 파일은 글로벌 감속을 포함 peak_create의 에라메이션. (.globl peak_create)

어떻게 커널 모듈에서 peak_create를 사용할 수 있습니까?

감사합니다.

답변

1

이에 Makefile을 수정 시도 :

obj-m := klm_out.o 
klm_out-objs : klm.o a.o 

modules: 
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules 
    # Put the asm compilation command here 

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