[질문] 모듈 프로그래밍중..
글쓴이: seul / 작성시간: 목, 2008/12/04 - 12:17오전
파일의 정보를 출력하는 모듈을 구현해보려고 합니다..
여러번의 삽질을 통해 어째어째 컴파일까지는 다다랐는데..
insmod 로 모듈을 올리려고하니 unresolved symbol __xstat 라고 오류가 나네요 ㅠ
nm명령어로 확인해보니 __xstat 에 U 가 되어있기는 한데..
어떻게 해야하는지 사실 잘 모르겠네요 ㅠ 코드상에서는 xstat를 쓰지 않거든요.
sys/stat.h 도 include하였고..
리눅스상에서 stat.h를 이용한 간단한 코드도 만들어서 실행해보았는데 잘 되더라구요..
뭐가 문제인지..ㅠ_ㅠ 제가 아주 잘못 짚은걸가요?
어설픈 설명으론 부족할거같아 코드를 같이 올려봅니다.ㅠ_ㅠ
#include <linux/kernel.h> #include <sys/syscall.h> #include <linux/module.h> #include <asm/uaccess.h> #include <sys/stat.h> #define __NR_fileinfo 259 asmlinkage int(*saved_entry)(void); void **sys_call_table=(void**)0xc030a0f0; asmlinkage int sys_fileinfo(struct stat *fbuf, const char *fpath) { struct stat statbuf; int i; i=stat(fpath, &statbuf); if(i==-1) { return -1; } copy_to_user(fbuf, &statbuf, sizeof(struct stat)); return 0; } int module_start() { saved_entry = sys_call_table[__NR_fileinfo]; sys_call_table[__NR_fileinfo] = sys_fileinfo; return 0; } void module_end() { sys_call_table[__NR_fileinfo] = saved_entry; } module_init(module_start); module_exit(module_end); MODULE_LICENSE("GPL");
Makefile
TARGET=fileinfo INCLUDE=-isystem /usr/src/linux-2.4.20-8/include CFLAGS=-O2 -D__KERNEL__ -DMODULE $(INCLUDE) CC=gcc ${TARGET}.o:${TARGET}.c clean: rm -rf ${TARGET}.o
ㅠ_ㅠ 도움부탁드립니다~!
Forums:
module programming의
module programming의 경우에는 /usr/include의 header를 사용하지 않습니다. 이것은 Application에게 제공하는 system library header입니다. 즉 module programming의 경우에는 kernel source의 include 파일을 참조해서 해야 합니다. 현재 제가 2.4.x의 커널이 없어서 확인은 못해봤지만, 2.6.x의 커널에서는 include 밑에 sys라는 디렉토리는 없습니다. 즉 include부터 잘못 되어있는거 같습니다. 그리고 module programming에서 kernel 함수를 사용하기 위해서는 header include도 해야 하지만, kernel에서 EXPORT_SYMBOL 처리해준 것들에 대해서만 module에서 function call을 할 수 있습니다. 이 부분을 확인해보시는게 좋을 거 같습니다.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
감사합니다!
^_^
댓글 달기