1. 링커(Linker) 및 로더 (Loader)
ㅇ 컴파일러,어셈블러에 의해 기계어로 번역된 오브젝트 파일이,
- 바로 실행 파일이 되는 것이 아니고,
- 링커 및 로더를 거쳐,
- 비로소 실행 가능 파일 생성 및 메모리에 적재되어 실행 됨
ㅇ 주요 역할
- 주 기억장치의 할당(확보)
. 프로그램의 시작 위치 결정 등
- 연결 (Linking)
. `시스템 API`,`미리 컴파일된 라이브러리`들을 사용자 프로그램에 연결시키는 것
- 재배치 (Relocation)
- 프로그램 연결 적재 (Loading)
ㅇ 주요 단계
- 소스 프로그램
- (컴파일러)
. 오브젝트 파일 생성
- (링커) <= 필요시, 연관된 다른 오브젝트 파일들이 추가됨
. 실행 파일 생성
- (로더)
. 메인 메모리 적재 <= 필요시, 동적 링크 라이브러리들이 추가됨
※ [참고] ☞ 빌드 과정 참조
2. 링커 (linker)
ㅇ 링크/링킹 (Linking) 이란?
- 오브젝트 파일들을 최종적으로 사용 가능하게 변환하는 것
. 한편, 링크 시에, 비록 덩치큰 라이브러리를 지정하지만,
. 이때, 자동으로 필요한 오브젝트 화일들 만을 선별 꺼내어 결합시킴
.. 例) gcc -o main main.o -lm (수학 라이브러리)
ㅇ 링커의 역할
- 메인 루틴을 최초 실행 위치로 식별해 놓고,
- 기호가 참조되는 위치를 메모리 주소와 연결하고,
- 모든 오브젝트 파일들을 결합시키고,
- 이에 라이브러리까지 엮어서,
. 이때, 프로그램에 필요한 각 라이브러리 루틴이 복제되어, 실행 파일에 저장됨 (바인딩)
. 단, 동적 링킹(dynamic linking) 경우에는, 바인딩 대신에 런타임 때에 엮어짐
- 하나의 실행 파일로 만드는 것
* 주로, 오브젝트 파일 및 라이브러리 파일에 대한 링킹 (Linking, 엮음)
ㅇ 링커의 입력
- 중간 (임시) 파일로써, 컴파일된 오브젝트 파일 (재배치 가능한 목적 파일) 임
ㅇ 링커의 출력 (결과물)
- 실행 파일 : (리눅스/유닉스 : *.out, 윈도우 : *.exe)
- 정적 라브러리 : (리눅스/유닉스 : *.a, 윈도우 : *.lib)
- 동적 라이브러리 : (리눅스/유닉스 : *.so, 윈도우 : *.dll, 맥OS : *.dylib)
3. 로더 (loader) / 로딩 (loading)
ㅇ 재배치 가능한 기계어 프로그램을 입력으로하여,
- 메모리 상의 절대 주소를 갖는 동등한 프로그램을 생성 (연결 적재)
ㅇ 이진 실행 파일을 메모리에 적재하는 것
ㅇ 동적 로드/로더 (Dynamic Load) ☞ 동적 연결 라이브러리 참조
- 전체가 실행 시점에 사용되는 방식