Linux 커널을 컴파일 할 때 CC, LD 및 CC [m] 출력과 같은 코드는 무엇입니까?

StackOverflow https://stackoverflow.com//questions/11697800

문제

스크래치로부터 리눅스를 컴파일하는 동안 나는 컴파일하는 동안 나타나는 컴파일 코드가 있음을 깨닫는다.

예를 들어 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
.

IHEXobjcopy -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/895245INS >

모든 코드 목록 가져 오기

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
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top