3.3.8. 비니어 생성

비니어는 링커가 생성하고 프로그램으로 삽입되는 작은 코드 섹션입니다. armlink는 분기에 현재 상태의 분기 범위를 벗어나는 대상이 포함될 경우 비니어를 생성해야 합니다.

BL 명령어의 범위는 ARM의 경우 32MB이고, Thumb-2의 경우 16MB, Thumb의 경우 4MB입니다. 따라서 비니어는 명령어의 중간 타겟이 된 다음 PC를 대상 주소로 설정함으로써 분기 범위를 확장할 수 있습니다. ARM 및 Thumb이 혼합되면 비니어가 프로세서 상태도 변경합니다.

armlink는 다음과 같은 비니어 유형을 지원합니다.

armlink는 각 비니어에 대해 Veneer$$Code라고 하는 하나의 입력 섹션을 생성합니다. 비니어는 요구 사항을 충족시킬 수 있는 다른 기존 비니어가 없는 경우에만 생성됩니다. 두 개 입력 섹션에 동일한 대상에 대한 긴 분기가 포함되는 경우에는 한 개 비니어만 생성됩니다. 비니어는 두 섹션 모두가 도달할 수 있는 경우에만 이런 식으로 공유됩니다.

ARMv4T를 사용 중인 경우 armlink는 분기에 ARM과 Thumb 사이의 상태 변화가 포함될 때 비니어를 생성합니다. ARMv5 이상에서는 BLX 명령어가 사용됩니다.

비니어 공유

명령 행 옵션 --no_veneershare를 사용하여 비니어가 공유되지 않도록 지정할 수 있습니다. 이로써 생성된 비니어 섹션의 소유권이 비니어를 생성한 개체에 할당되므로 스캐터 로딩 설명 파일의 특정 개체에서 비니어를 선택할 수 있습니다. 예를 들면 다음과 같습니다.

LR 0x8000
{
    ER_ROOT +0
    {
          object1.o(Veneer$$Code)
    }
}

비니어를 공유하면 소유 개체를 할당할 수 없습니다. 따라서 --no_veneershare를 사용하면 보다 일관성 있는 이미지 레이아웃이 제공됩니다. 대신 코드 크기는 현저하게 증가합니다.

비니어 변형

비니어는 사용자가 필요로 하는 분기 범위에 따라 다른 변형을 갖습니다.

인라인 비니어

이 변형에서:

  • 비니어는 타겟 섹션이 범위 안에 있기 직전에 삽입되어야 합니다.

  • ARM-Thumb 인터워킹 비니어는 범위가 256바이트이므로 함수 코드가 비니어 코드 바로 뒤의 첫 번째 256바이트에 나타나야 합니다.

  • Thumb-ARM 인터워킹 비니어는 범위가 0바이트이므로 함수 코드가 비니어 코드 바로 뒤에 나타나야 합니다.

  • 인라인 비니어는 항상 위치 독립적입니다.

이러한 제한 사항 때문에 인라인 비니어는 Veneer$$Code를 사용하여 실행 영역 밖으로 이동할 수 없습니다. 명령 행 옵션 --no_inlineveneer를 사용하면 인라인 비니어가 생성되지 않도록 할 수 있습니다.

짧은 분기 비니어

이 변형에서:

  • ARM-Thumb 짧은 분기 비니어는 범위가 4MB입니다.

  • 짧은 분기 비니어는 항상 위치 독립적입니다.

긴 분기 비니어

이 변형에서:

  • ARM-Thumb과 Thumb-ARM 인터워킹 비니어는 모두 범위가 232바이트입니다.

  • armlink는 긴 분기 기능을 상태 변경 기능과 결합하므로 모든 긴 분기 비니어는 인터워킹 비니어이기도 합니다.

  • 긴 분기 비니어는 절대적이거나 위치 독립적입니다.

비니어를 사용 중인 경우 다음을 유의하십시오.

  • 모든 비니어는 결과적인 비니어 입력 섹션이 다른 입력 섹션 범위 내에 있을 수 없기 때문에 하나의 입력 섹션으로 모일 수 없습니다. 섹션이 주소 지정 범위 내에 없으면 긴 분기는 가능하지 않습니다.

  • armlink는 비니어의 위치 독립적 변형을 자동으로 생성합니다. 그러나 이러한 비니어는 위치 독립적이지 않은 변형보다 크기 때문에 armlink는 필요한 경우, 즉 소스와 대상 실행 영역이 둘 다 위치 독립적이고 엄격하게 관련된 경우에만 이 작업을 수행합니다.

비니어는 코드 크기를 최적화하기 위해 생성됩니다. 따라서 armlink는 선호 순으로 변형을 선택합니다.

  1. 인라인 비니어

  2. 짧은 분기 비니어

  3. 긴 비니어

Copyright © 2002-2007 ARM Limited. All rights reserved.ARM DUI 0206HK
Non-Confidential