Linuxカーネルをコンパイルするときは、CC、LD、CC [M]出力などのコードは何ですか?
-
13-12-2019 - |
質問
Linuxをスクラッチからコンパイルしている間、コンパイル中に表示されるコンパイルコードがあることを認識します。
例えばCCのファイル名、LDのファイル名、CC [M] filename。
これらの符号はどういう意味ですか?
解決
異なるマーキングは次の
を指定します- [cc] - Cファイルを指定オブジェクトファイルにコンパイルします。オブジェクトファイルには、その.cファイルのArchictureアセンブラコードが含まれています。それはまたその範囲外の部分を参照するかもしれません。たとえば、別の.cファイルで別の関数を呼び出します。関数呼び出しはオブジェクトファイル内で開いたままになります。これは後でリンカによって含まれます。したがって
- [ld]コンパイルされたオブジェクトをまとめてコンパイラによって開いたままにしている関数呼び出しを配線するプロセスです。ただし、多くの部分はカーネルのコア部分として互いにリンクされていますが、一部の部分は省略されています。したがってあなたは を見ます 実行時にカーネルにロードされるポイントとしてコンパイルされている部分の
- [cc(m)]。しかし、それはカーネルのモノリシック部分にまとめられていません。しかし、カーネルが起動されたときに代わりに挿入することができます。
他のヒント
具体的な例を取り、それがカーネル4.1で何をしているのかを把握しましょう。 IHEX
コードが何をしているのかを見つける
走る:
make SHELL='sh -x'
.
どのように機能するか: https://stackoverflow.com/a/32010960/895245
IHEX
の出力をgrep grap grep:
+ 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
が最上位メイクファイルに含まれます。
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)
. それを示すべきです:
- kernel のコア部分をコンパイルするときの
- モジュールをコンパイルするときの
CC [M]
- LinkikeTagCode
CC