심볼과 심볼 테이블

mydailylogs
|2022. 12. 2. 19:03

각 재배치 가능 목적 모듈 m은 m에 의해서 정의되고 참조되는 심볼들에 대한 정보를 포함하는 심볼 테이블을 가지고 있다. 링커의 문맥 내에서 세 가지 서로 다른 종류의 심볼이 존재한다.

  • 모듈 m에 의해 정의되고 다른 모듈에 의해서 참조될 수 있는 전역 심볼. 전역 링커 심볼은 non-static C 함수와 C의 static 타입 선언 없이 정의된 non-static 전역변수들에 대응된다.
  • 모듈 m에 의해 참조되지만 다른 모듈에 의해 정의된 전역 심볼. 이러한 심볼은 external이라고 부르며, 다른 모듈 내에서 정의된 변수들과 C함수들에 대응된다.
  • 모듈 m에 의해서 배타적으로 참조되고 정의된 지역 심볼. 일부 지역 링커 심볼들은 static 타입으로 정의된 C함수와 전역변수들에 대응된다. 이 심볼들은 모듈 내 어디에서나 접근이 가능하지만, 다른 모듈에 의해서는 참조가 불가능하다. 어떤 목적 파일 내의 섹션들과 모듈 m에 대응하는 소스 파일의 이름은 또한 지역 심볼이 많다.

지역 링커 심볼들이 지역 프로그램 변수와는 같지 않다는 점을 인식하는 것이 중요하다. 

.symtab에 있는 심볼 테이블은 local non-static 프로그램 변수들에 대응되는 심볼을 전혀 포함하지 않는다. 이들은 런타임 시에 스택에 의해 관리될 뿐 링킹 단계와는 어떠한 관련도 없다.

대신 C의 static 타입 선언으로 정의된 지역 프로시저 변수들은 스택에서 관리되지 않고 대신 컴파일러가 .data나 .bss에서 각 정의에 대해 공간을 할당한다. 이 경우 심볼 테이블 내의 지역 링커 심볼로서 각 지역 프로시져 변수들은 유일한 이름을 갖게 된다. 

예를 들어 다음의 코드에서 같은 모듈의 두개의 함수가 정적 지역변수 x를 정의한다고 하면

int f()
{
    static int x = 0;
    return x;
}

int g()
{
    static int x = 1;
    return x;
}

해당 경우 컴파일러는 .data에 두 개의 정수를 위한 공간을 할당하고, 두 개의 유일한 지역 링커 심볼을 어셈블리어에 보낸다. 각각의 지역 링커 심볼로서  x.1함수 f 내에서만 사용하고 x.2함수 g 내에서만 사용한다.