2.1.4. --apcs=qualifer...qualifier

이 옵션은 코드 생성 시 인터워킹 및 위치 독립을 제어합니다.

--apcs 명령 행 옵션에 한정자를 지정하여 컴파일러에서 사용되는 AAPCS(ARM 아키텍처용 프로시저 호출 표준)의 변형을 정의할 수 있습니다.

구문

--apcs=qualifer...qualifier

여기서 qualifier...qualifier는 한정자 목록을 나타내며 다음 조건을 만족해야 합니다.

  • 적어도 하나의 한정자가 있어야 함

  • 목록의 각 한정자를 구분하기 위해 공백을 사용해서는 안 됨

qualifier의 각 인스턴스는 다음 중 하나여야 합니다.

/[no]interwork

ARM/Thumb™ 인터워킹을 지원하거나 지원하지 않는 코드를 생성합니다. 기본값은 /nointerwork입니다.

/[no]ropi

ROPI(읽기 전용 위치 독립적) 코드 생성을 설정 또는 해제합니다. 기본값은 /noropi입니다.

/[no]pic/[no]ropi의 별칭입니다.

/[no]rwpi

RWPI(읽기/쓰기 위치 독립적) 코드 생성을 설정 또는 해제합니다. 기본값은 /norwpi입니다.

/[no]pid/[no]rwpi의 별칭입니다.

/[no]fpic

상대 주소 참조가 프로그램이 로드된 위치와는 독립적인 읽기 전용 위치 독립적 코드의 생성을 설정 또는 해제합니다.

Note

또한 여러 개의 한정자를 지정할 수 있습니다. 예를 들어 --apcs=/nointerwork/noropi/norwpi--apcs=/nointerwork --apcs=noropi/norwpi와 동일합니다.

기본값

--apcs 옵션을 지정하지 않으면 컴파일러에서 --apcs=/nointerwork/noropi/norwpi로 간주됩니다.

사용법

/[no]interwork

기본적으로 생성되는 코드는 다음과 같습니다.

  • 아키텍처 ARMv5T 이상에 해당하는 --cpu 옵션을 지정하지 않는 한 인터워킹을 지원하지 않는 /nointerwork코드가 생성됩니다.

  • ARMv5T 이상의 경우 인터워킹을 지원하는 /interwork 코드가 생성됩니다. ARMv5T 이상에서는 직접 인터워킹을 지원하기 때문입니다.

/[no]ropi

/ropi 한정자를 선택하여 ROPI 코드를 생성할 경우 컴파일러에서 다음을 수행합니다.

  • 읽기 전용 코드 및 데이터 PC 상대 주소 지정

  • 읽기 전용 출력 섹션에 PI(위치 독립적) 특성 설정

Note

C++를 컴파일할 때는 --apcs=/ropi가 지원되지 않습니다.

/[no]rwpi

/rwpi 한정자를 선택하여 RWPI 코드를 생성할 경우 컴파일러에서 다음을 수행합니다.

  • 정적 기본 레지스터 sb의 오프셋을 사용하여 쓰기가 가능한 데이터의 주소 지정. 이것은 다음을 의미합니다.

    • 런타임에 RW 데이터 영역의 기본 주소를 고정할 수 있습니다.

    • 데이터에 여러 인스턴스가 있을 수 있습니다.

    • 데이터는 위치 독립적일 수 있지만 반드시 그래야 하는 것은 아님

  • 읽기/쓰기 출력 섹션에 PI 특성 설정

Note

--lower_rwpi 옵션이 기본값이므로 RWPI가 아닌 코드는 자동으로 동등한 RWPI 코드로 변환됩니다. C++ 생성자 메커니즘에 따라 C에 대해서도 런타임에 이 정적 초기화가 수행됩니다.

/[no]fpic

이 옵션을 선택하면 컴파일러에서 다음을 수행합니다.

  • PC 상대 주소 지정을 사용하여 모든 정적 데이터에 액세스

  • 링커에서 만든 GOT(전역 오프셋 테이블) 엔트리를 사용하여 가져오거나 내보낸 모든 읽기/쓰기 데이터에 액세스

  • PC에 대해 상대적인 모든 읽기 전용 데이터에 액세스

코드에서 공유 개체를 사용하는 경우에는 /fpic를 사용하여 코드를 컴파일해야 합니다. 상대 주소 지정이 코드에서 System V 공유 라이브러리를 사용하는 경우에만 구현되기 때문입니다.

정적 이미지 또는 정적 라이브러리를 빌드하는 경우에는 /fpic를 사용하여 컴파일할 필요가 없습니다.

C++를 컴파일할 때에는 /fpic를 사용할 수 있습니다. 이 경우 가상 테이블 함수 및 typeinfo가 읽기/쓰기 영역에 배치되어 PC 위치에 대해 상대적인 위치에서 액세스할 수 있습니다.

제한

/ropi, /rwpi 또는 /fpic로 코드를 컴파일하는 경우 제한이 있습니다.

/ropi

/ropi로 컴파일할 때의 주요 제한은 다음과 같습니다.

  • C++를 컴파일할 때 --apcs=/ropi의 사용이 지원되지 않습니다.

  • 일부 올바른 C 구문은 --apcs=/ropi에 대해 컴파일할 때 작동하지 않습니다. 예를 들면 다음과 같습니다.

    extern const int ci; // ro
    const int *p2 = &ci; // this static initialization
                         // does not work with --apcs=/ropi
    

    이러한 정적 초기화를 사용할 수 있도록 하려면 --lower_ropi 옵션을 사용하여 코드를 컴파일합니다. 예를 들면 다음과 같습니다.

    armcc --apcs=/ropi --lower_ropi
    
/rwpi

/rwpi로 컴파일할 때의 주요 제한은 다음과 같습니다.

  • 일부 올바른 C 구문은 --apcs=/rwpi에 대해 컴파일할 때 작동하지 않습니다. 예를 들면 다음과 같습니다.

    int i;               // rw
    int *p1 = &i;        // this static initialization
                         // does not work with --apcs=/rwpi
                         // --no_lower_rwpi
    

    이러한 정적 초기화를 사용할 수 있도록 하려면 --lower_rwpi 옵션을 사용하여 코드를 컴파일합니다. 예를 들면 다음과 같습니다.

    armcc --apcs=/rwpi
    

    Note

    이것이 기본값이므로 --lower_rwpi를 지정하지 않아도 됩니다.

/fpic

/fpic 로 컴파일할 때의 주요 제한은 다음과 같습니다.

  • --apcs=/fpic를 사용하면 컴파일러에서 __declspec(dllexport)가 표시된 함수와 데이터만 내보냅니다.

  • 동일한 명령 행에서 --apcs=/fpic--no_hide_all을 사용하면 컴파일러에서 __declspec(dll*)를 무시하고 모든 extern 변수와 함수를 내보냅니다. 컴파일러에서는 내보낸 함수에 대해 자동 인라인을 사용하지 않습니다.

  • GNU 모드에서 --apcs=/fpic를 사용하면 --no_hide_all도 사용해야 합니다.

추가 참고

Copyright © 2007 ARM Limited. All rights reserved.ARM DUI 0348AK
Non-Confidential