링커

링커(Linker)는 컴파일러·어셈블러가 생성한 여러 목적 파일과 라이브러리의 코드·데이터를 결합해 실행 파일이나 공유 라이브러리를 만드는 프로그램이다. 하나의 소스 파일을 변환하는 컴파일 단계와 달리, 함수·변수의 정의를 서로 연결하고 섹션 배치·재배치를 처리한다. GNU ld·LLV...

영어 명칭Linker
분류컴파일러 도구 체인의 바이너리 결합 프로그램
입력목적 파일·정적 라이브러리·동적 라이브러리 참조
출력실행 파일·공유 라이브러리 등
핵심 기능심벌 해석·재배치·섹션 배치
주요 도구GNU ld·gold·lld·link.exe·mold
관련 기술어셈블러, 로더, ABI
대상 형식ELF, PE/COFF, Mach-O 등
참조GNU ld Manual
LLVM lldlld documentation

링커(Linker)는 컴파일러·어셈블러가 생성한 여러 목적 파일과 라이브러리의 코드·데이터를 결합해 실행 파일이나 공유 라이브러리를 만드는 프로그램이다. 하나의 소스 파일을 변환하는 컴파일 단계와 달리, 함수·변수의 정의를 서로 연결하고 섹션 배치·재배치를 처리한다. GNU ld·LLVM lld·Microsoft link.exe 등이 대표적인 도구다.[1]

링커는 심벌 테이블에서 함수·변수의 정의와 외부 참조를 비교한다. 미정의 심벌이 남거나 같은 전역 정의가 중복되면 링킹 오류를 발생시킬 수 있고, 정적 라이브러리에서는 참조된 오브젝트 멤버만 선택해 결합하는 기능을 제공한다. 실제 주소와 섹션 배치를 정한 뒤 명령어·데이터에 필요한 재배치를 적용하며, 정렬·권한·메모리 영역은 오브젝트 포맷과 링크 스크립트·ABI 조건에 따라 달라진다.

정적 링크는 필요한 라이브러리 코드의 일부를 결과 파일에 포함시키고, 동적 링크는 공유 라이브러리 및 런타임 심벌 해결 정보를 남길 수 있다. 따라서 링커는 실행 시 필요한 모든 코드를 항상 하나의 파일로 완전히 복사하는 도구라고 이해하면 안 된다. ELF·PE/COFF·Mach-O 등 서로 다른 플랫폼의 오브젝트 파일 형식과 재배치 규칙은 동일하지 않다.[2]

운영체제 개발과 임베디드 펌웨어에서는 링커 스크립트로 코드·데이터를 특정 ROM·RAM 위치에 배치하거나 부트로더가 기대하는 진입점과 섹션을 구성한다. 일반 앱에서도 디버그 정보·심벌 내보내기·링크 시간 최적화(LTO)와 코드 제거 같은 기능을 제공할 수 있다. 링커가 만든 실행 파일을 메모리에 올리고 동적 라이브러리를 실제 프로세스와 결합하는 역할은 로더 및 동적 링커와 구분된다.

역사

정의와 실행 구조

입력 자료 및 내부 처리

응용 프로그램과 도구 체인

플랫폼·호환성·보안

활용 분야

관련 문서

  1. GNU ld Manual ↩
  2. LLVM lld Linker ↩