링커(컴퓨팅)

Linker (computing)
링크 프로세스의 그림.오브젝트 파일과 스태틱 라이브러리가 새로운 라이브러리 또는 실행 파일로 조립됨

컴퓨팅에서 링커 또는 링크 에디터는 하나 이상의 객체 파일(컴파일러 또는 어셈블러에 의해 생성됨)을 가져와 단일 실행 파일, 라이브러리 파일 또는 다른 "개체" 파일로 결합하는 컴퓨터 시스템 프로그램입니다.

로딩은 일반적으로 별도의 [1][2]프로세스로 간주되지만 출력을 메모리에 직접 쓰는 간단한 버전을 로더라고 합니다.

개요

컴퓨터 프로그램은 일반적으로 여러 개의 부품 또는 모듈로 구성되어 있습니다.이러한 부품/모듈은 하나의 객체 파일 내에 포함할 필요가 없습니다.이러한 경우, 다른 모듈로의 주소로서 심볼에 의해서 서로를 참조합니다.이러한 주소는, 실행을 위해서 링크 했을 때에 메모리 주소에 매핑 됩니다.일반적으로 오브젝트 파일에는 다음 3종류의 기호를 포함할 수 있습니다.

  • 정의된 "public" 기호 또는 "entry" 기호로 불리며 다른 모듈에 의해 호출될 수 있습니다.
  • 정의되지 않은 "정확한" 기호, 이러한 기호가 정의되어 있는 다른 모듈을 참조합니다.
  • 로컬 기호. 오브젝트 파일 내에서 재배치를 용이하게 하기 위해 내부적으로 사용됩니다.

대부분의 컴파일러에서 각 오브젝트 파일은 1개의 입력 소스 코드 파일을 컴파일한 결과입니다.프로그램이 여러 개체 파일로 구성되어 있는 경우 링커는 이러한 파일을 통합 실행 파일로 결합하여 진행 중인 기호를 해결합니다.

링커는 라이브러리 또는 런타임 라이브러리라는 컬렉션에서 개체를 가져올 수 있습니다.대부분의 링커는 라이브러리 전체를 출력에 포함하지 않고 다른 오브젝트 파일 또는 라이브러리에서 참조되는 파일만[clarification needed] 포함합니다.따라서 라이브러리 링크는 반복 프로세스일 수 있으며, 일부 참조 모듈에서는 링크할 추가 모듈이 필요합니다.라이브러리는 다양한 목적으로 존재하며, 일반적으로 하나 이상의 시스템 라이브러리가 기본적으로 링크되어 있습니다.

링커는 프로그램의 주소 공간에 객체를 배치하는 작업도 수행합니다.여기에는 특정 베이스 주소를 가정한 코드를 다른 베이스로 재배치하는 작업이 포함될 수 있습니다.컴파일러는 오브젝트의 위치를 거의 알지 못하기 때문에 종종 고정된 베이스 위치(예를 들어 0)를 가정합니다.기계 코드 재배치에는 절대 점프, 하중 및 저장소의 재타겟팅이 수반될 수 있다.

링커에 의한 실행 가능한 출력은 최종적으로 메모리에 로드되었을 때(실행 직전에) 다른 재배치 패스가 필요할 수 있습니다. 패스는 일반적으로 가상 메모리를 제공하는 하드웨어에서는 생략됩니다.모든 프로그램은 자체 주소 공간에 배치되므로 모든 프로그램이 동일한 기본 주소에 로드되어도 경합이 발생하지 않습니다. 패스는 실행 파일이 위치 독립 실행 파일인 경우에도 생략할 수 있습니다.

SINTRAN III와 같은 일부 Unix 버전에서는 링커에 의해 실행되는 프로세스(객체 파일을 프로그램으로 조립하는 것)를 로딩(실행 [3]가능한 코드를 파일에 로드하는 것)이라고 부릅니다.또, 일부의 operating system에서는, 같은 프로그램이 프로그램의 링크와 로드(다이나믹 링크)의 양쪽 모두의 작업을 처리합니다.

동적 링크

많은 운영 체제 환경에서는 동적 링크를 사용할 수 있으며, 프로그램이 실행될 때까지 일부 정의되지 않은 기호의 해상도를 늦춥니다.즉, 실행 코드에는 정의되지 않은 기호와 더불어 이러한 기호에 대한 정의를 제공하는 개체 또는 라이브러리의 목록이 여전히 포함되어 있습니다.프로그램을 로드하면 이러한 오브젝트/라이브러리도 로드되어 최종 링크가 실행됩니다.

이 방법에는 다음 두 가지 이점이 있습니다.

  • 자주 사용되는 라이브러리(표준 시스템 라이브러리 등)는 모든 실행 파일에 중복되지 않고 한 곳에만 저장해야 하므로 메모리와 디스크 공간이 제한됩니다.
  • 라이브러리를 교체하여 라이브러리 기능의 버그를 수정하면 동적으로 사용하는 모든 프로그램이 재시작 후 수정의 혜택을 받을 수 있습니다.정적 링크에 의해 이 기능이 포함된 프로그램은 먼저 다시 링크해야 합니다.

단점도 있습니다.

  • Windows 플랫폼에서는 "DLL hell"로 알려져 있으며, 새로운 버전이 하위 버전과 호환되지 않을 경우 호환되지 않는 업데이트된 라이브러리는 이전 버전의 라이브러리에 의존하던 실행 파일을 손상시킵니다.
  • 프로그램은 사용하는 라이브러리와 함께 패키지로 인정(정확성, 문서 요건 또는 퍼포먼스에 관한 것 등)될 수 있지만 컴포넌트를 교환할 수 있는 경우에는 인정되지 않습니다(이것은 중요한 시스템의 자동 OS 업데이트에 반대합니다.어느 경우든 OS와 라이브러리는 인정된 환경의 일부를 형성합니다).

스태틱 링크

정적 링크는 링커가 프로그램에서 사용되는 모든 라이브러리 루틴을 실행 가능한 이미지로 복사한 결과입니다.동적 링크보다 더 많은 디스크 용량과 메모리가 필요할 수 있지만 실행하는 시스템에 라이브러리가 없어도 되기 때문에 더 휴대성이 좋습니다.또한 정적 링크는 각 프로그램이 다른 프로그램과 충돌하지 않고 필요한 라이브러리 루틴 버전을 정확히 포함하므로 "DLL 지옥"을 방지합니다.라이브러리에서 몇 가지 루틴만 사용하는 프로그램은 라이브러리 전체를 설치할 필요가 없습니다.

재배치

컴파일러는 최종 출력에 오브젝트의 레이아웃에 대한 정보가 없기 때문에 다른 오브젝트의 주소에 대한 요건을 부여하는 보다 짧고 효율적인 명령을 이용할 수 없습니다.예를 들어 점프 명령은 현재 위치에서 절대 주소 또는 오프셋을 참조할 수 있으며 오프셋은 목표물까지의 거리에 따라 다른 길이로 표현할 수 있습니다.먼저 가장 보수적인 명령어(일반적으로 플랫폼에 따라 가장 큰 상대적인 명령어 또는 절대적인 명령어)를 생성하고 완화 힌트를 추가함으로써 최종 링크 중에 보다 짧고 효율적인 명령어를 대체할 수 있습니다.점프 최적화와 관련하여 자동 점프 크기 [4]조정이라고도 합니다.이 스텝은 모든 입력 오브젝트를 읽고 임시 주소를 할당한 후에만 실행할 수 있습니다.링커 완화 패스에 의해 주소가 재할당되므로 더 많은 잠재적 완화 작업이 발생할 수 있습니다.일반적으로 치환된 시퀀스는 짧아지기 때문에 이 프로세스는 항상 오브젝트의 고정된 순서로 최적의 솔루션에 수렴할 수 있습니다.그렇지 않은 경우 완화가 경합할 수 있으며 링커는 어느 한쪽 옵션의 이점을 고려해야 합니다.

명령 완화는 일반적으로 링크 시간에 발생하지만 내부 모듈 완화는 컴파일 시간에 최적화 프로세스의 일부로 이미 발생할 수 있습니다.경우에 따라서는 재배치 프로세스의 일부로서 부하 시 또는 동적 데드 코드 제거 기술과 조합하여 완화가 발생할 수도 있습니다.

링크 에디터

z/Architecture 메인프레임용 z/OS를 포함한 OS/360과 같은 IBM System/360 메인프레임 환경에서는 이러한 유형의 프로그램을 링크 편집기라고 합니다.이름에서 알 수 있듯이 링크 에디터는 개별 프로그램 섹션의 추가, 대체 및/또는 삭제를 허용하는 추가 기능을 가지고 있습니다.OS/360 등의 운영체제는 프로그램의 컴포넌트 섹션에 관한 보충데이터를 포함하는 실행가능 로드모듈의 포맷을 가지며, 개별 프로그램 섹션은 대체될 수 있으며, 프로그램의 다른 부분은 링크 에디터에 의해 갱신되어 재배치 가능한 주소 및 기타 참조가 프로의 일부로서 수정될 수 있다.시궁창.

이것의 장점 중 하나는 중간 객체 파일을 모두 보유하거나 변경되지 않은 프로그램 섹션을 다시 컴파일하지 않고도 프로그램을 유지할 수 있다는 것입니다.또한 교환 대상 모듈만 포함하는 작은 파일(원래 카드덱) 형태로 프로그램 업데이트를 배포할 수도 있습니다.이러한 시스템에서는 오브젝트 코드가 80바이트 펀치 카드 이미지의 형식과 형식이므로 해당 미디어를 사용하여 시스템에 업데이트를 도입할 수 있습니다.OS/360의 최신 릴리스 및 후속 시스템에서는 로드 모듈에는 컴포넌트 모듈의 버전에 대한 추가 데이터가 포함되어 업데이트 추적 가능한 레코드를 만듭니다.또한 이미 링크된 로드 모듈에서 오버레이 구조를 추가, 변경 또는 제거할 수도 있습니다.

"링크 에디터"라는 용어는 프로그램이 텍스트 에디터처럼 사용자 인터랙티브 모드로 작동함을 암시하는 것으로 해석해서는 안 됩니다.이는 배치 모드 실행을 목적으로 하며 사용자가 편집 명령어를 펀치 카드, DASD, 자기 테이프 등 순차적으로 정리된 파일로 제공되며 OS 초기 설치 시 테이프가 많이 사용되었습니다.

링크 편집(IBM 명명법) 또는 통합 또는 수집(ICL 명명법)은 링크 에디터 또는 통합자가 다양한 조각을 재배치 가능한 바이너리로 결합하는 작업을 의미하지만, 일반적으로 타깃 주소에서 절대 바이너리로 로드 및 재배치는 별도의 [2]단계로 간주됩니다.

일반적인 실장

Unix 및 Unix 유사 시스템에서 링커는 "ld"로 알려져 있습니다.이름 "ld"의 유래는 "LoaDer"와 "Link eDitor"입니다."[5]로더"라는 용어는 링크 과정 중에 다른 프로그램에서 외부 기호를 로드하는 과정을 설명하기 위해 사용되었습니다.

GNU 링커

GNU 링커(또는 GNU ld)는 Unix 명령어 ld의 GNU 프로젝트의 무료 소프트웨어 구현입니다.GNU ld는 링커를 실행합니다.링커는 소프트웨어 프로젝트 컴파일 중에 작성된 오브젝트 파일에서 실행 파일(또는 라이브러리)을 만듭니다.링커 스크립트를 GNU ld에 전달하여 링크 프로세스를 [6]보다 효과적으로 제어할 수 있습니다.GNU 링커는 GNU 바이너리 유틸리티(binutils)의 일부입니다.ld의 두 가지 버전은 bfd에 기반한 기존 GNU ld와 gold라고 불리는 "유선형" ELF 전용 버전입니다.

GNU ld의 명령줄 및 링커스크립트 구문은 Unix와 유사한 대부분의 세계에서 사실상의 표준입니다.LLVM 프로젝트의 링커 lld는 드롭인 [7]호환성을 갖도록 설계되어 있으며 GNU 컴파일러와 직접 사용할 수 있습니다.또 다른 드롭인 대체품인 Mold는 GNU [8]툴에서도 지원되는 고도로 병렬화되고 빠른 대체품입니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ IBM OS Linkage Editor and Loader (PDF). IBM Corporation. 1972. Archived (PDF) from the original on 2020-03-06. Retrieved 2020-03-07.
  2. ^ a b Barron, David William (1978) [1971, 1969]. "5.7. Linkage editors and consolidators". Written at University of Southampton, Southampton, UK. In Floretin, J. John (ed.). Assemblers and Loaders. Computer Monographs (3 ed.). New York, USA: Elsevier North-Holland Inc. pp. 65–66. ISBN 0-444-19462-2. LCCN 78-19961. (104 페이지 이상)
  3. ^ BRF-LINKER User Manual. August 1984. ND-60.196.01.
  4. ^ 살로몬, 데이비드[1992년](2월 1993년)."8.2.3 jump-sizing 자동"(PDF).캘리포니아 주립 대학교 Northridge, 캘리포니아, 미국에서. Chivers, 이언 D.(교육.)에서 쓰여진.Assemblers과 Loaders.엘리스 Horwood 시리즈 컴퓨터는, 또 그들의 응용 프로그램(1판).Chicester, 웨스트 서식스 주, 영국:엘리스 Horwood 리미티드/사이먼&슈스터 국제 그룹이다.를 대신하여 서명함. 237–238.아이 에스비엔 0-13-052564-2.그 2020-03-23에 원래에서Archived(PDF)..(xiv+294+4 페이지)2008-10-01 Retrieved
  5. ^ "1. ld". UNIX PROGRAMMER'S MANUAL (6 ed.). May 1975.
  6. ^ "GNU Binutils: Linker Scripts". 2018-07-18. Archived from the original on 2020-03-06. Retrieved 2019-01-18.
  7. ^ "LLD - The LLVM Linker — lld 14 documentation". lld.llvm.org.
  8. ^ "GCC 12 Adds Support For Using The Mold Linker". www.phoronix.com.

추가 정보

외부 링크