23

相互に依存する Linux カーネル モジュールのコンパイル中に、リンカは未定義のシンボルの警告を表示します。

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

モジュールが insmod または modprobe を使用してカーネルに挿入されるとすぐに、未解決のシンボルが解決されます。ただし、リンカーの警告を取り除く方法はありますか?

この問題に関する 3 つの Google SERP を読みましたが、誰も答えを知らないようです。これらのリンカー警告は、カーネル モジュールをビルドするときにこのようになるはずですか?

4

5 に答える 5

16

以下のように KBUILD_EXTRA_SYMBOLS を使用します: KBUILD_EXTRA_SYMBOLS='your module path'/Module.symvers

于 2010-02-26T14:42:50.523 に答える
9

ついにできた。私を正しい軌道に乗せてくれたshodanexに感謝します。

更新:古いバージョンのカーネルのビルドにこの修正を適用する場合は、細心の注意を払ってください。古いバージョンのカーネルのMakefile.modpostファイルにはバグがあり、 KBUILD_EXTMODオプションを指定すると、ビルドが誤動作し、間違ったターゲットがビルド

KBUILD_EXTMOD makeパラメーターで、依存するモジュールのソースへのパスを指定する必要があります。

たとえば、モジュールバーのシンボルに依存するモジュールfooがあるとします。

fooのソースファイルはfoo / module /にあり、barのソースファイルはbar /module/にあります。

fooのMakefileのmakeコマンドはおそらく次のようになります

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

(KBUILD_EXTMOD = pwd/../bar/module \行を追加しました。ここで、/ ../bar/ pwdmoduleは、依存するカーネルモジュールのソースへのパスです。

KBUILD_EXTRA_SYMBOLSパラメーターがこのように機能することを期待しますが、それはKBUILD_EXTMODです。

于 2009-03-09T18:06:31.177 に答える
3

いいえそうではありません。コードをツリー内でビルドする場合でも、ツリー外でビルドする場合でも、このメッセージは表示されません。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プロセスがドキュメント化されています

于 2009-03-09T10:53:22.153 に答える
1

KBUILD_EXTMOD を使用する上記の手法と、どのカーネル バージョンで動作するかという問題に関連しています。

  • andycjw は、2.6.12 では機能しないことを示しました
  • 2.6.15 では機能しませんでした (モジュールのビルドが壊れました)
  • カーネル コミットを調べると、2.6.26 と 2.6.28 に関連していると思われる Makefile.modpost への多くの変更が見られるため、そのうちの 1 つが制限であると予想されます。
于 2010-08-31T19:18:54.663 に答える
0

あなたの木に合わせる必要があります。ソースでは、すべてのモジュールへのパスである SYMBOLSDIR を作成しました

SYMBOLSDIR = 'パス'

make (上記の例と同じ) $(KERNELDIR) MODVERDIR=$(SYMBOLSDIR) モジュール

于 2009-06-04T21:39:46.277 に答える