디바이스 드라이버 간단한 프로그램...
글쓴이: judaspro / 작성시간: 목, 2003/02/20 - 11:12오후
/*hello.c*/ #include <linux/kernel.h> #include <linux/module.h> int init_module() { printk("hello, world\n"); return 0; } void cleanup_module() { printk("bye module\n"); }
이렇게 간단한 프로그램을 컴파일 시켰더니...
#gcc -D__KERNEL__ -D_LINUX -DMODULE -c -O2 hello.c
In file included from hello.c:2:
/usr/include/linux/module.h:60: parse error before 'atomic_t'
/usr/include/linux/module.h:60: warning: no semicolon at end of struct or union
/usr/include/linux/module.h:60: warning: no semicolon at end of struct or union
/usr/include/linux/module.h:62: parse error before '}'
/usr/include/linux/module.h:62: warning: data definition has no type or storage class
/usr/include/linux/module.h:91: parse error before '}'
라는 에러가 나오는군요..
구조체와 공용체의 끝은 세미콜론이 없다.(--;;)엄청나게 무지... ㅜㅜ
도대체가 무슨 에러인지...알수가 없네요...
그래서 이렇게 글을 올립니다.
헤더파일은 너무 길어서
struct module //51번째 줄 { unsigned long size_of_struct; /* == sizeof(module) */ struct module *next; const char *name; unsigned long size; union { atomic_t usecount; //문제의 60 long pad; } uc; -62번째 /* Needs to keep its size - so says rth */ unsigned long flags; /* AUTOCLEAN et al */ unsigned nsyms; unsigned ndeps; struct module_symbol *syms; struct module_ref *deps; struct module_ref *refs; int (*init)(void); void (*cleanup)(void); const struct exception_table_entry *ex_table_start; const struct exception_table_entry *ex_table_end; #ifdef __alpha__ unsigned long gp; #endif /* Members past this point are extensions to the basic module support and are optional. Use mod_member_present() to examine them. */ const struct module_persist *persist_start; const struct module_persist *persist_end; int (*can_unload)(void); int runsize; /* In modutils, not currently used */ const char *kallsyms_start; /* All symbols for kernel debugging */ const char *kallsyms_end; const char *archdata_start; /* arch specific data for module */ const char *archdata_end; const char *kernel_data; /* Reserved for kernel internal use */ }; //마지막91번째 문제... struct module_info { unsigned long addr; unsigned long size; unsigned long flags; long usecount; }; /* Bits of module.flags. */ #define MOD_UNINITIALIZED 0 #define MOD_RUNNING 1 #define MOD_DELETED 2 #define MOD_AUTOCLEAN 4 #define MOD_VISITED 8 #define MOD_USED_ONCE 16 #define MOD_JUST_FREED 32 #define MOD_INITIALIZING 64 /* Values for query_module's which. */ #define QM_MODULES 1 #define QM_DEPS 2 #define QM_REFS 3 #define QM_SYMBOLS 4 #define QM_INFO 5 /* Can the module be queried? */ #define MOD_CAN_QUERY(mod) (((mod)->flags & (MOD_RUNNING | MOD_INITIALIZING)) && !((mod)->flags & MOD_DELETED)) /* When struct module is extended, we must test whether the new member is present in the header received from insmod before we can use it. This function returns true if the member is present. */ #define mod_member_present(mod,member) \ ((unsigned long)(&((struct module *)0L)->member + 1) \ <= (mod)->size_of_struct) /* * Ditto for archdata. Assumes mod->archdata_start and mod->archdata_end * are validated elsewhere. */ #define mod_archdata_member_present(mod, type, member) \ (((unsigned long)(&((type *)0L)->member) + \ sizeof(((type *)0L)->member)) <= \ ((mod)->archdata_end - (mod)->archdata_start)) /* Check if an address p with number of entries n is within the body of module m */ #define mod_bound(p, n, m) ((unsigned long)(p) >= ((unsigned long)(m) + ((m)->size_of_struct)) && \ (unsigned long)((p)+(n)) <= (unsigned long)(m) + (m)->size) /* Backwards compatibility definition. */ #define GET_USE_COUNT(module) (atomic_read(&(module)->uc.usecount)) /* Poke the use count of a module. */ #define __MOD_INC_USE_COUNT(mod) \ (atomic_inc(&(mod)->uc.usecount), (mod)->flags |= MOD_VISITED|MOD_USED_ONCE) #define __MOD_DEC_USE_COUNT(mod) \ (atomic_dec(&(mod)->uc.usecount), (mod)->flags |= MOD_VISITED) #define __MOD_IN_USE(mod) \ (mod_member_present((mod), can_unload) && (mod)->can_unload \ ? (mod)->can_unload() : atomic_read(&(mod)->uc.usecount))
고수님들 부탁드립니다. 하루종일 삽질하다가 그만...
그리고 커널은 2.2.10 입니다.
아 나의 삽질은 언제나 땅을 다 파서 그만 해도 될라나...
대구 희생자 분들에게 애도를 표합니다.
Forums:
Re: 디바이스 드라이버 간단한 프로그램...
atomic_t 정의를 담고 있는 헤더가 #include되지 않아서 그런 것 아닌가요.
저도 커널 모듈프로그램 컴파일할 때 간혹 생겼었는데...저의 경
저도 커널 모듈프로그램 컴파일할 때 간혹 생겼었는데...
저의 경우는 리눅스 소스 dependency 에 문제가 있어서 그런 현상이 났었습니다.
우선 커널 설정을 초기화 시킨후 다시 재컴파일 했구요..
/usr/include 에서 linux 및 asm 디렉토리에 있는 헤더가 좀 이상한것 같아
리눅스 소스쪽으로 link 를 걸었습니다.
그리고 나선 별 문제없이 컴파일이 되더군요...
from saibi
저도 잘은 모릅니다만...
책에 이렇게 나와 있네요.
gcc -D__KERNEL__ -I/usr/src/linux/include -DMODULE -Wall -O2 -c hello.c -o hello.o
include path를 잘못 지정하신 듯 싶습니다.
/usr/include 가 아닌 /usr/src/linux(해당 커널 버전 디렉토리)/include
로 지정 하셔야 할 것입니다.
수고 하세요 ^^
추정에 컴파일시 asm 디렉토리가 include path 에 포함되지 않
추정에 컴파일시 asm 디렉토리가 include path 에 포함되지 않은 것 같습니다.
커널 컴파일시 컴파일하는 커널과의 호환성을 위해서
/usr/include/asm, /usr/include/linux 는 따로 소스를 가지고 있지 않고,
리눅스 소스 디렉토리로 심볼릭 링크를 거는게 일반적인 경우입니다.
추정에 이 심볼릭 링크가 빠져 있는것 같군요.
댓글 달기