Duplicate

링크와 로더 Linkers and Loaders

Created
2021/01/06
Tags
structure
발행
프로그램은 이진 파일 형태로 디스크에 저장된다.
이 이진 파일을 실행하기 위해 디스크 → 메모리로 가져와야 한다.
메모리에 도착한 파일은 프로세스 형태로 재배치 되어야 한다.
프로그램 → 컴파일 → 메모리 배치 → CPU 에서 실행 가능한 상태

프로그램을 compile 하고, 메모리에 배치하여 사용 가능한 CPU 코어에서 실행할 수 있게 되는 절차

source file 을 컴파일 하면 재배치 가능한 object 파일이 된다.
Screen_Shot_2020-07-08_at_16.35.10.png

Linker 의 역할

작성된 코드 이외에 외부 lib 파일 등을 하나의 실행 가능한 binary 실행 파일로 결합한다

Loader 의 역할

실행 가능한 파일을 memory 에 적재 시키고 CPU 코어에서 실행 가능한 상태로 만든다.
(파일 이름을 명령어에 입력만 하면 된다)
1.
shell 에 파일 이름을 명령어로 입력한다.
2.
shell 이 fork() system call 을 호출한다.
3.
운영체제는 프로그램을 실행하기 위한 새로운 process 를 생성한다.
4.
shell 이 exec() system call 로 loader 를 호출한다
5.
exec() 에 실행 파일 이름을 전달한다.
6.
Loader 는 새로 생성된 process 주소 공간을 사용해 지정된 프로그램을 memory 에 적재한다.
GUI 에서 아이콘을 double click 했을 때도 이와 동일한 매커니즘 이다.

주의

지금까지 이 책에서 외부 라이브러리가 Linker 에서 연결 된다는 가정을 하고 설명하였으나 실제로 시스템 대부분은 프로그램이 적재(load) 될 때 외부 라이브러리를 동적으로 링크한다.
장점
사용되지 않을 수 있는 라이브러리를 링크하고 로드하지 않아도 된다.
링크되지 않은 라이브러리는 runtime 에 필요한 경우 적재된다.
여러 프로그램은 동적으로 링크되고 적재될 수 있어 메모리 사용이 효율적으로 된다.
위 그림에서 Math 라이브러리는 link 시점이 아닌 loader 시점에서 동적으로 링크된다. 이러면 여러 프로세스가 동적으로 링크된 라이브러리를 공유할 수 있어, 메모리 사용이 크게 절약된다고 한다.

ELF (Executable and Linkable Format) 형식

Linux, UNIX 등의 object 파일 및 실행 파일은 표준화된 형식을 갖는다.
compile 된 기계 코드 및 프로그램에 참조되는 함수 나 변수에 대한 meta 데이터를 포함하는 기호 테이블이 포함되어 있다.
ELF 파일의 포함 된 정보중 하나가 시작점 이다. 프로그램 시작의 첫 명령어 주소가 저장되어 있다.
windows 는 PE(Portable Executable)
macOS 는 Mach-O
Made with 💕 and Oopy