2014년 8월 7일 목요일

[OS X][XNU] kext strnstr link fail

KEXT 내부에서 strnstr 을 사용했는데 컴파일은 잘되는데, 로딩할때 바인딩 에러가 난다..

왜그런지 인터넷을 찾아보아도 답이 없길래 직접 확인해보았다.

사건의 발단은 Kernel/string.h 에 strnstr 이 선언되어 있다.



extern int strcasecmp(const char *s1, const char *s2);
extern int strncasecmp(const char *s1, const char *s2, size_t n);
extern char *strnstr(char *s, const char *find, size_t slen);
extern char *strchr(const char *s, int c);
extern char *STRDUP(const char *, int);

extern int strprefix(const char *s1, const char *s2);


그런데 로딩시도를 하면 자꾸 아래 같은 에러가 발생한다.

(kernel) kxld[com.dplab.driver.xxxxio]: The following symbols are unresolved for this kext:
(kernel) kxld[com.dplab.driver.xxxxio]: _strnstr


그래서 System.kext/Plugins 에 존재하는 라이브러리 심볼을 덤프 해봤다.

(nm 명령어는 display name list 명령어로 심볼정보를 출력해줌)

nm /System/Library/Extensions/System.kext/PlugIns/Libkern.kext/Libkern | grep str
                 U __ZN12OSSymbolPool18reconstructSymbolsEv
                 U __ZNK11OSMetaClass18instanceDestructedEv
                 U __ZNK11OSMetaClass19instanceConstructedEv
                 U _copyinstr
                 U _copyoutstr
                 U _lck_mtx_destroy
                 U _lck_rw_destroy
                 U _lck_spin_destroy
                 U _strcasecmp
                 U _strcat
                 U _strchr
                 U _strcmp
                 U _strcpy
                 U _strlcat
                 U _strlcpy
                 U _strlen
                 U _strncasecmp
                 U _strncat
                 U _strncmp
                 U _strncpy
                 U _strnlen
                 U _strprefix
                 U _strtol
                 U _strtoq
                 U _strtoul

                 U _strtouq

음.. Libkern 에 _strnstr 이 진짜 없다. ....

어디있는지 다 찾아보니..

nm /System/Library/Extensions/System.kext/PlugIns/Private.kext/Private | grep strnstr
                 U _strnstr

Private.kext 에 있다.

그래서 Private.kext 를 링크해보니..


Diagnostics for /tmp/xxxxxio.kext:
Dependency Resolution Failures: 

    Only Apple kexts may link against com.apple.kpi.private.


쓰지 말란다. ....

머 이런...

암튼 다른 분들은 삽질하지 마시길..








댓글 없음:

댓글 쓰기