Device Driver를 C++로 코딩 할 수 있나요?

creat23의 이미지

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로 바꾸어야 됩니까?

어떠한 정보도 감사히 받겠습니다.

kdoll의 이미지

같은 이야기 인지는 모르겠지만

디바이스 드라이버는 아닌데요..

AIX에서 ldl 계열의 함수들을 이용해서 동적 로딩을 사용하던중

dlopen을 호출하는 프로그램은 C이고 shared object는 c++로 만들었

더니 죽어버리더라구요..

그래서 호출하는 프로그램을 C++ 컴파일러로 컴파일 하니까 잘되데요.

singlet의 이미지

creat23 wrote:
unresolved symbol __builtin_delete

delete 를 쓰셨군요. -_-;
커널 소스를 깔아두지 않아서 확인은 지금 못합니다만, 커널 프로그래밍은 일반적인 C++ 프로그래밍과는 환경이 엄청나게 다릅니다. new/delete 가 어떻게 작동할지 정확히 모르더라도 쉽게 예상할 수 있는 건, 이 루틴들이 '사용자 프로그램'으로서 '커널에서' 메모리를 얻어올 거라는 겁니다. 그런데 모듈은 '커널 내에서' 작동하므로 이 방법은 더 이상 통용되지 않습니다. 즉, 기본 new/delete 는 써서는 안됩니다.

해결책 하나는 아예 new/delete 를 깨끗이 포기하는 겁니다. C 에서는 malloc()/free() 를 포기하고 kmalloc()/kfree() 를 써야 하지요. 하지만 C++ 에서는 함수 재정의가 가능하므로 new/delete 를 kmalloc()/kfree() 를 쓰도록 재정의해버리는 걸로도 가능할 겁니다. Linux-Kernel Archive 에는 된다고 나와 있군요.

creat23 wrote:
unresolved symbol __rtti_user
(...)
unresolved symbol __rtti_si

커널은 C 로 돼 있습니다. RTTI 가 지원될 리 만무하잖습니까. -fno-rtti 로 지원 꺼버리시고요.

creat23 wrote:
unresolved symbol terminate__Fv
(...)
unresolved symbol __rethrow

역시 마찬가지 이유로, 예외가 지원될 리 만무합니다. -fno-exceptions 로 꺼버리세요.

creat23 wrote:
kernel이 자신의 symbol table에 위의 symbol들을 추가시킬 수 있습니까?
아니면, C++로 구현된 device driver를 C로 바꾸어야 됩니까?

이론상으로야 추가시킬 수 있겠지만, 어떤 커널 개발자도 그런 짓을 하진 않을 겁니다. 직접 추가시켜 주는 건 위험 부담이 너무나 크고요. 따라서 추가시킬 수 없다고 간주하는 게 좋을 겁니다. 저라면 그냥 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) 라는 라인이 있습니다) 컴파일됐다고 하셨으니 지금은 문제 없겠지만, 신경은 써 주셔야 할 듯합니다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.