2

特別なファイルをインクルードしたいカーネルモジュールがあります。ファイルは ASM ファイルです。それについて特別なことは何もありませんが、ファイル拡張子も「.asm」であり、gcc によって認識されません。移植性のために名前を変更することは避けたいと思います。(別の非 GNU コンパイラでも使用されています。)

通常、私のメイクファイルは次のようになります。

obj-m := chardev.o
chardev-objs := chardev2.o file2.o asm_test.o

all:
    make -C $(uClinux_dist_path) M=$$PWD modules

clean:
    make -C $(uClinux_dist_path) M=$$PWD clean

「asm_test.asm」という名前の asm_test が問題です。(「asm_test.S」という名前で動作します。)

私のユーザー空間プログラムでは、次のルールを挿入することでこれを解決できます。

asm_test.o:
    $(CC) -c -x assembler-with-cpp asm_test.asm

しかし、それはカーネルのメイクファイルでは機能しないようです。

カーネルのメイクファイルで特別なファイル規則を作成する方法を知っている人はいますか?



ところで、私はクロス コンパイルされた Blackfin uClinux dist を使用しています。それが違いを生むなら。

4

3 に答える 3

3

kbuild の標準モジュール Makefile は 2 つのパスで実行されます。最初のパスは、カーネル ソース ツリーから make を再実行するだけで、Makefile の複雑な kbuild スイートを使用してモジュールをビルドします。この 2 番目の呼び出しでは、Makefile の変数定義を使用しますが、kbuild の世界のすべてのルールを使用します。

kbuild ドキュメントhttps://www.kernel.org/doc/Documentation/kbuild/makefiles.txtのセクション 3.10 (特別なルール)では、これらの追加ルールの作成方法について説明しています。kbuild は、使用される実際のディレクトリを展開するために使用する必要があるいくつかの追加変数を定義します。あなたの場合:

$(obj)/asm_test.o:
    $(CC) -c -x assembler-with-cpp -o $(obj)/asm_test.o $(src)/asm_test.asm

結果が正しいディレクトリに確実に保存されるように、明示的な出力ファイル名を追加したことに注意してください。

于 2013-08-21T12:55:51.797 に答える
1

ファイルの名前を変更する必要はありません。コピーまたはリンクするだけでかまいません。

asm_test.S: asm_test.asm
    ln -s asm_test.asm asm_test.S
于 2013-08-21T09:38:57.087 に答える
0

カーネルの Makefile 規則では、obj-m に追加された各ターゲットは、単一のソース カーネル モジュールであると見なされます。そのため、アセンブリ オブジェクトを obj-m に追加すると失敗する場合があります。カーネル ビルド ルールは各ファイルを C ソースとして扱い、アセンブリ ソースを見つけることができません。

このモジュールが複数ソース モジュールであることを make システムに伝える必要があります。複数ソース モジュールでは、ソースは C またはアセンブリの場合があります。

すべてのオブジェクトを含むアーカイブ オブジェクト ファイルを定義し、このアーカイブ オブジェクト ファイルを obj-m に追加する例を次に示します。

obj-m += modulename.o
modulename-objs += cfile1.o cfile2.o asmfile.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

この例は、Linux 3.6.6 の Makefile ルールでうまく機能します。

于 2015-05-15T06:38:43.270 に答える