unresolved symbol 문제

손정수의 이미지

현재 디스크를 읽는 디바이스 드라이버를 하나 만들려고 하는데요...
모듈을 등록하면 다음과 같은 에러가 나옵니다...

unresolved symbol mark_dirty_kiobuf

헤더 파일을 추가 했음에도 나오는 것으로
mark_dirty_kiobuf 함수가 모듈에서는 사용할 수 없는 것 같습니다.

/proc/ksyms 에도 등록 되어 있지 않는군요...

해결 방법을 알 고 계신 분의 답변을 부탁드립니다.

new5244의 이미지

이 방법이 통할지 안통할 지는 모르겠는데...
직접 주소를 써서 사용하면 되지 않을까요...

System.map 에서 mark_dirty_kiobuf 의 주소값을 얻어낸 후에...

소스 코드에

void (*p_mark_dirty_kiobuf)(struct kiobuf *iobuf, int bytes) = System.map 에서 얻은 주소값;

이렇게 사용하면 될 듯 한데요...

from saibi

mushim의 이미지

kernel module 에서 사용할 수 있는 함수들은 EXPORT_SYMBOL 에 의해서 kernel symbol table 에 등록되어 있는 경우만 가능합니다. 이걸 확인하는 방법은 ksyms -a | egrep 함수명 으로 하면 되구요.

만약 등록되어 있지 않은 함수를 호출할려면 커널 코드를 수정해서 EXPORT_SYMBOL() 을 추가해야 합니다.

이과정은 주의를 하셔야 하는데, module 에서 사용하기엔 중요한 함수들도 많기 때문입니다. 잘못 사용하면 kernel panic 나오기 쉽상이죠.

찾아보니, mark_dirty_kiobuf 를 등록하는 patch 도 있긴 하네요.

http://www.kernelnewbies.org/kernels/SuSE81/SOURCES/patches/50_export_mark_dirty_kiobuf-2.4.19-pre10aa2

손정수의 이미지

고맙습니다. 위와 같이 하니 해결 되었습니다.