모듈 컴파일시 엄청난 에러들이 발생합니다.
이번에 커널 프로그래밍 공부를 해 보려고 합니다만... 시작부터 문제가 생겼습니다.
익히 아실 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> </code>으로 감싸주시면 잘 보입니다.
------------------
한 걸음 더 가까이
제 경우에는
제 경우에는 커맨드라인에서 모듈 컴파일해 본 적이 없어서 잘 모르겠습니다만, Makefile내용을 알려주시면 도움을 드릴 수 있을지도 모르겠네요.
참고로, static int hello_int( void )에서 hello_int 는 단순한 오타라고 보고, hello_init으로 고친후 다음 Makefile으로 컴파일이 가능했습니다.
*Makefile 내용*
물론 /lib/modules/$(shell uname -r)/build (이번 경우에는 /lib/modules/2.6.16.16/build 겠죠) 가 제대로 커널 소스 디렉토리에 링크되어 있다는 가정하에서죠
-------------
save the earth
생산적인 댓글을 달자
해결했습니다. 고맙습니다.
두 분 다 고맙습니다. 제가 모듈 컴파일 방법을 잘못 알고 라이브러리 디렉토리의 마지막 build 부분을 빼 먹고 있었습니다. 끙...프로그램은 하루이틀 짠 것도 아닌데 이런건 처음이라 엄한 실수를 하게 되네요. 고맙습니다. :)
음.. 잘못 알고
음.. 잘못 알고 있는게 아니라 현재 컴파일 하신거 보시면 2.4에서 동작하는 방식으로 컴파일을 하셨기 때문에 저런 에러들이 발생한 걸껍니다. 2.4.x커널에서 작성하시고 해보시면 잘 되실겁니다.
위에분들이 알려주신건 2.6 방식으로 알려주신거라서 잘 되는거고요. ^^
그럼 수고하세요.
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.
댓글 달기