Quais são os códigos como CC, LD e CC[M] saída ao compilar o kernel Linux?
ao compilar o Linux do zero, percebi que existem códigos de compilação que aparecem ao compilar.
por exemplo, nome do ficheiro CC, nome do ficheiro LD, nome do ficheiro CC[M].
O que significam estes códigos?3 answers
As diferentes marcações especificam o seguinte
- [CC] - compila o ficheiro C num ficheiro objecto designado. O arquivo objeto contém o código de montagem de archicture disso .c file. Uma vez que também pode fazer referência a partes fora do seu âmbito de aplicação. Por exemplo, chamando outra função em outra .c file. As chamadas de função são deixadas abertas dentro do arquivo objeto, que é mais tarde incluído pelo linker. Portanto
- [LD] é o processo de ligar os objectos compilados, e conecte as chamadas de função que foram deixadas abertas pelo compilador. No entanto, muitas partes estão ligadas entre si como a parte central do kernel, enquanto algumas partes são deixadas de fora. E assim você vê
- [CC (M)] para as partes que são compiladas como pontos a serem carregados no kernel em tempo de execução. Mas que não estão ligados na parte monolítica do núcleo. Mas em vez disso pode ser inserido quando o kernel é inicializado.
Vamos pegar um exemplo específico e descobrir o que ele faz no kernel 4.1, por exemplo IHEX
.
Encontre o que um código faz
Apenas corre:
make SHELL='sh -x'
Como isso funciona: https://stackoverflow.com/a/32010960/895245
Se dobrarmos a saída para IHEX
, encontramos as linhas:
+ 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
Então concluímos que IHEX
faz a objcopy -Iihex
.
Procurar onde está definido um código
Todos os comandos do 'kernel' devem ser definidos com algo como:
quiet_cmd_ihex = IHEX $@
cmd_ihex = $(OBJCOPY) -Iihex -Obinary $< $@
$(obj)/%: $(obj)/%.ihex
$(call cmd,ihex)
Para as configurações de verbosidade (por exemplo V=1
e make -s
) funcionarem.
git grep 'cmd.* = CODE'
Para encontrar CODE
.
Obtenha a lista de todos os códigos
make | grep -E '^ ' | sort -uk1,1
CC e CC [M]
Definido em scripts/Makefile.build
:
quiet_cmd_cc_o_c = CC $(quiet_modtag) $@
cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
E o [M]
vem do alvo variáveis específicas:
$(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]
É então chamado através:
$(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); \
Em que if_changed_rule
é definido em scripts/Kbuild.include
como:
if_changed_rule = $(if $(strip $(any-prereq) $(arg-check) ), \
@set -e; \
$(rule_$(1)))
E Kbuild.include
são incluídos no Makefile de alto nível.
LD
Existem algumas versões, mas a mais simples parece ser:
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)
E em 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)
Deve mostrar:
-
CC
ao compilar uma parte central do núcleo -
CC [M]
ao compilar um módulo -
LD
ao ligar