3.3.5. 링커 피드백

armlink는 다음에 파일이 컴파일될 때를 위해 피드백을 제공하여 컴파일러에게 사용하지 않는 함수에 대해 알려줍니다. 사용하지 않는 함수는 링커에서 나중에 제거할 수 있도록 별도의 섹션에 배치됩니다.

--inline 최적화가 설정되면(분기 인라이닝 참조) 링커가 인라이닝한 함수도 피드백 파일에 내보내집니다. 인라이닝된 함수는 자체 섹션에도 배치됩니다.

--feedback file 옵션은 각 출력 파일 이름을 포함하는 피드백 파일을 주석으로 생성하고 파일에 있는 사용하지 않은 심볼을 생성합니다. 예를 들면 다음과 같습니다.

;#<FEEDBACK># ARM Linker, RVCT3.0 [Build num]: Last Updated: Date
;VERSION 0.2
;FILE dhry_1.o
unused_func1 <= USED 0
inlined_func <= LINKER_INLINED
;FILE dhry_2.o
unused_func2 <= USED 0

다음에 소스를 컴파일할 때 컴파일러 옵션 --feedback file을 사용하여 사용할 링커 생성 피드백 파일을 지정하십시오. 피드백 파일이 없으면 컴파일러가 경고 메시지를 발행합니다.

링커 피드백 예제

피드백 작동 방법을 확인하려면 다음과 같이 하십시오.

  1. Example 3.2에 표시된 코드를 포함하는 fb.c 파일을 만듭니다.

    Example 3.2. 피드백 예제

    #include <stdio.h>
    
    void legacy() {
        printf("This is a legacy function, that is no longer used.\n");
    }
    
    int cubed(int i) {
        return i*i*i;
    }
    
    void main() {
        int n = 3;
        printf("%d cubed = %d\n",n,cubed(n));
    }
    
  2. 프로그램을 컴파일합니다(피드백 파일이 없다는 경고 무시).

    armcc --asm -c --feedback fb.txt fb.c
    

    이것은 기본적으로 cubed() 함수를 인라이닝하고 어셈블러 파일 fb.s와 개체 파일 fb.o를 생성합니다. 어셈블러 파일에서 legacy()cubed()의 코드는 여전히 존재합니다. 인라이닝 때문에 main에서 cubed()에 대한 호출은 없습니다.

    cubed()의 라인 외부 복사본은 static으로 선언되지 않았기 때문에 보관됩니다.

  3. 다음과 같이 개체 파일을 링크하여 명령 행으로 링커 피드백 파일을 만듭니다.

    armlink --info sizes --list fbout1.txt --feedback fb.txt fb.o -o fb.axf
    

    링커 진단이 fbout1.txt 파일에 출력됩니다.

    Note

    이러한 옵션에 대한 자세한 내용은 이미지 관련 정보 생성링커 진단 제어를 참조하십시오.

    링커 피드백 파일은 주석에서 사용하지 않는 함수(컴파일러가 사용하지 않는)가 포함된 소스 파일을 식별하고 legacy()cubed() 함수의 항목을 포함합니다.

    ;#<FEEDBACK># ARM Linker, RVCT 3.0 [Build num]: Last Updated: Date
    ;VERSION 0.2
    ;FILE fb.o
    cubed <= USED 0
    legacy <= USED 0
    

    이것은 함수를 사용하지 않음을 나타냅니다.

  4. 다음과 같이 다른 진단 파일로 컴파일 및 링크 단계를 반복하십시오.

    armcc --asm -c --feedback fb.txt fb.c
    
    armlink --info sizes --list fbout2.txt fb.o -o fb.axf
    
  5. 두 개의 진단 파일, fbout1.txtfbout2.txt를 비교하여 이미지 구성요소의 크기를 확인합니다(예를 들어, Code, RO Data, RW DataZI Data). Code 구성요소는 더 작습니다.

    어셈블러 파일에서 fb.s, legacy()cubed() 함수는 더 이상 주 .text 영역에 없습니다. 이들 함수는 자체 ELF 섹션으로 컴파일됩니다. 따라서 armlink는 최종 이미지에서 legacy()cubed() 함수를 제거할 수 있습니다.

Note

링커 피드백을 최대한 이용하려면 컴파일 및 링크 작업 전체를 적어도 두 번 실행해야 합니다. 그러나 일반적으로 이전 빌드의 피드백을 사용하는 단일 컴파일 및 링크면 충분합니다.

Copyright © 2002-2006 ARM Limited. All rights reserved.ARM DUI 0206GK
Non-Confidential