본문 바로가기

Programming

Kernel module symbol reference

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