여러 조각의 코드와 데이터를 메모리로 로드해서 실행 가능한 파일로 합치는 과정
컴파일 타임, 로드 타임, 런타임에 이루어질 수 있음
링킹을 통해 seperate compilation
이 가능해짐
큰 규모의 애플리케이션을 단일 소스 파일에서 관리하는 대신, 이를 작은 모듈로 분리해서 각각 변경, 컴파일할 수 있음
모듈을 수정할 때 해당 모듈만 recompile
, relink
하면 됨
정적 링커는 relocatable object files
와 command-line arguments
를 받아서 fully linked executable object file
을 생성함
실행 파일을 생성하기 위해 링커는 두 가지 메인 태스크를 수행함
Symbol resolution
symbol reference
를 정확히 하나의 symbol definition
과 연결함Relocation
section
을 생성하므로 section
들을 relocate
하고 symbol
에 대한 참조를 변경함object file
에는 세 가지가 있음
relocatable object file
과 컴파일 타임에 합쳐져서 executable object file
이 될 수 있는 형태로 바이너리 코드와 데이터를 가지고 있음relocatable object file
로, 메모리에 로드되어 동적으로 링크될 수 있음object file
은 특정 파일 포맷을 따라 구성됨
현대 x86-64
리눅스/유닉스 시스템은 ELF(Executable and Linkable Format)를
사용
각 relocatable object module m
은 symbol table
을 가짐
symbol table
은 m
이 정의하거나 참조한 모든 symbol
에 대한 정보를 가짐
Symbol
에는 세 가지가 있음
module m
에 의해 정의되고 다른 모듈에 의해 참조될 수 있는 global symbol
(nonstatic
C 함수와 전역 변수)module m
에 의해 참조되고 다른 모듈에 의해 정의된 global symbol
module m
에 의해서만 정의, 참조되는 local symbol
(static
C 함수와 변수)