2009-03-09 2 views
19

서로 의존 리눅스 커널 모듈을 컴파일하는 동안, 링커 모듈 insmod 명령이나으로 modprobe를 사용하여 커널로 삽입되고, 상기 미해결 심볼 즉시 해결linux 커널 모듈 링커 경고 : "*** 경고 : <function> [<module>] undefined!" - 그걸 없앨 방법이 있니?

Building modules, stage 2. 
MODPOST 
*** Warning: "function_name1" [module_name] undefined! 
*** Warning: "function_name2" [module_name] undefined! 
*** Warning: "function_name3" [module_name] undefined! 

추천되지 않은 심볼 경고를 준다. 그래도 링커 경고를 제거 할 수있는 방법이 있습니까?

나는이 문제에 대해 3 개의 Google SERP를 읽었습니다. 아무도 대답을 알 수없는 것 같습니다. 커널 모듈을 만들 때 이러한 링커 경고가 이런 식으로되어 있습니까?

답변

3

아니요. Whet 당신이 나무 또는 트리 밖으로,이 메시지를 표시해서는 안됩니다 귀하의 코드를 빌드합니다. 나는 당신이 당신의 Makefile을 수정해야한다고 생각합니다. 다음은 makefile의 예입니다. 완벽하지,하지만 작동하는 데 사용 (2.6.26까지, 이후 시도하지 않았다) :

추가 문서에 대해서는
ifneq ($(KERNELRELEASE),) 
# We were called by kbuild 

obj-m += mymodule.o 
mymodule-objs := mymodule_usb.o a.o b.o c.o 

else # We were called from command line 

KDIR := /lib/modules/$(shell uname -r)/build 
PWD := $(shell pwd) 

default: 
    @echo ' Building FOO drivers for 2.6 kernel.' 
    @echo ' PLEASE IGNORE THE "Overriding SUBDIRS" WARNING' 
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules 

install: 
    ./do_install.sh *.ko 

endif # End kbuild check 

clean: 
    rm -f -r *.o *.ko .*cmd .tmp* core *.i 

, 당신은 커널 트리를 확인할 수 있으며,는 kbuild 과정은 내가 마지막으로 documented

+0

답변 해 주셔서 감사합니다. 정확히 어떤 생각이야? – Gary

+0

죄송하지만 실제로 작동하지 않습니다. 경고가 아직 있습니다. 또한 @echo 'SUBDIRS 무시 "경고를 무시하십시오. 동일한 접근법을 사용하여 '정의되지 않은 [module_name]을 무시하십시오!' 경고하지만 분명히 이것은 내가 찾는 방법이 아닙니다. – Gary

9

입니다 알았다. 저를 올바른 길로 인도 해준 shodanex에게 감사드립니다.

업데이트 : 빌드가 오작동 및 구축하게 커널의 ​​이전 버전에서 Makefile.modpost 파일에 버그가있는 한,에 커널의 이전 버전에 대한 구축이 수정 프로그램을 적용 할 때 매우 조심 KBUILD_EXTMOD 옵션을 지정할 때 잘못된 대상.

KBUILD_EXTMOD 매개 변수에 의존하는 모듈 원본의 경로를 지정해야합니다.

모듈 foo 모듈 의 기호에 따라 달라집니다./모듈/가

foo는에 대한 메이크에서 make 명령 아마

처럼 보인다 줄에 foo는에 대한

소스 파일이 바 foo는/모듈/ 및 소스 파일에 있습니다

make ARCH=$$ARCH CROSS_COMPILE=$$CROSS_COMPILE -C $$LINUX_DIR \ 
    M=`pwd`/module \ 
    modules 

(정확한 라인은 프로젝트에 따라 다를 수 있음)

make ARCH=$$ARCH CROSS_COMPILE=$$CROSS_COMPILE -C $$LINUX_DIR \ 
    M=`pwd`/module \ 
    KBUILD_EXTMOD=`pwd`/../bar/module \ 
    modules 

변경은 (우리는 pwd /../bar/module는 커널 모듈의 소스를 우리가 따라 경로 인 KBUILD_EXTMOD = pwd /../bar/module의 \ 라인을 추가 에.

하나는하지만 그것은 KBUILD_EXTMOD이다, 이런 식으로 일을 KBUILD_EXTRA_SYMBOLS에게 매개 변수를 기대하는 것이다.

+1

이 버전의 Linux에서이 작업이 시작됩니까? 나는 외부 모듈을 만드는 2.6.12 커널에서이 방법을 사용하려고했지만 아무 소용이 없어도 모듈 만 빌드하고 foo 모듈은 무시한다. – andycjw

+0

KBUILD_EXTMOD는 M (및 SUBDIRS)과 동의어이므로 바 모듈을 빌드합니다. sinojs 응답에 따라 KBUILD_EXTRA_SYMBOLS를 사용하십시오. –

0

내 나무에 맞게해야합니다. 우리의 소스에서 우리는 모든 모듈

SYMBOLSDIR = '어떤 경로'

메이크업 (예 : 상기와 동일) $ (KERNELDIR) MODVERDIR = $ (SYMBOLSDIR) 모듈

경로 인 SYMBOLSDIR 만들어 아래
16

사용 KBUILD_EXTRA_SYMBOLS : KBUILD_EXTRA_SYMBOLS = '모듈 경로'/ Module.symvers

+1

올바른 방법입니다. 리눅스 커널 소스 트리의 Documentation/kbuild/modules.txt가이 정보를 얻을 수있는 소스입니다. –

+0

+1. 관련된 움직임에서 커널을 재구성 한 경우 (변경 사항이없는 경우에도) 나중에 모듈을 만들어 심볼을 동기화 상태로 유지하도록하십시오. 그렇지 않으면이 오류가 발생합니다. – carveone

1

KBUILD_EXTMOD를 사용하는 위의 기술, 그리고 아래에 작동하는 커널 버전의 질문에 관련 :

커널을 통해 찾고
  • andycjw는 그것이 2.6.15에서 나를 위해 작동하지 않았다 2.6.12
  • 에서 그를 위해 작동하지 않았다 표시 (파산 내 모듈 빌드)
  • 내가 번호를 참조 커밋 2.6.26과 2.6.28과 관련된 것 같은 Makefile.modpost에 대한 변경 사항 중 하나가 한계가 될 것으로 예상됩니다.