본문 바로가기
영문 위키피디아 번역

(번역) Linker (computing)

by 다움위키 2023. 12. 21.

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

출력메모리에 직접 쓰는 더 간단한 버전은 로더라고 하지만, 로딩은 전형적으로 별도의 프로세스로 여겨집니다.

Overview

컴퓨터 프로그램은 전형적으로 여러 부분 또는 모듈로 구성됩니다; 이들 부분/모듈은 단일 객체 파일 내에 포함될 필요가 없고, 그러한 경우에서 기호를 수단으로 다른 모듈에 대한 주소로 서로를 참조하며, 실행을 위해 링크될 때 메모리 주소에 매핑됩니다. 전형적으로, 하나의 개체 파일은 세 가지 종류의 기호를 포함할 수 있습니다:

  • 다른 모듈에서 호출하는 것을 허용하는, 때때로 "public" 또는 "entry" 기호라고 불리는, 정의된 "extern" 기호,
  • 이들 기호가 정의된 곳에서 다른 모듈을 참조하는, 정의되지 않은 "external" 기호, 그리고
  • 재배치를 용이하게 하기 위해 객체 파일 내에서 내부적으로 사용되는, 로컬 기호.

대부분의 컴파일러에 대해, 각 개체 파일은 하나의 입력 소스 코드 파일을 컴파일한 결과입니다. 프로그램이 여러 객체 파일로 구성될 때, 링커는 이들 파일을 통합된 실행 프로그램으로 결합하여, 프로그램이 진행함에 따라 기호를 해결합니다.

링커는 라이브러리 또는 런타임 라이브러리라는 모음에서 객체를 가져올 수 있습니다. 대부분의 링커는 출력에 전체 라이브러리를 포함하지 않습니다; 그것들은 오직 다른 개체 파일 또는 라이브러리에 의해 참조되는 파일을 포함합니다. 라이브러리 링킹은 따라서 링크될 추가 모듈, 등을 요구하는 일부 참조된 모듈과 함께 반복적인 과정일 수 있습니다. 라이브러리는 다양한 용도로 존재하고 하나 이상의 시스템 라이브러리가 보통 기본적으로 링크됩니다.

링커는 역시 프로그램의 주소 공간에서 객체를 정렬하는 것을 관리합니다. 이것은 특정 기본 주소를 가정하는 코드를 또 다른 기본 주소로 재배치하는 것을 포함할 수 있습니다. 컴파일러는 객체가 상주할 위치를 거의 알지 못하기 때문에, 그것은 종종 고정된 기본 위치 (예를 들어, )를 가정합니다. 기계어 코드를 재배치하는 것은 절대 점프, 로드 및 저장의 재-타겟팅을 포함할 수 있습니다.

링커에 의한 실행 가능한 출력은 그것이 최종적으로 메모리에 로드될 때 (실행 바로 직전) 또 다른 재배치 패스를 필요로 할 수 있습니다. 이 패스는 보통 가상 메모리를 제공하는 하드웨어에서 생략됩니다: 모든 각 프로그램은 자체 주소 공간에 배치되므로, 모든 프로그램이 동일한 기본 주소에서 로드되더라도 충돌은 없습니다. 이 패스는 실행 파일이 위치 독립적 실행 파일이면 생략할 수도 있습니다.

SINTRAN III와 같은 일부 유닉스 변종에서, 링커에 의해 수행된 프로세스 (객체 파일을 프로그램으로 어셈블)는 로딩 (실행 코드를 파일에 로드하는 것과 같이)이라고 합니다. 추가적으로, 일부 운영 시스템에서, 같은 프로그램이 링킹의 작업과 프로그램의 로딩 (동적 링킹)을 모두 처리합니다.

Dynamic linking

많은 운영 시스템 환경은 동적 링킹을 허용하며, 프로그램이 실행될 때까지 일부 정의되지 않은 기호의 해석을 연기합니다. 그것은 실행 코드는 여전히 정의되지 않은 기호, 더하기 이들에 대한 정의를 제공할 객체 또는 라이브러리 목록을 포함함을 의미합니다. 프로그램을 로드하면 이들 객체/라이브러리도 마찬가지로 로드하고, 최종 링킹을 수행할 것입니다.

이 접근 방식은 두 가지 이점을 제공합니다:

  • 자주-사용되는 라이브러리 (예를 들어 표준 시스템 라이브러리)는 모든 각 단일 실행 파일에 복제되지 않고 오직 한 위치에 저장되어야 하고, 따라서 제한된 메모리디스크 공간을 절약합니다.
  • 만약 라이브러리 함수에서 버그가 라이브러리를 교체함으로써 수정되면, 그것을 동적으로 사용하는 모든 프로그램은 그것들을 다시 시작한 후 수정으로부터 이점을 얻을 것입니다. 정적 링킹에 의해 이 함수를 포함된 프로그램은 먼저 다시-링크되어야 합니다.

역시 다음과 같은 단점이 있습니다:

  • Windows 플랫폼에서 "DLL 지옥"으로 알려진, 호환되지 않는 업데이트된 라이브러리는 더 최신 버전이 잘못되게 구버전과 호환되지 않는 이전 버전의 라이브러리 동작에 종속된 실행 파일을 깨뜨릴 것입니다.
  • 프로그램은, 사용하는 라이브러리와 함께, 패키지로 인증 (예를 들어, 정확성, 문서 요구 사항, 또는 성능)될 수 있지만, 구성 요소는 교체될 수 있으면 그렇지 않습니다 (이것은 역시 치명적 시스템에서 자동 OS 업데이트에 반대합니다; 둘 다 경우에서, OS와 라이브러리는 검증된 환경의 일부를 형성합니다).

Static linking

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

Relocation

컴파일러는 최종 출력에서 객체의 레이아웃에 대한 정보를 가지지 않기 때문에, 그것은 또 다른 객체의 주소에 대한 요구 사항을 지정하는 더 짧거나 더 효율적인 명령을 활용할 수 없습니다. 예를 들어, 점프 명령은 절대 주소 또는 현재 위치로부터의 오프셋을 참조할 수 있고, 오프셋은 대상까지의 거리에 따라 다른 길이로 표현될 수 있습니다. 먼저 가장 보수적인 명령어 (보통 플랫폼에 따라 가장 큰 상대적 또는 절대적 변형)를 생성하고 완화 힌트를 추가함으로써, 최종 링크 동안 더 짧거나 더 효율적인 명령어를 대체하는 것이 가능합니다. 점프 최적화와 관련하여 이것은 자동 점프-크기 조정이라고도 합니다. 이 단계는 모든 입력 객체가 읽히고 임시 주소를 할당된 후에 오직 수행될 수 있습니다; 링커 완화 패스는 이후에 주소를 재할당하여, 차례로 더 많은 잠재적 완화를 발생시키는 것을 허용할 것입니다. 일반적으로, 대체된 시퀀스는 더 짧으며, 이 과정에서 객체의 고정된 순서가 주어지면 항상 최상의 해결책으로 수렴하는 것을 허용합니다; 만약 이것이 그 경우가 아니면, 완화가 충돌할 수 있고, 링커는 두 옵션의 이점을 심사 수고할 필요가 있습니다.

명령 완화는 전형적으로 링크-타임에 발생하지만, 내부-모듈 완화는 이미 컴파일-시간에 최적화 과정의 일부로 발생할 수 있습니다. 일부 경우에서, 완하는 역시 재배치 프로세스의 일부로 로드-시간에 발생하거나 적 데드-코드 제거 기술과 결합될 수도 있습니다.

Linkage editor

z/Architecture 메인프레임에 대해 z/OS를 포함하여, OS/360과 같은 IBM System/360 메인프레임 환경에서, 이러한 유형의 프로그램은 linkage editor로 알려져 있습니다. 이름에서 알 수 있듯이, 결합 편집기는 개별 프로그램 섹션의 추가, 대체, 및/또는 삭제를 허용하는 추가적인 능력을 가집니다. OS/360과 같은 운영 시스템은 개별 프로그램 섹션을 대체할 수 있도록 프로그램의 구성 요소 섹션과 재배치 가능한 주소와 기타 참조가 결합 편집기에 의해, 과정의 일부로, 수정될 수 있도록 업데이트된 프로그램의 다른 부분에 대한 보충하는 데이터를 포함하는 실행 가능한 로드-모듈 형식을 가집니다.

이것의 한 가지 장점은 모든 중간 객체 파일을 유지해야 하는 것 없이, 또는 변경되지 않은 프로그램 섹션을 다시 컴파일해야 하는 것 없이 프로그램을 유지 관리할 수 있다는 것입니다. 그것은 역시 프로그램 업데이트를 교체될 객체 모듈만 포함하는 작은 파일 (원래 카드 데크)의 형식으로 배포되는 것을 허용합니다. 그러한 시스템에서, 객체 코드는 업데이트가 해당 미디어를 사용하여 시스템에 도입될 수 있도록 80바이트 천공-카드 이미지의 형식과 체제에 있습니다. OS/360의 이후 릴리스 및 후속 시스템에서, 로드-모듈은 추적 가능한 업데이트 레코드를 생성하기 위해 구성 요소 모듈 버전에 대한 추가적인 데이터를 포함합니다. 그것은 역시 이미 링크된 로드 모듈에서 오버레이 구조를 추가, 변경 또는 제거하는 것을 허용합니다.

용어 "결합 편집기"는 프로그램이 텍스트 편집기와 같은 사용자-대화형 모드에서 작동한다는 의미로 해석되어서는 안 됩니다. 그것은 일괄-모드 실행에 대해 의도된 것으로, 천공 카드, DASD 또는 자기 테이프와 같이 순차적으로 구성된 파일로 사용자에 의해 편집 명령을 제공하고, 테이프는 OS 초기 설치 동안 자주 사용되었습니다.

Linkage editing (IBM 명명법) 또는 consolidation 또는 collection (ICL 명명법)은 다양한 조각을 재배치 가능한 바이너리로 결합하는 링크 linkage editor의 또는 consolidator의 동작을 참조하지만, 대상 주소에서 절대 바이너리로의 로딩과 재배치는 통상적으로 별도의 단계로 고려됩니다.

GNU linker

GNU 링커 (또는 GNU ld)는 GNU 프로젝트에서 유닉스 명령 ld를 구현한 것입니다. GNU ld는 소프트웨어 프로젝트를 컴파일하는 동안 생성된 객체 파일에서 실행 파일 (또는 라이브러리)을 생성하는 링커를 실행합니다. linker script는 링킹 과정을 더 잘 제어하기 위해 GNU ld에 전달될 수 있습니다. GNU 링커는 GNU 바이너리 유틸리티 (binutils)의 일부입니다. ld의 두 가지 버전이 binutils에서 제공됩니다: bfd를 기반으로 하는 전통적인 GNU ld와 gold라고 하는 ELF-전용 버전입니다.

이름 "ld"의 기원은 "LoaDer"와 "Link eDitor"입니다. 용어 "로더"는 링킹 과정 동안 다른 프로그램에서 외부 기호를 로드하는 프로세스를 설명하기 위해 사용되었습니다.

GNU 링커는 GNU General Public License의 조건 아래에서 배포되는 자유 소프트웨어입니다.

Further reading

External links