Linuxを最初からコンパイルしていると、コンパイル中に表示されるコンパイルコードがあることに気付きました。
たとえば、CCファイル名、LDファイル名、CC[M]ファイル名。
これらのコードはどういう意味ですか?
Linuxを最初からコンパイルしていると、コンパイル中に表示されるコンパイルコードがあることに気付きました。
たとえば、CCファイル名、LDファイル名、CC[M]ファイル名。
これらのコードはどういう意味ですか?
異なるマーキングは以下を指定します
具体的な例を見て、カーネル4.1で何が行われるかを理解しましょうIHEX
。
コードが何をするかを見つける
とにかく走れ:
make SHELL='sh -x'
それがどのように機能するか:https ://stackoverflow.com/a/32010960/895245
の出力をgrepすると、IHEX
次の行が見つかります。
+ echo IHEX firmware/e100/d101s_ucode.bin
IHEX firmware/e100/d101s_ucode.bin
+ objcopy -Iihex -Obinary /home/ciro/git/kernel/src/firmware/e100/d101s_ucode.bin.ihex firmware/e100/d101s_ucode.bin
したがって、これIHEX
はobjcopy -Iihex
。
コードが定義されている場所を見つける
すべてのカーネルコマンドは、次のように定義する必要があります。
quiet_cmd_ihex = IHEX $@
cmd_ihex = $(OBJCOPY) -Iihex -Obinary $< $@
$(obj)/%: $(obj)/%.ihex
$(call cmd,ihex)
詳細設定(V=1
およびmake -s
)が機能するようにします。
したがって、一般的には、
git grep 'cmd.* = CODE'
見つけるためにCODE
。
このシステムがどのように機能するかについて詳しく説明しました:https ://stackoverflow.com/a/32023861/895245
すべてのコードのリストを取得する
make | grep -E '^ ' | sort -uk1,1
CCおよびCC[M]
で定義scripts/Makefile.build
:
quiet_cmd_cc_o_c = CC $(quiet_modtag) $@
cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
そして、ターゲット固有の変数[M]
から来ます:
$(real-objs-m) : quiet_modtag := [M]
$(real-objs-m:.o=.i) : quiet_modtag := [M]
$(real-objs-m:.o=.s) : quiet_modtag := [M]
$(real-objs-m:.o=.lst): quiet_modtag := [M]
$(obj-m) : quiet_modtag := [M]
次に、次のように呼び出されます。
$(obj)/%.o: $(src)/%.c $(recordmcount_source) FORCE
[...]
$(call if_changed_rule,cc_o_c)
define rule_cc_o_c
[...]
$(call echo-cmd,cc_o_c) $(cmd_cc_o_c); \
ここで、if_changed_rule
は次のように定義されscripts/Kbuild.include
ています。
if_changed_rule = $(if $(strip $(any-prereq) $(arg-check) ), \
@set -e; \
$(rule_$(1)))
Kbuild.include
トップレベルのMakefileに含まれます。
LD
いくつかのバージョンがありますが、最も単純なのは次のようです。
quiet_cmd_link_o_target = LD $@
cmd_link_o_target = $(if $(strip $(obj-y)),\
$(LD) $(ld_flags) -r -o $@ $(filter $(obj-y), $^) \
$(cmd_secanalysis),\
rm -f $@; $(AR) rcs$(KBUILD_ARFLAGS) $@)
$(builtin-target): $(obj-y) FORCE
$(call if_changed,link_o_target)
とでscripts/Kbuild.include
:
# Execute command if command has changed or prerequisite(s) are updated.
#
if_changed = $(if $(strip $(any-prereq) $(arg-check)), \
@set -e; \
$(echo-cmd) $(cmd_$(1)); \
printf '%s\n' 'cmd_$@ := $(make-cmd)' > $(dot-target).cmd)
次のように表示されます。
CC
カーネルのコア部分をコンパイルするときCC [M]
モジュールをコンパイルするときLD
リンクするとき