728x90
링커의 심벌 해석 대상은 주로 전역 심벌과 외부 심벌임. 링커는 여러 개의 객체 파일을 결합하여 실행 가능한 프로그램을 생성하는 과정에서 심벌 해석을 수행함
이 과정에서 링커는 각 객체 파일에 포함된 심벌을 분석하고 올바른 메모리 주소를 할당하여 참조를 해결함
링커의 심벌 해석 대상
- 전역 심벌(Global Symbols)
- 정의된 전역 변수와 함수: 각 객체 파일에서 정의된 전역 변수와 함수는 링커에 의해 심벌 테이블에 추가되고, 프로그램 전체에서 참조될 수 있도록 메모리 주소가 할당됨
- 예시: int g_a = 1; 와 같은 전역 변수나 int func_a(int x, int y); 와 같은 함수 정의
- 외부 심벌(External Symbols)
- 다른 객체 파일에서 정의된 변수와 함수: 한 객체 파일에서 선언되었지만 정의되지 않은 변수나 함수는 외부 심벌로 간주되며, 링커가 다른 객체 파일에서 해당 심벌의 정의를 찾아 연결함
- 예시: extern int g_e; 와 같은 외부 변수 선언이나 다른 객체 파일에서 정의된 함수 참조
심벌 해석 과정
링커의 심벌 해석 과정은 다음과 같은 단계를 포함함
- 심벌 수집(Symbol Collection)
- 각 객체 파일의 심벌 테이블을 수집하고, 전역 심벌과 외부 심벌을 추출함
- 심벌 해석(Symbol Resolution)
- 전역 심벌과 외부 심벌을 매칭하여 참조를 해결함. 예를 들어, 한 객체 파일에서 extern으로 선언된 심벌을 다른 객체 파일에서 정의된 심벌과 연결함
- 정의되지 않은 외부 심벌이 발견되면 링커 오류가 발생함
- 심벌
- 에 실제 메모리 주소를 할당함. 이를 통해 각 객체 파일에서 참조된 심벌이 올바른 메모리 위치를 가리키도록 함
- 재배치(Relocation)
- 심벌 해석과 주소 할당 후, 각 객체 파일의 코드와 데이터를 재배치하여 올바른 메모리 위치로 이동함
예시 코드에서의 링커 심벌 해석 대상
int g_a = 1; // 전역 변수
extern int g_e; // 외부 변수
int func_a(int x, int y); // 함수 참조
// 함수 구현
int func_b()
{
int m = g_a + 2;
return func_a(m + g_e);
}
이 예제 코드에서 링커의 심벌 해석 대상은 다음과 같음
- 전역 변수 g_a: 객체 파일에서 정의된 전역 변수로, 링커는 이 변수를 참조하는 모든 곳에 대해 올바른 메모리 주소를 할당함
- 외부 변수 g_e: 다른 객체 파일에서 정의된 변수로, 링커는 이 변수를 참조하는 모든 곳에서 정의된 실제 심벌과 연결함
- 함수 func_a: 다른 객체 파일에서 정의된 함수로, 링커는 이 함수를 참조하는 모든 곳에서 정의된 실제 심벌과 연결함
- 함수 func_b: 객체 파일에서 정의된 함수로, 링커는 이 함수의 코드와 데이터를 올바른 메모리 위치로 재배치함
이러한 과정을 통해 링커는 프로그램을 실행 가능한 상태로 만들며, 모든 심벌 참조가 올바르게 해결되도록 보장함
728x90
'Computer Science' 카테고리의 다른 글
운영체제의 역할과 필요성 (0) | 2024.08.08 |
---|---|
정적 라이브러리와 동적 라이브러리 (3) | 2024.07.24 |
지역 심벌과 전역 심벌 (0) | 2024.07.24 |
링커란? (0) | 2024.07.17 |
컴파일 언어와 인터프리터 언어 비교 (0) | 2024.07.10 |