링커(Linker)와 로더(Loader)
- 프로그램은 디스크에 이진 실행 파일(ex : a.out, prog.exe)로 존재해야 함
- 소스 파일은 임의의 물리 메모리 위치에 적재되도록 설계된 오브젝트 파일로 컴파일됨
- 이러한 형식의 파일을
재배치 가능 오브젝트 파일
이라고 불림
- 이러한 형식의 파일을
- 소스 파일은 임의의 물리 메모리 위치에 적재되도록 설계된 오브젝트 파일로 컴파일됨
- 프로그램을 CPU에서 실행하는 절차를 설명할 예정
- CPU에서 실행하려면, 프로그램을 컴파일하고 메모리로 가져와 프로세스 형태로 배치해야 함
링커
: 재배치 가능 오브젝트 파일을 하나의 이진 실행 파일로 결합- 링킹 단계에서 다른 오브젝트 파일 또는 라이브러리 포함될 수 있음
- 표준 C 라이브러리, 수학 라이브러리 등
- 표준 C 라이브러리, 수학 라이브러리 등
- 링킹 단계에서 다른 오브젝트 파일 또는 라이브러리 포함될 수 있음
로더
: 이진 실행 파일을 메모리에 적재- 프로그램 부분에 최종 주소를 할당, 프로그램 코드와 데이터를 해당 주소와 일치하도록 조정
- 프로그램이 실행될 때, 코드가 라이브러리 함수를 호출하고 변수에 접근할 수 있도록 함
- 실제 대부분의 시스템은 프로그램을 적재할 때 라이브러리를 동적으로 링크
- Windows는 동적 링킹 라이브러리(DLL)를 지원
로더가 호출되는 과정(위 그림)
- 명령어 라인에 실행 파일의 이름 입력(./main)
- 셸은
fork()
시스템 콜을 사용하여 프로그램을 실행하기 위한 새 프로세스 생성 - 이후,
exec()
시스템 콜로 로더를 호출하고exec()
에 실행 파일 이름 전달 - 로더는 새로 생성된 프로세스의 주소 공간을 사용하여 지정된 프로그램을 메모리에 적재
동적 링킹 라이브러리(DLL)
- 장점
- 실행 파일에서 사용되지 않는 라이브러리를 링크하고 로드하지 않아도 된다.
- 대신 라이브러리는 조건부로 링크되며 프로그램 실행 시간에 필요한 경우 적재
- 프로그램이 적재될 때 동적으로 링크되고 적재될 수 있도록 재배치 정보를 삽입
- 실행 파일에서 사용되지 않는 라이브러리를 링크하고 로드하지 않아도 된다.
ELF(Executable and Linkable Format)
- UNIX 및 Linux 시스템에서 가지는 오브젝트 및 실행 파일의 표준 형식
- 오브젝트 파일 및 실행 파일은 일반적으로 표준화된 형식을 가진다.
- 표준형식은 컴파일된 기계 코드 및 프로그램에서 참조되는 메타데이터를 가진 기호 테이블을 포함
- 재배치 가능 파일과 실행 가능 파일은 별도의 ELF 형식이 사용
- 실행 가능 파일의 ELF 파일의 정보 중 하나는 프로그램의 시작점
- 프로그램을 실행할 때 실행할 첫 번째 명령어의 주소거 저장되어 있음
- 실행 가능 파일의 ELF 파일의 정보 중 하나는 프로그램의 시작점
- Windows 시스템은 PE(Portable Executable) 형식 사용
- macOS는 Mach-O 형식 사용