2010. 5. 17. 15:47

EXPORT_SYMBOL_GPL vs EXPORT_SYMBOL

http://techrepublic.tistory.com/60

위 두 define 문 때문에 반나절을 날렸다.
분명 커널에 built-in 으로 들어있고 /proc/kallsyms 에도 나오는 심볼인데,
모듈을 로드하면 Unknown symbol 이라는 메시지만 찍고 모듈 로딩에 실패했다.

==========================================================================================
# grep usb_alloc_urb /proc/kallsyms
802704b0 T usb_alloc_urb
803f6014 r __ksymtab_usb_alloc_urb
803f96cc r __kcrctab_usb_alloc_urb
80403d70 r __kstrtab_usb_alloc_urb

#insmod wireless.ko
wireless: Unknown symbol usb_alloc_urb
wireless:  Unknown symbol usb_free_urb
wireless: Unknown symbol usb_register_driver
wireless: Unknown symbol usb_submit_urb
wireless: Unknown symbol usb_deregister
wireless: Unknown symbol usb_kill_urb
insmod: cannot insert `wireless.ko': Unknown symbol in module (-1): No  such file or directory
===========================================================================================

이유는 GPL License 때문이었다.
로딩하려는 모듈이 GPL License 가 표시되지 않았었고, 이 모듈에서 사용하는 Symbol 이
EXPORT_SYOBOL_GPL로 export 되어있었기 때문에 이 모듈은 사용할 수 가 없었던 것이다.

위 wireless.ko는 2.6.24 버전 커널에서는 문제 없이 사용되었는데, 2.6.28 에서는 위의 문제가 생겼다.
USB Subsystem 이 2.6.25 버전 부터는 GPL License 모듈에만 Symbol을 export 하도록 변경되었던 것이다.

결론은 EXPORT_SYMBOL로 export 된 symbol은 GPL License 가 아닌 모듈도 사용할 수 있지만,
EXPORT_SYMBOL_GPL로 export 된 symbol은 GPL License 가 아닌 모듈은 사용할 수가 없다.