OS Concepts 10th

[OS] 2-5. 링커와 로더(Linker and Loader)

patrick-star 2023. 9. 2. 14:58
728x90

이번 절에서는 프로그램 컴파일 ⇒ 메모리에 배치 ⇒ 사용가능한 CPU 코어에 실행할 수 있는 과정을 살펴보려한다.

  • 그림

1) 컴파일러를 통해 소스파일을 object 파일로 컴파일한다. 이렇게 함으로써 물리 메모리에 위치에 적재될 수 있다.
2) 링커(linker)를 통해 변환한 object 파일과 다른 object 파일을 결합해서 하나의 이진 실행파일로 만들어낸다. 여기서 결합되는 다른 object 파일에는 라이브러리도 포함될 수 있다.
3) 로더(loader)를 통해 결합해서 만든 실행파일을 메모리에 적재하고 CPU 코어에서 실행할 수 있도록 한다.

링커로더와 연관된 동작들을 재배치라고 하고
이는 프로그램 부분에 최종 주소를 할당하고 코드와 데이터를 해당 주소와 일치하도록 조정한다.
이렇게 함으로써 프로그램이 실행될 때 코드가 라이브러리 함수를 호출하고 변수에 접근할 수 있게 된다.

지금까지 설명한 과정에서는 모든 라이브러리실행 파일에 링크되어 메모리에 적재되어 있다고 가정한다.
실제로 시스템 대부분에서는 프로그램이 적재(load)될 때 라이브러리를 동적으로 링크할 수 있게 한다.

동적으로 링크한다는 것은 실행파일에서 사용하지 않는 라이브러리를 링크 및 로드하지 않아도 된다는 뜻이다. 필요할 때 마다 원하는 라이브러리가 적재된다.

예를 들어, 위 그림에서는 math 라이브러리가 실행 파일 main에 링크되어 있지 않다.
대신에 링커는 프로그램이 적재될 때 동적으로 링크되고 이후에 적재될 수 있도록 재배치 정보를 삽입한다.

object 파일 및 실행 파일은 일반적으로 표준화된 형식을 가진다.
이 표준 형식은 컴파일된 기계 코드 및 프로그램에서 참조되는 함수 및 변수에 대한 메타 데이터를 포함하는 기호 테이블을 포함한다.

  • Unix, Linux의 경우 표준형식을 ELF(Executable and Linkable Format)이라 함
  • Windows는 PE(Portable Executable)
  • macOS는 Mach-O

'OS Concepts 10th' 카테고리의 다른 글

[OS] Chapter 3. Process  (0) 2023.09.03
[OS] 2-8. OS 구조  (0) 2023.09.02
[OS] 2-3. 시스템 콜  (0) 2023.08.21
[OS] 2-2. User and OS Interface  (0) 2023.08.16
[OS] 2-1. Operating-System Services  (0) 2023.08.16