3.3.4. 사용하지 않는 함수 제거

VFE(가상 함수 제거)는 C++ 코드에서 생성된 이미지의 ROM 크기를 줄이기 위해 사용하지 않는 섹션 제거를 개선한 것입니다. 이 최적화는 코드에서 사용하지 않는 가상 함수와 RTTI 개체를 제거하는 데 사용될 수 있습니다.

함수가 자체 섹션에서 컴파일되는 경우 VFE는 사용하지 않는 섹션 제거와 동의어입니다(사용하지 않는 섹션 제거 참조). 그러나 섹션에 둘 이상의 함수가 있는 경우 모든 함수가 사용되지 않는 경우에만 제거할 수 있습니다. 링커는 섹션 내에서 사용하지 않는 함수를 제거할 수 없습니다.

이 단원의 나머지에서 함수는 자체 섹션에서 컴파일된 것으로 가정됩니다.

사용하지 않는 섹션 제거는 C 코드에서 사용하지 않는 함수를 효율적으로 제거합니다. 그러나 C++ 응용 프로그램에서는 포인터 테이블이 사용하지 않는 섹션과 RTTI 개체를 참조합니다. 따라서 링커가 사용하는 제거 알고리즘은 섹션과 RTTI 개체를 신뢰성 있게 제거한다고 보장할 수 없습니다.

VFE는 ARM 컴파일러와 링커 사이의 협력으로 컴파일러가 사용하지 않는 가상 함수에 대한 추가 정보를 제공하면 링커가 이 정보를 사용합니다. 이 분석을 기준으로 링커는 사용하지 않는 섹션을 신뢰성 있게 제거할 수 있습니다. 이 협력으로 링커는 RTTI 개체를 제거할 수도 있습니다.

Note

VFE 주석이 C++ 라이브러리를 참조하지 않는 경우 어셈블러 소스 파일에서는 VFE 주석이 필요하지 않습니다. 이것은 링커가 C++ 라이브러리를 참조하지 않는 개체 파일이 하는 가상 함수 호출은 없다고 가정하기 때문입니다. 유사하게, 이전 버전의 armcc로 컴파일된 C 소스 파일은 C++ 라이브러리를 참조하지 않는 경우 VFE에 참여할 수 있습니다.

VFE는 다음 4가지 모드로 작동합니다.

On

링커가 VFE를 인식하도록 하려면 명령 행 옵션 --vfemode=on을 사용합니다. 이것은 명령 행에서 VFE 옵션을 지정하지 않는 경우 기본 모드입니다.

이 모드에서 링커는 개체 파일의 내용을 기준으로 force 또는 off 모드를 선택합니다.

  • 모든 개체 파일이 VFE 정보를 포함하거나 C++ 라이브러리를 참조하지 않는 경우 링커는 force 모드를 가정하고 제거를 계속합니다.

  • 개체 파일에 VFE 정보가 없고 C++ 라이브러리를 참조하는 경우, 예를 들어 코드가 ARM 도구의 이전 릴리스로 컴파일되었으면 링커는 off 모드를 가정하고 VFE는 자동으로 비활성화됩니다. 이 상황에서 off 모드를 선택하여 VFE를 비활성화하면 링커는 VFE 정보가 없는 개체가 사용하는 가상 함수를 제거하지 않습니다.

Off

armlink가 컴파일러가 제공하는 추가 정보를 무시하도록 하려면 명령 행 옵션 --vfemode=off를 사용합니다. 이 모드에서 최종 이미지는 VFE 인식 없이 컴파일 및 링크하여 생성된 이미지와 동일합니다.

Force

링커가 VFE를 인식하도록 하고 VFE 알고리즘이 적용되도록 강제하려면 명령 행 옵션 --vfemode=force를 사용합니다. 개체 파일 중 일부가 VFE 정보를 포함하지 않은 경우, 예를 들어 일부 개체 파일이 ARM 도구의 이전 릴리스로 컴파일되었으면, 링커는 제거를 계속하지만 가능한 오류를 알리는 경고 메시지를 표시합니다.

Force no RTTI

링커가 VFE를 인식하도록 하고 모든 RTTI 개체 제거를 강제하려면 명령 행 옵션 --vfemode= force_no_rtti를 사용합니다. 이 모드에서는 모든 가상 함수가 유지됩니다.

컴파일러가 접두사 .arm_vfe_로 시작하는 섹션에 추가 정보를 배치합니다. 이러한 섹션은 나머지 코드에 의해 참조되지 않으므로 VFE 인식이 아닌 경우 링커가 무시합니다. 따라서, 그러한 섹션은 최종 이미지의 크기를 증가시키지 않지만 컴파일러가 생성하는 개체 파일의 크기는 증가시킵니다.

컴파일러의 VFE 정보 생성을 중지하려면 컴파일러 옵션 --no_vfe를 사용하십시오. 그러나 VFE를 해제하는 방법으로는 링커 옵션 --vfemode=off를 사용하는 것이 좋습 니다.

Note

명령 행에서 VFE 옵션을 지정하지 않으면 기본 모드, 즉 --vfemode=on이 가정됩니다.

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