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.
 10
Author: Matias Bjørling, 2012-07-28 06:07:21

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.

Então, em geral, só tens de ...
git grep 'cmd.* = CODE'

Para encontrar CODE.

Eu expliquei em detalhes como este sistema funciona em: https://stackoverflow.com/a/32023861/895245

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
 1
Author: Basile Starynkevitch, 2012-07-28 05:14:31