보통, 프로그램은 바이너리 실행 가능한 파일로 디스크에 존재한다. -예를 들어, a.out 또는 prog.exe -
CPU가 동작하기 위해서, 프로그램은 반드시 메모리에서 가져오고 프로세스 맥락에 위치해야한다.
이 섹션에서, 우리는 이 절차 단계를 설명한다, 프로그램 컴파일부터 메모리 배치까지, 사용 가능한 CPU 코어에서 실행할 수 있는 자격을 갖추는
단계는 그림 2.11에서 강조된다.

소스 파일은 어떤 물리적인 메모리 위치에서도 로드되기 위해 설계된 오브젝트 파일에서 컴파일된다. 재배치가능한 오브젝트 파일로 알고있는 포맷으로.
다음, linker는 결합한다 재배치가능한 오브젝트 파일을 싱글 바이너리 실행가능한 파일로.
링킹 단계에서, 표준 C또는 math 라이브러리 (플래그 -lm으로 지정된)같은 다른 오브젝트 파일이나 라이브러리는 포함될 수 있다.
loader는 메모리의 바이너리 실행가능한 파일을 로드하기위해 사용된다, CPU코어에서 실행할 자격이있는
링킹과 로딩과 관련된 활동은 재배치된다, 프로그램의 부분에 최종 주소를 할당하고, 프로그램의 코드와 데이터를 해당 주소에 맞게 조정한다, 예를 들어서, 코드는 코드가 실행될 때 라이브러리 함수를 호출하고 변수에 접근할 수 있다.
그림 2.11, 로더를 실행하려면, 명령어 줄에 실행가능한 파일 이름을 입력하는 것이 필요하다.
프로그램 이름이 UNIX 시스템의 명령어 줄에 입력될 때, - 예를 들어서, ./main - 셸은 먼저 프로그램을 실행하기 위한 새 프로세스를 생성한다, fork() 시스템 콜을 사용하여.
셸은 exec() 시스템 콜로 로더를 호출하고, exec()에 실행가능한 파일 이름을 전달한다.
로더는 새로 생성된 프로세스의 주소 공간을 사용하여 특정 프로그램을 메모리에 로드한다. (GUI 인터페이스가 사용될 때, 실행 가능한 파일과 관련된 아이콘을 더블 클릭하면 유사한 메커니즘을 사용하는 로더가 호출된다.)
따라서 프로세스는 모든 라이브러리가 실행가능한 파일에 연결되고 메모리에 로드된다고 가정한다.
실제로, 대부분의 시스템은 허용한다. 프로그램이 로드될 때 라이브러리를 동적으로 연결할 수 있도록
예를 들어 윈도우는 dynamicalyy link libraries(DLLs)를 지원한다.
*DDL: 여러 프로그램에서 동시에 사용할 수 있는 코드와 데이터를 포함하는 동적 라이브러리, 각 실행 파일에서 해당 라이브러리의 기능을 사용 시에만 라이브러리 파일을 참조(혹은 다운)하여 기능 호출
이 접근의 장점은 실행가능한 파일에서 사용되지 않을 수 있는 라이브러리를 연결하고 로딩하는 것을 피한다는 것이다.
대신, 라이브러리는 조건부로 연결되며 로드된다. 만약 프로그램 실행 시간 동안 필요하면
예를 들어, 그림 2.11에서, 수학 라이브러리는 main 실행파일에 연결되지 않았다.
오히려, 링커가 재배치 정보를 삽입한다. 프로그램이 로드될 때 동적으로 연결되고 로드될 수 있도록.
우리는 Chapter 9에서 볼 것이다. 이것은 멀티프로세스가 동적 연결 라이브러리를 공유할 수 있어서, 결과적으로 메모리 사용을 크게 절약할 수 있다.
오브젝트 파일과 실행가능한 파일은 일반적으로 표준 형식을 가진다. 기계어 컴파일과 프로그램에서 참조하는 함수와 변수의 메타데이터를 포함하는 심볼 테이블을 포함한다.
UNIX와 Linux 시스템에서, 이 표준 형식은 ELF(Executable and Linkable Format)로 알고있다.
재배치 가능한 파일과 실행 가능한 파일에는 별도의 ELF 형식이 있다.
실행 가능한 파일에 대한 ELF 파일의 하나의 정보는 프로그램의 진입 지점으로, 프로그램이 실행될 때 실행되는 첫 번째 명령어 주소를 포함한다.
윈도우 시스템은 Prtable Executable 형식, macOS는 Mach-O 형식을 사용한다.
오브젝트 파일(Object File)
심볼(Symbol)
링커는 오브젝트 파일에 있는 데이터의 주소나 코드, 심볼들을 참조하고, 불완전한 데이터, 코드와 심볼들을 묶어 연결하고, 여러 소스파일 간에 심볼들을 공유하여 기계어로 된 실행 파일인 실행 가능한 오브젝트 파일 생성
재배치 가능한 오브젝트 파일(Relocatable Object File)
실행 가능한 오브젝트 파일(Executable Object File)