7.2-Static_Linking

Static Linker 는 input 으로 재할당 가능한 목적 파일들과 옵션 매개변수를 받아,
실행 가능한 목적 파일을 생성한다.

재할당 가능한 목적파일은 내부에 코드와 데이터 영역(code, data section) 이 존재하는데,
각 부분은 연속적인 바이트의 나열일 뿐이다.

명령어도 어떤 영역에 존재하는데, 다른 영역에 존재하는 전역변수를 초기화한다.
또한 초기화되지 않은 변수는 또 다른 영역에 존재한다.

실행가능한 목적 파일을 위해, linker 는 아래의 2가지 일을 한다.


  • 목적 파일은 을 정의하고, 참조(reference) 한다.
    참조는 함수, 전역변수 등 다양하다.
    Symbol Resolution 은 각 symbol의 참조를 "정확히" 1개의 정의로 대응시키기 위함이다.


  • 컴파일러와 어셈블러는 코드, 데이터 영역을 주소 0에서부터 시작한다.
    각 symbol 정의, 메모리 위치(Memory Location)를 고려하여, 각 영역을 재배치한다.
    재배치된 symbol 정의에 따라 참조 또한 그에 맞춰 변경한다.
    linker 는 어셈블러가 만들어준 명령어를 통해 재할당을 하는데,
    이 때 만들어진 명령어를 Relocation Entries 라고 한다.

목적 파일은 바이트 덩어리(Blocks of Bytes) 의 조합일 뿐이다.
이 덩어리는 코드를, 데이터를 다른 데이터 구조 등등을 가지고 있을 수 있다.
linker 는 이 덩어리들을 합치고, run-time 위치를 결정하며, 덩어리 안의 위치 또한 변경한다.

linker 는 해당 machine 에 대해 거의 이해하지 못한다.
컴파일러와 어셈블러가 이미 대부분의 필요한 작업을 했기 때문이다.