Linux 커널 모듈에 로컬 헤더 파일을 포함하는 방법

Linux 커널 모듈에 로컬 헤더 파일을 포함하는 방법

다음과 같은 소스 파일을 포함하는 모듈이 있다고 가정해 보겠습니다 mymod.

src/mod/mymod.c
src/inc/mymod.h

다음과 같이 mymod.h를 포함해 보았습니다.

#include <mymod.h>

내 메이크파일에 다음이 포함되어 있지만 EXTRA_CFLAGS= -I$(shell pwd)/../inc/커널을 만들 때 오류 메시지가 나타납니다.

mymod.h를 찾을 수 없습니다

그 이유는 커널 모듈을 생성할 때 다음 명령이 makefile에서 실행되기 때문인 것 같습니다( makeV1 사용).

make -C <path/to/linux/src> M=<path/to/mymod> modules

다른 작품에서는 내가 원하는 내용이 아닌데 $(shell pwd)로 콘텐츠가 확장됐어요 . 소스 트리를 가리키는 매개변수를 <path/to/linux>어떻게 지정합니까 ?-Isrc/incmymod

답변1

Linux 커널 makefile은 Kbuild 프레임워크를 사용합니다. 이는 GNU make에 의해 해석되지만 Kbuild에는 특별한 사용 규칙이 있는 매크로가 많이 포함되어 있으므로 일반적인 makefile 지침이 적용되지 않습니다. Kbuild의 좋은 점은 작업의 복잡성을 고려할 때 상용구가 거의 필요하지 않다는 것입니다.

Kbuild는 다음 커널 소스 코드에 문서화되어 있습니다.Documentation/kbuild. 모듈 작성자로서 특히 읽어야 할 내용은 다음과 같습니다.modules.txt(적어도 다른 것들은 찾아보세요).

변수를 사용하면 확장되기 때문에 지금 하고 있는 작업은 작동하지 않습니다 $(shell pwd). EXTRA_CFLAGSmakefile은 모듈 디렉터리(Kbuild의 명백하지 않은 여러 측면 중 하나)가 아닌 커널 소스 트리에서 실행되므로 잘못된 디렉터리를 선택합니다.

트리 외부의 모듈에 포함 디렉터리를 지정하는 공식 관용어는 §5.3에 있습니다 modules.txt. 이 src변수는 모듈의 최상위 디렉터리로 설정됩니다. 그래서:

EXTRA_CFLAGS := -I$(src)/src/inc

Kbuild이 선언은 모듈 트리의 루트에 있는 파일에 있어야 합니다. (이 디렉토리를 모듈 트리의 루트로 생각하면 됩니다 src. 그렇다면 해당 디렉토리를 Kbuild거기에 두고 위의 값을 로 바꾸십시오 -I$(src)/inc.) 에 넣을 수도 있지만 Makefile이 정의(커널 모듈을 빌드할 때만 적용되는 모든 것)는 조건부 지시문에 있어야 합니다 ifeq ($(KERNELRELEASE),). 섹션 4.1을 참조하십시오 modules.txt.

아직 파일이 없고 Kbuild파일로 전환하고 싶다면 섹션 §4.1을 읽어보세요 modules.txt. 별도의 문서를 갖는 것이 Kbuild조금 더 명확할 것입니다 . 호출 규칙을 제외하고 커널에 적용되는 어떤 것도 기본 makefile에 넣지 마십시오 make -C $(KERNELDIR) M=$(pwd). 에서 Kbuild최소한 필요한 것은 빌드 중인 모듈 목록(일반적으로 단 하나)과 종속성 선언과 함께 모듈에 포함할 파일 목록입니다.

EXTRA_CFLAGS := -I$(src)/inc
obj-m := mymod.o
mymod-y := $(src)/mod/mymod.o
$(src)/mod/mymod.o: $(src)/inc/mymod.h

답변2

#include전통적으로 현재 소스 코드 디렉터리에 상대적인 경로가 있는 파일을 가져오는 방법은 꺾쇠 괄호 대신 따옴표를 사용하는 것입니다.

#include <stdio.h>
#include "mygreatfunctions.h"

이 경우 첫 번째는 #include컴파일러의 포함 검색 경로( -Igcc의 경우 명령줄 스위치로 제어됨)를 참조하고 두 번째는 #include.

이러한 경로는 상대적일 수도 있습니다. 따라서 src/mod/mymod.c에서 다음과 같이 말할 수 있습니다.

#include "../inc/mymod.h"

"그냥 작동"해야 합니다.

이것이 Linux 커널 트리에서 일반적인 관행인지는 모르겠지만 의도하지 않은 부작용이 많이 발생할 수 있는 포함 경로를 엉망으로 만드는 것보다 확실히 낫습니다.

관련 정보