Notice
Recent Posts
Recent Comments
05-17 21:28
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Byeol Lo

2.5 Linkers and Loaders 본문

OS/OS Design

2.5 Linkers and Loaders

알 수 없는 사용자 2024. 4. 8. 14:47

 주로 거의 모든 프로그램들은 디스크 상에서 이진 실행 파일로 존재한다. CPU에 실행되기 위해, 프로그램은 메모리로 가져와야 하고, 프로세스의 컨텍스트 안에 배치되어야 한다.

 소스 파일은 어떤 물리적 메모리에도 로드 될 수 있도록 설계된 객체 파일로 컴파일 된다. 이 형식은 relocatable object file이라고 불리며, 그 다음에 Linker가 이러한 relocatable object file을 single binary executable file로 결합한다. 이 과정을 Linking 과정이라고 하는데, 이 단계 동안에 표준 C 또는 수학 라이브러리(-lm 플래그로 지정)와 같은 다른 객체 파일이나 라이브러리도 포함될 수 있다.

 Loaderbinary executable file을 메모리에 로드하는 데 사용되고, 이때 CPU 코어에서 해당 파일을 실행 할 수 있게 된다. linking 그리고 loading 과 관련된 활동 중에 하나는 relocation으로, 프로그램 부분에 최종 주소를 할당하고 코드와 데이터를 이 주소와 일치하도록 만든다. 즉, 링킹 단계에서 개발자가 작성한 여러 소스 코드 파일과 외부 라이브러리들이 컴파일된 후에, 하나의 실행 가능한 파일로 결합이 되는데, 이 과정에서 모든 코드 조각과 데이터 조각들이 하나로 합쳐지며, 이들 간의 참조가 가능해지게 만들고, 로딩 단계에서 실행 파일이 실제로 메모리에 올라가는 단계이며, 이때 운영 체제의 로더가 실행 파일을 메모리로 가져오게 된다.

 이 중간 과정에 재배치(Relocation)가 있고, 실행 파일이 메모리에 로드될 때, 프로그램 내의 코드와 데이터가 실제 메모리 주소에 맞게 조정되는 과정이 되겠다. 프로그램이 로드될 때, 이 임시 주소들이 실제 메모리 상의 주소로 변경되어야 하며, 코드와 데이터의 주소를 실제 메모리 상의 위치에 맞게 조정하는 것이 재배치라고 말할 수 있다.

 로더를 실행하기 위해 필요한 모든 것이 명령 줄에 실행 파일의 이름을 입력하는 것이다. UNIX 시스템에서 명령 줄에 프로그램 이름이 입력될 때, 셸은 먼저 프로그램을 실행하기 위해 새로운 프로세스를 생성하는 fork() 시스템 호출을 사용한다. 그 다음에 exec()을 사용하여 로더를 호출하고 exec()에 실행 파일의 이름을 전달한다. 로더는 그 다음 지정된 프로그램을 새로 생성된 프로세스의 주소 공간을 사용하여 메모리로 로드한다(GUI 인터페이스를 사용할 때, 실행 파일과 관련된 아이콘을 더블 클릭하는 것은 비슷한 메커니즘을 사용하여 로더를 호출).

 이 과정들은 모든 라이브러리가 실행 파일에 연결되어 메모리에 로드된다는 가정이 깔려 있다. 실제로 대부분의 시스템은 프로그램이 로드 될 때 동적으로 라이브러리를 연결할 수 있도록 한다. 예를 들어서 윈도우는 동적 연결 라이브러리(DLLs)를 지원하고, 이 접근 방식의 이점은 사용되지 않을 수 있는 라이브러리를 실행 파일에 연결하고 로드하는 것을 피함으로써 발생한다. 대신 라이브러리는 조건부로 연결되며 프로그램 실행 시간 동안 필요한 경우에 로드 된다. 그 예로 math 라이브러리는 main에 직접 연결되지는 않지만, 링커는 프로그램이 로드될 때 동적으로 연결되고 로드될 수 있도록 재배치 정보를 삽입하게 되어 라이브러리를 사용할 수 있게 된다.

 객체 파일과 실행 파일은 일반적으로 컴파일 된 기계 코드와 프로그램에서 참조된 함수와 변수에 대한 메타데이터를 포함하는 심볼 테이블을 포함하는 표준 형식을 가진다. UNIX와 Linux 시스템의 경우, 이 표준 형식은 ELF(Exectable and Linkable Format)으로 불리고 있다. 재배치 가능 파일과 실행 파일에는 별도의 ELF 형식이 있으며, 실행 파일용 ELF 파일의 정보 중에 하나는 프로그램의 진입점으로, 프로그램이 실행될 때 처음으로 실행되는 명령어의 주소를 포함한다. 윈도우 시스템은 포터블 실행(PE, Portable Executable), 맥은 Mach-O 형식을 사용한다.

  • 모든 프로그램들은 디스크 상에서 이진 파일로 존재(.exe, .out, ...)
  • 프로그램을 메모리로 가져와야 실행 가능
  • 프로그램을 프로세스의 컨텍스트 안에 배치해야 함(프로세스 실행에 필요한 모든 정보와 상태가 갖춰진 상태, 환경을 말함)
  • Compiler 는 소스 파일을 relocatable object file 로 변환
  • Linker 는 relocatable object file을 single binary executable file로 결합
  • Loader 는 binary executable file을 메모리에 로드
  • Relocation은 Linking과 Loading 의 사이에 일어나는 과정으로 프로그램 내의 코드와 데이터를 실제 메모리 주소에 맞게 조정되는 과정을 말한다
  • 윈도우는 동적으로 라이브러리를 연결 할 수 있도록 동적 연결 라이브러리(DLLs)를 지원한다.
  • 객체 파일과 실행 파일은 컴파일된 기계 코드와 프로그램에서 사용되는 함수 및 변수에 대한 정보를 담고 있는 심볼 테이블 등의 표준 형식을 가짐 즉, 메타 데이터를 가짐
  • 윈도우의 표준 형식은 PE, UNIX와 Linux의 경우 ELF로 불림

 동적 라이브러리의 동적은 라이브러리가 프로그램 실행 중에 로드되고 연결되기 때문이다. 즉 로드 되기 전에 라이브러리가 연결되기 때문에 정적 라이브러리와는 대비된다.

'OS > OS Design' 카테고리의 다른 글

2.7 Operating-System Design and Implementation  (0) 2024.04.09
2.6 Why Applications are Operating-System Specific  (0) 2024.04.09
2.4 System Services  (0) 2024.04.08
2.3 System Calls  (1) 2024.04.08
2.2 User and Operating-System Interface  (0) 2024.04.07
Comments