Linux 커널을 컴파일 할 때 CC, LD 및 CC [m] 출력과 같은 코드는 무엇입니까?
-
13-12-2019 - |
문제
스크래치로부터 리눅스를 컴파일하는 동안 나는 컴파일하는 동안 나타나는 컴파일 코드가 있음을 깨닫는다.
예를 들어 cc filename, ld filename, cc [m] filename.
이 코드는 무엇을 의미합니까?
해결책
다른 표시는 다음을 지정합니다
- [CC] - C 파일을 지정된 객체 파일로 컴파일합니다.객체 파일에는 해당 .c 파일의 Archicture 어셈블러 코드가 들어 있습니다.또한 범위 외부의 부품을 참조 할 수도 있습니다.예를 들어 다른 .c 파일에서 다른 함수를 호출합니다.함수 호출은 나중에 링커가 포함하는 객체 파일 내에 열려 있습니다.따라서
- [LD]는 컴파일 된 객체를 함께 연결하는 프로세서이며 컴파일러가 남겨 두었던 함수 호출을 연결합니다.그러나 많은 부분이 커널의 핵심 부분으로 연결되어 있으며 일부 부품은 제외됩니다.따라서 를 보아라 런타임시 커널에 로딩 할 점으로 컴파일 된 부분의
- [CC (m)].그러나 그것은 커널의 모 놀리 식 부분에서 함께 연결되지 않습니다.그러나 대신 커널이 부팅 될 때 삽입 할 수 있습니다.
다른 팁
특정 예를 들어, 커널 4.1에서하는 일을 알아 냈습니다. IHEX
.
코드를 찾는
방금 실행 :
make SHELL='sh -x'
.
해당 작동 방법 : https://stackoverflow.com/a/32010960/895245
IHEX
의 출력을 GREPES에 있으면 다음 줄을 찾습니다.
+ 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
를 찾으십시오.
이 시스템이 어떻게 작동하는지 자세하게 설명했습니다 : https://stackoverflow.com/a/32023861/895245INS >
make | grep -E '^ ' | sort -uk1,1
.
quiet_cmd_cc_o_c = CC $(quiet_modtag) $@
cmd_cc_o_c = $(CC) $(c_flags) -c -o $@ $<
.
$(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 [M]
를 연결할 때 -
LD
CC
제휴하지 않습니다 StackOverflow