Search

링커와 로더

class
운영체제 심화
상태
완료
날짜

링커

링커는 하나 이상의 컴파일된 코드 즉, 오브젝트 파일들을 결합하여 실행 가능한 파일을 생성하는 역할을 합니다.
1.
심볼 결정 : 여러 오브젝트 파일들 간에 정의된 함수나 변수들의 주소를 매핑합니다. 예를 들어, 한 파일에서 정의된 함수를 다른 파일에서 호출할 경우, 해당 함수의 위치를 찾아 주소를 연결합니다.
2.
재배치 : 각 오브젝트 파일이 가정하는 주소와 실제 메모리에서 사용될 주소를 조정합니다. 이는 모든 코드와 데이터가 메모리 상에서 올바른 위치에 있도록 보장합니다.
이러한 재배치 과정 때문에 오브젝트 파일은 "재배치 가능 오브젝트 파일"이라고도 불립니다.
링커는 주로 정적 링킹과 동적 링킹 두 가지 유형이 있습니다.
정적 링킹은 실행 파일이 모든 필요한 라이브러리 코드를 포함하도록 컴파일 시 모든 링킹을 완료하는 방식입니다. 반면에 동적 링킹은 실행 시점에서 필요한 라이브러리를 메모리로 로드하여 링킹을 수행합니다.
동적 링킹은 앞서 언급한 링커에 의해 재배치되지 않습니다. 대신, 로더 과정에서 재배치가 이루어집니다. 이 방식에 대해서는 아래에서 자세히 설명하겠습니다.

로더

로더는 링커가 생성한 실행 가능한 파일을 실제로 메모리에 적재하는 역할을 합니다. 로더의 주요 기능은 다음과 같습니다:
1.
실행 파일 파싱 : 디스크에 저장된 실행 파일을 읽고 그 구조를 해석합니다.
2.
메모리 할당 : 프로그램 실행을 위해 필요한 메모리를 할당받습니다.
3.
적재 : 코드와 데이터를 메모리의 적절한 위치에 복사합니다.
4.
실행 시작 : 프로그램의 시작 지점(보통 main 함수)에서 실행을 시작합니다.

DLL 동적 링킹과 재배치 과정

1.
메모리 적재 : 로더는 실행 파일이 참조하는 DLL 파일들을 식별하고, 이 파일들을 메모리로 로드합니다.
이 과정은 로더가 수행하지만, '동적 링커'라고도 불릴 수 있습니다.
2.
주소 매핑 : DLL 파일 내부에는 함수와 변수의 위치를 나타내는 주소 정보가 포함되어 있습니다. 이 주소들은 대부분 상대적인 주소로 지정됩니다.
3.
재배치 테이블 확인 : DLL 파일은 재배치 테이블을 포함하고 있어서, 메모리에 로드될 때 실제 메모리 주소가 바뀌어야 하는 부분을 로더에게 알려줍니다. 이 테이블은 DLL이 예상한 기본 주소와 실제 메모리에서 할당받은 주소 사이의 차이를 조정하는 데 사용됩니다.
즉, DLL 파일은 정적 라이브러리와 달리 기본 코드 정보 외에도 이러한 재배치 테이블을 포함하고 있습니다.
4.
주소 조정 : 로더는 재배치 테이블의 지시에 따라 실제 메모리 주소로 각 참조를 업데이트합니다.
5.
주소 바인딩 : 모든 주소 조정이 완료되면, 로더는 프로그램에서 DLL 함수 호출 시 정확한 함수 위치를 찾을 수 있도록 함수 포인터들을 최종적으로 바인딩합니다.
6.
실행 : 모든 재배치 작업이 완료되면, 프로그램은 DLL 내의 함수를 마치 자신의 일부인 것처럼 호출하고 사용할 수 있습니다.