Device Driver를 C++로 코딩 할 수 있나요?
글쓴이: creat23 / 작성시간: 목, 2003/10/16 - 5:25오후
g++로 compile 잘해서 target에 loading 하려 했더니 아래와 같은 에러가 뜹니다.
unresolved symbol __builtin_delete
unresolved symbol __rtti_user
unresolved symbol terminate__Fv
unresolved symbol __rethrow
unresolved symbol __rtti_si
제 생각에는 위의 것들은 g++ compiler가 만들어내는 symbol로서
kernel의 symbol table에는 없는 것이기 때문에 발생하는 에러인 것 같습니다.
그러면, kernel이 자신의 symbol table에 위의 symbol들을 추가시킬 수 있습니까?
아니면, C++로 구현된 device driver를 C로 바꾸어야 됩니까?
어떠한 정보도 감사히 받겠습니다.
Forums:
같은 이야기 인지는 모르겠지만디바이스 드라이버는 아닌데요..
같은 이야기 인지는 모르겠지만
디바이스 드라이버는 아닌데요..
AIX에서 ldl 계열의 함수들을 이용해서 동적 로딩을 사용하던중
dlopen을 호출하는 프로그램은 C이고 shared object는 c++로 만들었
더니 죽어버리더라구요..
그래서 호출하는 프로그램을 C++ 컴파일러로 컴파일 하니까 잘되데요.
[quote="creat23"]unresolved symbol __bu
delete 를 쓰셨군요. -_-;
커널 소스를 깔아두지 않아서 확인은 지금 못합니다만, 커널 프로그래밍은 일반적인 C++ 프로그래밍과는 환경이 엄청나게 다릅니다. new/delete 가 어떻게 작동할지 정확히 모르더라도 쉽게 예상할 수 있는 건, 이 루틴들이 '사용자 프로그램'으로서 '커널에서' 메모리를 얻어올 거라는 겁니다. 그런데 모듈은 '커널 내에서' 작동하므로 이 방법은 더 이상 통용되지 않습니다. 즉, 기본 new/delete 는 써서는 안됩니다.
해결책 하나는 아예 new/delete 를 깨끗이 포기하는 겁니다. C 에서는 malloc()/free() 를 포기하고 kmalloc()/kfree() 를 써야 하지요. 하지만 C++ 에서는 함수 재정의가 가능하므로 new/delete 를 kmalloc()/kfree() 를 쓰도록 재정의해버리는 걸로도 가능할 겁니다. Linux-Kernel Archive 에는 된다고 나와 있군요.
커널은 C 로 돼 있습니다. RTTI 가 지원될 리 만무하잖습니까. -fno-rtti 로 지원 꺼버리시고요.
역시 마찬가지 이유로, 예외가 지원될 리 만무합니다. -fno-exceptions 로 꺼버리세요.
이론상으로야 추가시킬 수 있겠지만, 어떤 커널 개발자도 그런 짓을 하진 않을 겁니다. 직접 추가시켜 주는 건 위험 부담이 너무나 크고요. 따라서 추가시킬 수 없다고 간주하는 게 좋을 겁니다. 저라면 그냥 C 로 다시 코딩하겠습니다만, 위에 적은 주의사항들만 신경써준다면 'better C' 를 쓸 수도 있기는 있다고 합니다.
사족: 지금은 문제 없는 것으로 보이긴 합니다만, 커널은 아예 C++ 를 염두에 두지 않고 만들어졌기 때문에 헤더를 extern "C" 블럭으로 감싸주어야 하는 경우도 많다고 하니 주의하시길.
사족2: 일부 헤더의 경우 C++ 키워드를 사용하고 있어서 C++ 에서는 사용 불가능한 경우도 있습니다. (ex: 2.4.22 의 wait.h 에는 static inline void __add_wait_queue(wait_queue_head_t *head, wait_queue_t *new) 라는 라인이 있습니다) 컴파일됐다고 하셨으니 지금은 문제 없겠지만, 신경은 써 주셔야 할 듯합니다.
댓글 달기