Search
moon
sun

링커와 로더

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

링커

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

로더

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

DLL 동적 링킹과 재배치 과정

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