7

私は 2.6.x カーネル用の Linux カーネル モジュールに取り組んでおり、アセンブリ出力を表示する必要がありますが、現在は一時ファイルとして実行されており、あとがきが削除されています。問題がどこにあるかを簡単に追跡できるように、アセンブリの出力を C ソース ファイルと混在させたいと考えています。これは ARMv6 コア用であり、どうやら objdump はこのアーキテクチャをサポートしていません。以下にメイクファイルを含めました。

ETREP=/xxSourceTreexx/
GNU_BIN=$(ETREP)/arm-none-linux-gnueabi/bin
CROSS_COMPILE := $(GNU_BIN)/arm-none-linux-gnueabi-
ARCH := arm
KDIR=$(ETREP)/linux-2.6.31/
MAKE= CROSS_COMPILE=$(CROSS_COMPILE) ARCH=$(ARCH) make
obj-m += xxfile1xx.o

all:
 $(MAKE) -C $(KDIR) M=$(PWD) modules

clean:
 $(MAKE) -C $(KDIR) M=$(PWD) clean
4

5 に答える 5

7

Objdumpはそのアーキテクチャをサポートします。実行可能ファイルが呼び出されますarm-none-linux-gnueabi-objdump

于 2010-05-24T23:09:46.000 に答える
6

gccとgnuアセンブラが、得られるよりも読みやすい出力であると仮定しobjdumpます。gccへのフラグを使用して中間コードを保持するようにアセンブラに指示します。

 -Wa,-alh=basename.s

そしてbasename、実際のソースファイル名になるには、makeに指示する必要があります。

 -Wa,-alh=$<.s

これにより、foo.csファイルの山がソースディレクトリの周りに残ります。ここでの大きな問題は、gccの動作方法で、コード生成とアセンブリの間に一時ファイルが使用されることです。gccに中間体を保存させる方法が見つかりませんが、アセンブラーがリストを隠してくれます。

その議論をMakefileCFLAGSに取り入れることは、読者の練習問題として残されています(私は「make」が嫌いで、「gnuinfo」がさらに嫌いだからです。

于 2010-05-24T23:23:23.997 に答える
2

Linux カーネル モジュールのアセンブリ言語リストを取得するために、アセンブラー スイッチをカーネル scripts/Makefile.build に追加しました。

#cmd_cc_o_c = $(CC) $(c_flags) -c -o $(@D)/.tmp_$(@F) $<
cmd_cc_o_c = $(CC) $(c_flags) -c -Wa,-alh=$<.lst -o $(@D)/.tmp_$(@F) $<
于 2011-11-04T21:14:36.260 に答える
0

フラグ「-save-temps」を gcc に試すことができます。私の組み込みプロジェクトではうまくいきますが、カーネルビルドでは試していません。

于 2012-10-01T13:16:16.373 に答える
0

適切な方法は、モジュールの makefile / Kbuild ファイルにターゲットの依存関係を追加することです。

always-m += basename.s

(kbuild には .s ファイルを生成するための適切なターゲットがあるため)

あなたが私のように怠け者である場合、これは次のようになります。

MOD_NAME := some_module_name
myunits := file1 file2 file3 ... and many more... without .c extension

obj-m   := $(MOD_NAME).o
$(MOD_NAME)-y := $(addsuffix .o,$(myunits))

# Comment/uncomment to generate assembly / preprocessor output
always-m += $(addsuffix .s,$(myunits)) $(MOD_NAME).mod.s
always-m += $(addsuffix .i,$(myunits)) $(MOD_NAME).mod.i

(2 つのボーナス: 生成されたモジュール メタ登録ファイルのアセンブリと、プリプロセッサの出力)

于 2021-11-30T14:35:49.843 に答える