
링커(Linker)는 여러 오브젝트 파일(.o 또는 .obj)을 결합하여 실행 가능한 하나의 프로그램을 만드는 소프트웨어 도구이다. 컴파일러가 각 소스 파일을 개별 오브젝트 파일로 변환하면, 링커는 이 오브젝트 파일들을 연결하여 프로그램이 실행될 수 있도록 필요한 주소 재배치 및 라이브러리 결합을 수행한다. 링커는 정적 링킹과 동적 링킹이라는 두 가지 주요 방식을 사용한다.
정적 링킹(Static Linking):
모든 라이브러리 코드가 실행 파일에 포함된다.
- 장점:
프로그램이 독립적이다. 배포된 실행 파일에 모든 필요한 코드가 포함되어 있어, 다른 외부 파일에 의존하지 않는다.
특정 버전의 라이브러리를 사용할 수 있다. 업데이트로 인한 비호환성 문제가 발생하지 않는다.- 단점:
실행 파일의 크기가 커진다.
메모리 사용량이 증가한다. 동일한 라이브러리가 여러 프로그램에서 각각 복사되기 때문에, 메모리가 비효율적으로 사용될 수 있다.
동적 링킹(Dynamic Linking):
프로그램이 실행될 때 필요한 라이브러리를 메모리에 로드한다.
- 장점:
실행 파일의 크기가 작아진다.
여러 프로그램이 동일한 라이브러리를 공유하여 메모리 사용이 효율적이다.
라이브러리를 업데이트하면 프로그램도 자동으로 최신 버전을 사용하게 된다.- 단점:
프로그램 실행 시 필요한 라이브러리가 시스템에 설치되어 있어야 한다.
라이브러리 버전 문제로 인해 프로그램이 제대로 동작하지 않을 수 있다.
재배치는 링커가 오브젝트 파일들을 결합할 때, 각 모듈이 사용하는 메모리 주소를 조정하는 과정이다. 프로그램의 각 부분이 서로 겹치지 않고 올바른 메모리 공간에 배치되도록 주소를 재조정한다. 이는 특히 프로그램이 여러 모듈로 구성되었거나 동적 라이브러리를 사용할 때 필수적이다.
- .dll 파일(Dynamic Link Library): 주로 윈도우 운영 체제에서 사용되는 동적 라이브러리 파일이다. 여러 프로그램이 이 파일을 공유하여 실행 시점에 필요한 기능을 제공받는다.
- .so 파일(Shared Object): 리눅스 및 유닉스 계열 운영 체제에서 사용하는 동적 라이브러리 파일이다. .dll 파일과 유사한 역할을 하며, 여러 프로그램이 이 파일을 공유하여 메모리 효율성을 높인다.
로더(Loader)는 운영 체제의 구성 요소 중 하나로, 실행 파일을 메모리에 로드하고 실행을 준비하는 역할을 한다. 로더는 파일을 메모리에 로드할 뿐만 아니라, 프로그램이 정상적으로 실행되도록 주소 재배치와 동적 라이브러리 로드를 수행한다.
로더는 다음과 같은 단계로 작동한다:
- 파일 로드: 로더는 실행 파일을 디스크에서 읽어 메모리로 로드한다.
- 재배치: 링커가 삽입한 재배치 정보를 기반으로, 메모리 내에서 실행 가능한 상태로 코드와 데이터를 재배치한다.
- 초기화: 프로그램 실행을 위해 필요한 초기화 작업을 수행한다.
- 제어 전달: CPU에 제어를 넘겨 프로그램 실행을 시작한다.
동적 라이브러리가 필요한 프로그램을 실행할 때, 로더는 다음 과정을 거친다:
- 동적 링킹: 프로그램 실행 시점에서 필요한 동적 라이브러리를 로드하고, 해당 라이브러리의 심볼을 프로그램과 연결한다.
- 의존성 해결: 라이브러리가 의존하는 다른 라이브러리들도 함께 로드한다.
- 메모리 매핑: 로드된 라이브러리를 메모리에 매핑하고, 프로그램의 해당 부분이 올바르게 실행될 수 있도록 주소를 연결한다.
이 과정에서 로더는 시스템에 이미 로드된 라이브러리를 재사용하여 메모리 효율성을 높이거나, 특정 버전의 라이브러리를 사용하는 프로그램의 요구사항을 충족시킨다.