Linuxカーネルをコンパイルするときは、CC、LD、CC [M]出力などのコードは何ですか?

StackOverflow https://stackoverflow.com//questions/11697800

質問

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
.

だから私たちはIHEXobjcopy -Iihexを実行すると結論します。

コードが定義されている場所を見つける

すべてのカーネルコマンドは、次のようなもので定義する必要があります。

quiet_cmd_ihex  = IHEX    $@
      cmd_ihex  = $(OBJCOPY) -Iihex -Obinary $< $@

$(obj)/%: $(obj)/%.ihex
        $(call cmd,ihex)
.

冗長性の設定(例えば、V=1make -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_rulescripts/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
  • モジュールをコンパイルするときのCC [M]
  • LinkikeTagCode
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top