在编译Linux内核时,输出CC,LD和CC 的代码是什么?

从头开始编译Linux时,我意识到在编译时会出现编译代码。

例如CC文件名,LD文件名,CC [M]文件名。

这些代码是什么意思?

不同的标记指定以下内容

  • [CC] – 将C文件编译成指定的目标文件。 目标文件包含.c文件的archicture汇编代码。 因为它也可能涉及范围之外的部分。 例如在另一个.c文件中调用另一个函数。 函数调用在对象文件中保持打开,该对象文件稍后由链接器包含。 因此
  • [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=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包含在顶层的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链接时