Какие коды, такие как CC, LD и CC[M], выводятся при компиляции ядра Linux?
При компиляции Linux с нуля я понимаю, что при компиляции появляются коды компиляции.
Например, имя файла CC, имя файла LD, имя файла CC[M].
Что означают эти коды?
3 ответа
Различные маркировки указывают на следующее
- [CC] - компилирует файл C в указанный объектный файл. Объектный файл содержит код ассемблера archicture этого файла.c. Как это может также ссылаться на части вне его области. Например, вызов другой функции в другом файле.c. Вызовы функций остаются открытыми в объектном файле, который позже включается компоновщиком. Следовательно
- [LD] - это процесс связывания скомпилированных объектов и соединения вызовов функций, которые были оставлены открытыми компилятором. Тем не менее, многие части связаны между собой как основная часть ядра, а некоторые части не учтены. И таким образом вы видите
- [CC (M)] для тех частей, которые скомпилированы как точки для загрузки в ядро во время выполнения. Но которые не связаны вместе в монолитной части ядра. Но вместо этого может быть вставлено при загрузке ядра.
Давайте возьмем конкретный пример и выясним, что он делает в ядре 4.1, например IHEX
,
Найдите, что делает код
Просто беги:
make SHELL='sh -x'
Как это работает: /questions/39436374/kak-zastavit-makegcc-pokazat-mne-komandyi/39436402#39436402
Если мы 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=1
а также make -s
) работать.
В общем, вам просто нужно
git grep 'cmd.* = CODE'
найти CODE
,
Я подробно объяснил, как работает эта система: /questions/43984526/v-make-fajle-yadra-vyizov-cmd-tegi-chto-zdes-oznachaet-cmd/43984535#43984535
Получить список всех кодов
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)
Это должно показать:
CC
при компиляции основной части ядраCC [M]
при компиляции модуляLD
при связывании