Linux에서 Kernel 모듈을 컴파일할때 골때리는게
모듈간 심볼을 참조할 필요가 있을때다.
한 모듈에서 다른 모듈의 심볼필요없이 지 혼자서 쿵짝쿵짝 돌아가면 걱정할 필요가 없다.
그런데 예를들어 A모듈에서 B모듈의 b함수를 불러다가 써야 할 때가 있는데..
Built-in으로 컴파일하면 B모듈에서 b함수를 EXPORT_SYMBOL 해주면
심볼알아서 잘 찾아주니 상관이 없는데
Module로 컴파일 하면 EXPORT_SYMBOL했음에도 불구하고
*** Warning: "xxx" [/xxx/xxx/xxx/xxx.ko] undefined!
라는 워닝을 내면서 컴파일이된다 (응?;)
더군다나 모듈까지 만들어낸다.
별문제 없다고 판단하기 쉬운데 저렇게 만들어진 모듈은
insmod시 undefined 에러를 내면서 죽어버린다.
요럴때 저 워닝을 없애는 방법엔 두가지인가 세가지가있는데
지금말할려고 하는건 Module.symvers를 이용하는 방법.
Module.symvers는 열어보면 알겠지만 EXPORT_SYMBOL한 녀석들의
어드레스가 나와있는 파일이다.
일단 B모듈을 컴파일하면 B모듈의 디렉토리에 Module.symvers가 생기는데,
이 녀석을 A모듈의 디렉토리로 copy한후 A모듈을 컴파일하면
A모듈은 컴파일시 B모듈에서 가져온 Module.symvers를 참조하게 되고 A모듈에서 EXPORT_SYMBOL한 녀석들까지 합쳐진 Module.symvers를 만들어준다.
더 골치아픈건 A모듈에서 B모듈의 함수를 B모듈에서 A모듈의 함수를 사용할때인데...
요것도 해결은 가능한데 설명하기 귀찮아졌다.
자세한건 Documentation/kbuild/modules.txt 참조
출처 : http://www.promsoft.net/main/board/dev.asp?tnum=5&index=70&gotopage=1
'Programming' 카테고리의 다른 글
About LD_PRELOAD (2) | 2013.07.10 |
---|---|
Role of setuid (0) | 2013.07.10 |
Linux x86 system call table (0) | 2013.07.10 |
Finding symbol in libc (0) | 2013.07.10 |
x86 CR3 register (0) | 2013.07.10 |