이번 절에서는 프로그램 컴파일 ⇒ 메모리에 배치 ⇒ 사용가능한 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 |