Modules should never use kernel-headers... 어쩌구 하는 에러..

cococo의 이미지

밤새 안녕하셨는지요. 또다시 모르는 것이 생겨서...질문 올립니다.
(어째 질문만 줄기차게 올릴 가능성이.. -_-; )

커널 2.6에서 디바이스 드라이버 만드는 예제를 보고 따라가고 있는데, 제목과 같은 에러가 났습니다.

[ Modules should never use kernel-headers system headers...(중략) change -I/usr/src/linux/include(or similar) to -I/lib/modules/$(uname -r)/build/include ... ]

그래서,
1. 처음엔 에러 메시지대로, Makefile에서 kernel소스의 include경로를 바꾸어 써 줬습니다.
-I/lib/modules/$(uname -r)/build/include
> 실행하면 경로가 -I/lib/modules//build/include로 나옵니다.

2. 그래서 심볼릭 링크 걸어서, 2.6.11-1.1369_FC4 를 mdlib라는 걸로 임시로 만들고
-I/lib/modules/mdlib/build/include
> 실행하면 경로 자체는 -I/lib/modules/mdlib/build/include로 나옵니다만, 위와 같은 에러가 다시 뜹니다.

3. 이상하다 싶어서, [2.6.11-1.1369_FC4] 자체를 값으로 써 줬습니다.
-I/lib/modules/2.6.11-1.1369_FC4/build/include
> 경로 자체는 -I/lib/modules/2.6.11-1.1369_FC4/build/include로 나옵니다만, 또 위와 같은 에러가 뜹니다.

4. 이놈이 어떻게 기존 커널 소스 파일과 새로 다운받은 커널 소스 파일을 구별할까... 생각해 보다가, 혹시나 해서, 최초에 페도라 깔고 소스 다운로드 받은 디렉토리를 링크해 봤습니다.
-I/usr/src/redhat/BUILD/kernel-2.6.11/linux-2.6.11
> 경로 자체는 -I/lib/modules/2.6.11-1.1369_FC4/build/include로 나옵니다만, 또 위와 같은 에러가 뜹니다.

인터넷 찾아봐도, 대부분 에러 메시지대로만 하면 해결된다고 하네요. 뭐가 잘못된 건지 모르겠습니다. 조언 부탁드립니다.

그리고, 혹시 커널 2.6에서의 디바이스 드라이버 제작은 2.4와 개념이 다른가요? 가지고 있는 책은 2.4기준으로 설명된건데, 에러 메시지나 Makefile을 봐도 새로 도입된 개념들이 있는 것 같은데요. 제가 뭔가 방향을 잘못 잡고 있는 게 아닌가 하는 생각이 자꾸 드네요. -_-;;;

Prentice의 이미지

커널이 돌고 있는 머신에서 그 커널에 맞는 모듈을 만드시는 것이면, 콘솔에서 uname -r을 실행해보시고, 출력 결과를 $(uname -r)자리에 넣어보세요.

cococo의 이미지

사용 환경을 적는다는 걸 깜박해서 다시 적으러 왔더니 그새 답변이... 대단히 감사합니다.

우선 환경은, VMware + Fedora core 4 + gcc 4.0.0 이구요.
커널 버전이 2.6.11이네요.

uname -r 하면, [2.6.11-1.1369_FC4]라고 나오고요. 위에 쓴 디렉토리 이름이랑 같아요.

혹시, makefile이 어떻게 [현재 사용중인 커널 소스]인지를 판단하는 지 아시는 분 계신가요? 그거 알면 가능하지 않을까...싶은데요?
(사실 이것도 짐작이라... -_-;; )

그럼..점심 맛나게... ^^

wariua의 이미지

Quote:
[ Modules should never use kernel-headers system headers...(중략) change -I/usr/src/linux/include(or similar) to -I/lib/modules/$(uname -r)/build/include ... ]

위 메시지를 찍으내는 건 make 프로그램이 아니라 gcc입니다. /usr/include/linux/modversion.h 파일을 열어 보면 에러 메시지를 찍는 전처리 지시자를 보실 수 있습니다. 아마 이 파일을 /usr/include/linux/module.h가 include할 겁니다.

인즉, 커널 소스에 있는 헤더 파일의 경로를 정확하게 지정해 주는 게 가장 빠르고 정확한 해결 방법입니다. 여러가지 시도를 해보셨는데요... 적어주신 경로가 존재하며 접근이 가능한가요? 가령, "ls /lib/modules/2.6.11-1.1369_FC4/build/include" 라고 하면 헤뎌 파일 목록이 나타나는 건가요?

$PWD `date`

cococo의 이미지

최초 Fedora 깔구요.
소스 파일이 없다는 걸 알고, redhat 홈피 가서 소스 파일 rpm을 다운받은 다음,
#rpmbulid -bp --target_noarch 로 소스 파일 만들고.
/usr/src/redhat/BUILD로 이동해 소스 파일이 생성된 것을 확인했습니다.

현재

1. /lib/modules/2.6.11-1.1369_FC4/build/ ->원래 있던 거
2. /usr/src/kernels/2.6.11-1.1369_FC4/ -> 소스 패키지 다운답아서 생긴거.
3. /usr/src/redhat/BUILD/kernel-2.6.11/linux-2.6.11/ -> 소스 패키지 다운받아서 생긴거.

이 존재합니다.
관심 가져 주셔서 대단히 감사합니다.

그리고 잘 몰라서 여쭈어 보는 건데요. 2. 3번은 같은 소스일 테고,
1번은 현 시스템이 이용하는 거 아닌가요?
즉, 드라이버 파일 만들때,
make -C 커널디렉토리 M=모듈디렉토리 module 쓰잖아요? 이때 위의 1번이 아니라 2,3번 주소 쓰는 게 맞지 않나요?

답변 감사드리구요. 좋은 하루 시작하시기 바랍니다.

pastime의 이미지

제가 Fedora 를 써보지 않아서 확실히는 모르겠지만
2, 3 번 디렉토리에 실제 소스 트리가 있어서 make menuconfig 등이 실행된다면
그쪽으로 잡는 것이 맞을 듯 합니다.

익명 사용자의 이미지

/usr/src/redhat/BUILD/kernel-2.6.11/linux-2.6.11의 위치로 지정해보시죠. 일단 make menuconfig 이후에 make modules를 약간 실행을 하신이후에 작업하세요.
그 이유는 한번도 컴파일을 하지 않으시면 include 밑에 있는 부분에 asm이 링크가 안걸려 있습니다. 소스 RPM으로 설치하셨으니 컴파일을 한적이 없어서 헤더 부분을 찾지 못하실듯하니 한번 빌드해서 make modules에서 [M] 부분이 나타나면 바로 실행을 끝내시고 make -C 커널 소스 디렉토리 M=모듈 위치 디렉토리 modules 를 실행하면 아무 이상이 없을 듯한데요.
재빌드 위치 : /usr/src/linux-2.6.11 이라면
make -C /usr/src/linux-2.6.11 M=/module_dir module 로 하시면 될듯합니다.

위 에러는 그 위치에 헤더 파일들이 존재하지 않아서 나온 에러 인듯합니다. 그러니 헤더 파일들이 제대로 링크 걸려 있는지와 정위치를 지정해 주면 될 듯합니다.

커널의 헤더 파일은 한번 빌드해야 링크가 걸려서 생성됩니다. 그냥 눈으로 확인하실려면 <kernel-version>/include 밑의 디렉토리에서 asm 의 링크 여부를 확인하세요 머신이 x86계열 이면 asm-i386으로 링크가 걸리고요 x86_64이면 asm-x86_64로 걸립니다. 이 부분과 안에 파일들이 존재하는지만 확인하시면 될듯합니다. linux 디렉토리에도 파일이 존재하는지 확인해 보세요.

그럼 빌드에 성공하기를 기원합니다.

cococo의 이미지

되네요!!
말씀하신 대로, asm softlink 파일이 생긴 후에는 컴파일이 됩니다.

기쁩니다. 흐흐흐... 사실 중간에 멈췃다가 에러 나서, 끝까지 컴파일 했거든요... ^^*

자...이제 프로그램만 짜 보면 되는데...이건 어떻게 짜 볼란지.. -_-;;

답변 주신 분들 정말 고맙습니다. 좋은 저녁 되세요!

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.