모듈 컴파일시 엄청난 에러들이 발생합니다.

Rivian의 이미지

이번에 커널 프로그래밍 공부를 해 보려고 합니다만... 시작부터 문제가 생겼습니다.

익히 아실 hello 모듈을 작성해서 올려 보려고 하는데, 컴파일을 하려니 엄청난 양의 에러가 발생하는군요.

커널은 2.6.16.16 소스를 받아서 직접 컴파일했고, 사용한 코드는 다음과 같습니다.

#include [linux/init.h]
#include [linux/module.h] - []는 꺾음괄호입니다. 꺾음괄호를 직접 쓰니 표시가 안 되네요. ;
#include [linux/kernel.h]
MODULE_LICENSE("Dual BSD/GPL");

static int hello_int( void )
{
printk( KERN_ALERT "Hello, world\n" );
return 0;
}

static void hello_exit( void )
{
printk( KERN_ALERT "Goodbye, cruel world\n" );
}

module_init( hello_init );
module_exit( hello_exit );

컴파일은 아래와 같이 했습니다.

gcc -c -D__KERNEL__ -DMODULE -O2 -Wall hello_mod.c

Makefile을 쓰려고 했는데, 이 경우 강제로 -c와 -o 옵션을 넣어서 '-c 와 -o는 동시에 사용할 수 없습니다' 라는 에러가 발생하더군요(gcc 3.3.5). 그래서 그냥 커맨드라인으로 했습니다.

에러는 아래와 같은 형태입니다(일부).

/usr/include/asm/string.h:58: error: `src' undeclared (first use in this function)
/usr/include/asm/string.h:58: error: (Each undeclared identifier is reported only once
/usr/include/asm/string.h:58: error: for each function it appears in.)
/usr/include/asm/string.h:58: error: `dest' undeclared (first use in this function)
/usr/include/asm/string.h:58: error: `count' undeclared (first use in this function)
/usr/include/asm/string.h: At top level:
/usr/include/asm/string.h:80: error: syntax error before "size_t"
/usr/include/asm/string.h: In function `strncat':
/usr/include/asm/string.h:97: error: `src' undeclared (first use in this function)
/usr/include/asm/string.h:97: error: `dest' undeclared (first use in this function)
/usr/include/asm/string.h:97: error: `count' undeclared (first use in this function)
/usr/include/asm/string.h: At top level:
/usr/include/asm/string.h:125: error: syntax error before "size_t"
/usr/include/asm/string.h: In function `strncmp':
/usr/include/asm/string.h:143: error: `cs' undeclared (first use in this function)
/usr/include/asm/string.h:143: error: `ct' undeclared (first use in this function)
/usr/include/asm/string.h:143: error: `count' undeclared (first use in this function)
/usr/include/asm/string.h: At top level:
/usr/include/asm/string.h:189: error: syntax error before "strlen"
/usr/include/asm/string.h:204: error: syntax error before "size_t"
/usr/include/asm/string.h: In function `__memcpy':
/usr/include/asm/string.h:217: error: `n' undeclared (first use in this function)
/usr/include/asm/string.h:217: error: `to' undeclared (first use in this function)
/usr/include/asm/string.h:217: error: `from' undeclared (first use in this function)
/usr/include/asm/string.h: At top level:
/usr/include/asm/string.h:226: error: syntax error before "size_t"
/usr/include/asm/string.h: In function `__constant_memcpy':
/usr/include/asm/string.h:229: error: `n' undeclared (first use in this function)
/usr/include/asm/string.h:229: error: `to' undeclared (first use in this function)
/usr/include/asm/string.h:232: error: `from' undeclared (first use in this function)
/usr/include/asm/string.h: At top level:
/usr/include/asm/string.h:294: error: syntax error before "size_t"
/usr/include/asm/string.h: In function `__constant_memcpy3d':
/usr/include/asm/string.h:296: error: `len' undeclared (first use in this function)
/usr/include/asm/string.h:297: error: `to' undeclared (first use in this function)
/usr/include/asm/string.h:297: error: `from' undeclared (first use in this function)
/usr/include/asm/string.h: At top level:
/usr/include/asm/string.h:301: error: syntax error before "size_t"
/usr/include/asm/string.h: In function `__memcpy3d':
/usr/include/asm/string.h:303: error: `len' undeclared (first use in this function)
/usr/include/asm/string.h:304: error: `to' undeclared (first use in this function)
/usr/include/asm/string.h:304: error: `from' undeclared (first use in this function)
/usr/include/asm/string.h: At top level:

string.h 외에도 다른 헤더 파일들에서 저런 식의 에러가 마구 발생합니다. 물론 /usr/include/asm과 /usr/include/linux 디렉토리는 커널 소스 디렉토리로 링크해 놓았습니다. 커널과 기타 소스들의 컴파일에는 문제가 없는데, 어째서 저러는지 모르겠습니다. 혹시 아시는 분은 답변 부탁드립니다.

그럼...

세이군의 이미지

코드 블럭은 <code> </code>으로 감싸주시면 잘 보입니다.
------------------
한 걸음 더 가까이

sohn9086의 이미지

제 경우에는 커맨드라인에서 모듈 컴파일해 본 적이 없어서 잘 모르겠습니다만, Makefile내용을 알려주시면 도움을 드릴 수 있을지도 모르겠네요.

참고로, static int hello_int( void )에서 hello_int 는 단순한 오타라고 보고, hello_init으로 고친후 다음 Makefile으로 컴파일이 가능했습니다.

*Makefile 내용*

obj-m += hello_mod.o
 
all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

물론 /lib/modules/$(shell uname -r)/build (이번 경우에는 /lib/modules/2.6.16.16/build 겠죠) 가 제대로 커널 소스 디렉토리에 링크되어 있다는 가정하에서죠

-------------
save the earth

생산적인 댓글을 달자

Rivian의 이미지

두 분 다 고맙습니다. 제가 모듈 컴파일 방법을 잘못 알고 라이브러리 디렉토리의 마지막 build 부분을 빼 먹고 있었습니다. 끙...프로그램은 하루이틀 짠 것도 아닌데 이런건 처음이라 엄한 실수를 하게 되네요. 고맙습니다. :)

powerson의 이미지


음.. 잘못 알고 있는게 아니라 현재 컴파일 하신거 보시면 2.4에서 동작하는 방식으로 컴파일을 하셨기 때문에 저런 에러들이 발생한 걸껍니다. 2.4.x커널에서 작성하시고 해보시면 잘 되실겁니다.

위에분들이 알려주신건 2.6 방식으로 알려주신거라서 잘 되는거고요. ^^
그럼 수고하세요.

아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

댓글 달기

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