18

Linuxを最初からコンパイルしていると、コンパイル中に表示されるコンパイルコードがあることに気付きました。

たとえば、CCファイル名、LDファイル名、CC[M]ファイル名。

これらのコードはどういう意味ですか?

4

3 に答える 3

20

異なるマーキングは以下を指定します

  • [CC]-Cファイルを指定されたオブジェクトファイルにコンパイルします。オブジェクトファイルには、その.cファイルのアーキテクチャアセンブラコードが含まれています。範囲外のパーツも参照する可能性があるため。たとえば、別の.cファイルで別の関数を呼び出します。関数呼び出しは、後でリンカによって含まれるオブジェクトファイル内で開いたままになります。したがって
  • [LD]は、コンパイルされたオブジェクトをリンクし、コンパイラーによって開いたままになっている関数呼び出しを接続するプロセスです。ただし、多くの部分はカーネルのコア部分として相互にリンクされていますが、一部は省略されています。したがって、あなたは見る
  • [CC(M)]実行時にカーネルにロードされるポイントとしてコンパイルされる部分。しかし、カーネルのモノリシック部分ではリンクされていません。ただし、代わりに、カーネルの起動時に挿入できます。
于 2012-07-28T06:07:21.867 に答える
9

具体的な例を見て、カーネル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

したがって、これIHEXobjcopy -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)
于 2015-08-15T11:16:37.993 に答える
3

次のように表示されます。

  • CCカーネルのコア部分をコンパイルするとき
  • CC [M]モジュールをコンパイルするとき
  • LDリンクするとき
于 2012-07-28T05:14:31.997 に答える