4.6.3. 버전 관리된 심볼 만들기

기본적으로 링커는 공유 오브젝트에 대해 버전 관리된 심볼을 만들지 않습니다. 버전 관리된 심볼을 제어하는 데는 다음과 같은 세 가지 방법이 있습니다.

임베디드 심볼

특별하게 명명한 심볼을 입력 오브젝트에 추가할 수 있습니다. 그러면 링커에서 심볼 버전을 만듭니다. 이러한 심볼의 형식은 다음과 같습니다.

  • name@version - 기본 버전의 심볼이 아닌 경우

  • name@@version - 기본 버전의 심볼인 경우

이러한 심볼은 내보낼 형식으로 함수나 데이터의 주소에 정의해야 합니다. 심볼 이름은 심볼의 이름인 name과 버전 정의인 ver, 두 부분으로 나뉩니다. name은 동적 심볼 테이블에 추가되어 공유 오브젝트에 대한 인터페이스의 일부가 됩니다. ver은 아직 이러한 버전이 없는 경우 ver이라는 버전을 만들고 ver이라는 버전을 name과 연관시킵니다.

버전 심볼을 만드는 방법에 대한 자세한 내용은 다음을 설명하는 장을 참조하십시오.

  • RealView Compilation Tools 버전 3.0 컴파일러 및 라이브러리 설명서의 ARM 컴파일러 사용 방법

  • RealView Compilation Tools 버전 3.0 핵심 설명서의 ARM 및 Thumb 어셈블리 언어 작성 방법

심볼 Example 4.7에서는 foo@ver1, foo@@ver2bar@@ver1을 오브젝트 심볼 테이블에 배치합니다.

Example 4.7. 버전 관리된 심볼, 임베디드 심볼 만들기

int old_function(void) __asm__("foo@ver1");
int new_function(void) __asm__("foo@@ver2");
int other_function(void) __asm__("bar@@ver1");

링커는 이 심볼을 읽고 버전 정의 ver1ver2를 만듭니다. 심볼 foover1의 기본이 아닌 버전 및 ver2의 기본 버전과 연관됩니다. 심볼 barver1의 기본 버전과 연관됩니다.

이 방법으로 버전 간의 연관을 만들 수는 없습니다.

조정 파일

명령 행 옵션 --symver_script file에서 지정하는 스크립트 파일에 심볼 버전을 생성하도록 하는 명령을 포함할 수 있습니다. 이 옵션을 사용하면 자동으로 심볼 버전 관리가 실행됩니다.

스크립트 파일은 GNU ld 및 선 솔라리스 링커와 동일한 구문을 지원합니다.

스크립트 파일을 사용하면 버전을 이전 버전과 연관시킬 수 있습니다.

조정 파일은 임베디드 심볼 방법과 함께 제공될 수 있습니다. 이 방식을 선택한 경우, 스크립트 파일이 임베디드 심볼과 일치해야 하며 또한 BNF(Backus Naur Format) 형식을 사용해야 합니다.

version_definition ::= 

  version_name "{" symbol_association* "}" [depend_version] ";"

version_name은 버전 이름이 포함된 문자열입니다. depend_version은 이 version_name이 종속된 버전의 이름이 포함된 문자열입니다. 이 버전은 스크립트 파일에 이미 정의되어 있어야 합니다. 버전 이름은 중요하지는 않지만 읽을 수 있는 이름을 선택하도록 돕는 역할을 합니다. 예를 들면 다음과 같습니다.

symbol_association ::= 

  "local:" | "global:" | symbol_name ";"

인수 설명:

  • "local:"은 이 버전 정의에 있는 모든 후속 symbol_name이 공유 오브젝트에 대한 지역 심볼이며 버전 관리되지 않았음을 나타냅니다.

  • "global:"은 모든 후속 symbol_name이 이 버전 정의에 속한다는 것을 나타냅니다.

    각 버전 정의의 시작 부분에 암시적 "global:"이 있습니다.

  • symbol_name은 정적 심볼 테이블에 있는 전역 심볼의 이름입니다.

Example 4.8에는 임베디드 심볼의 예(Example 4.7)에 상응하는 조정 파일이, ver2ver1에 종속되도록 종속 정보가 추가되어 나와 있습니다.

Example 4.8. 버전 관리된 심볼, 조정 파일 만들기

ver1 {
    global:
        foo; bar;
    local:
        *;
    };

ver2 {
    global:
        foo;
    } ver1;
오류 및 경고

스크립트 파일을 사용하는 경우 버전 정의는 그와 연관된 심볼과 일치해야 합니다. 링커는 불일치를 감지하면 경고합니다.

Filename

명령 행 옵션 --symver_soname을 사용하여 암시적 심볼 버전 관리를 시작할 수 있습니다. 정적 바인딩을 강제로 수행하기 위해 심볼을 버전 관리해야 하지만 주어진 버전 번호에 대해서는 상관하지 않는 경우 이 옵션을 사용합니다.

심볼에 버전이 정의되지 않은 경우 링커에서는 링크되는 파일의 SONAME을 사용합니다.

이 옵션은 임베디드 심볼이나 스크립트 파일과 함께 사용할 수 없습니다.

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