LSM(Linux Security Module) 컴파일 오류
글쓴이: alwaysN00b / 작성시간: 수, 2012/05/16 - 11:53오전
안녕하세요.
간단하게 아래와 같은 소스로 컴파일 해봤는데 오류가 나네요.. 한참 삽질해봤는데, 제 실력으론 부족해서 질문 올립니다.
코드는 아래와 같고
#include <linux/kernel.h> #include <linux/init.h> #include <linux/security.h> MODULE_LICENSE("GPL"); struct security_operations ops; int flag; static int my_rename(struct inode *old_inode, struct dentry *old_dentry, struct inode *new_inode, struct dentry *new_dentry) { return 0; } static int __init mylsm_init(void) { int flag; ops.inode_rename = my_rename; flag = register_security(&ops); if(flag != 0) { //error } return 0; } static void __exit mylsm_exit(void) { } module_init(mylsm_init); module_exit(mylsm_exit);
오류 메시지는
alwaysn00b@alwaysn00b-VirtualBox:~/modulePrac/security$ make make -C /usr/src/linux-headers-3.2.0-23-generic-pae SUBDIRS=/home/alwaysn00b/modulePrac/security modules make[1]: Entering directory `/usr/src/linux-headers-3.2.0-23-generic-pae' CC [M] /home/alwaysn00b/modulePrac/security/norename.o /home/alwaysn00b/modulePrac/security/norename.c:5:16: error: expected declaration specifiers or ‘...’ before string constant make[2]: *** [/home/alwaysn00b/modulePrac/security/norename.o] Error 1 make[1]: *** [_module_/home/alwaysn00b/modulePrac/security] Error 2 make[1]: Leaving directory `/usr/src/linux-headers-3.2.0-23-generic-pae' make: *** [all] Error 2
구글링 해봐도 답이 안나오네요...
답변 부탁드립니다.
Forums:
MODULE_LICENSE() 가 뭔지 모르답니다.
MODULE_LICENSE() 가 뭔지 모르답니다.
허 이것참..
먼저 답변 감사드리고, 정말 죄송합니다.
삽질을 많이 했더니... 질문도 정신없어 했군요..
MODULE_LICENSE는 linux/module.h 에 정의되어 있고 include 해서 추가해주었습니다.
실제로 오류가 나는건 아래 문제 때문이었는데,
구글링해보니 코드 마지막 줄에 MODULE_LICENSE("GPL")을 추가해 주라고 되어있었습니다.
(마지막에 해주나 처음에 해주나 마찬가지였습니다.)
register_security 는 linux/security.h 에
라고 되어있습니다.
warning이라 그냥 insmod 해보았지만
syslog에
이렇게 떨어집니다.
한번더 답변 부탁드립니다.
언제나 시작
지금 찾아보니..
http://selenic.com/pipermail/kernel-mentors/2010-March/000765.html
이런 글이 있네요..
아무래도 커널버전을 낮은걸로 다시 컴파일 해봐야겠습니다.
언제나 시작
그래도 소용없을
그래도 소용없을 겁니다.
register_security() 는 module 에서 호출하지 못합니다.
EXPORT_SYMBOL 되어 있지도 않을 뿐더러 __init 섹션에 있기 때문에 커널 부팅 완료 직후 코드 영역이 없어집니다.
security.c 를 수정해서
__init 를 삭제하고 EXPORT_SYMBOL해서 다시 컴파일 해보았습니다.
컴파일때 나던 warning은 없어졌지만, insmod 해보면 마찬가지로
Unknown Symbol 이라는 메시지가 떨어집니다.
제가 뭔가 놓친게 있는것 같은데, 조언 부탁드립니다.
언제나 시작
unknown symbol 의 원인을 알아내서
unknown symbol 의 원인을 알아내서 고쳐봐야 소용없습니다.
__init 섹션에 있는 코드는 그게 그 상황에서만 동작시켜야 하는 함수이기 때문입니다.
뭔가 initialize 하는 계열일 경우, 부팅 완료 이후에 변경(추가/삭제)되면 곤란하거나... 등이죠.
아무튼...
잘 컴파일 되고, 부팅까지 잘 되었다면 /proc/kallsyms 에 그 심볼이 보여야 합니다.
EXPORT_SYMBOL() 이 잘 됐다면 심볼 이름 앞에 '__ksymtab_' 이 붙어 있어야 하고요.
답변 감사합니다.
/proc/kallsyms register_security 가 보이긴 하나 결과는 마찬가지였습니다.
kallsyms 에 __ksymtab_ 은 붙어있는게 없었습니다.
그래서, register_security 주소를 함수포인터로 직접 호출해버리고, insmod 해보았습니다.
일단 모듈은 올라갑니다만... hooking은 제대로 안되는것 같습니다.
조금 더 삽질해 보아야겠습니다.
감사합니다.
언제나 시작
댓글 달기