다이내믹 링커

Dynamic linker

컴퓨팅에서 다이내믹 링커는 실행 시('런타임'에) 실행 가능한 파일이 필요로 하는 공유 라이브러리를 로드하고 링크하는 운영체제의 일부로서 라이브러리의 콘텐츠를 영속적인 스토리지에서 RAM으로 복사하고 점프 테이블을 채우고 포인터를 재배치합니다.특정 운영 체제 및 실행 파일 형식에 따라 다이내믹 링커의 기능 및 구현 방법이 결정됩니다.

링크는 종종 실행 파일이 컴파일될 때 실행되는 프로세스라고 불리는 반면 다이내믹 링커는 실행 인 프로세스에 외부 공유 라이브러리를 로드한 다음 이러한 공유 라이브러리를 실행 중인 프로세스에 동적으로 바인딩하는 운영 체제의 특별한 부분입니다.이 접근방식은 다이내믹링크 또는 레이트링크라고도 불립니다.

실장

Microsoft Windows

DLL(Dynamic-Link Library)은 Microsoft Windows 및 OS/2 운영 체제에서 Microsoft가 공유 라이브러리 개념을 구현한 입니다.이러한 라이브러리는 일반적으로 파일 확장자를 가집니다. DLL,OCX(ActiveX 컨트롤이 포함된 라이브러리의 경우) 또는DRV(레거시 시스템 드라이버의 경우).DLL의 파일 형식은 Windows EXE 파일의 형식과 동일합니다., 32비트 및 64비트 Windows의 경우 Portable Executable(PE; 포터블 실행 파일), 16비트 Windows의 경우 New Executable(NE; 신규 실행 파일)입니다.EXE와 마찬가지로 DLL은 코드, 데이터리소스를 임의의 조합으로 포함할 수 있습니다.

파일 형식이 DLL과 동일하지만 파일 확장자가 다르고 리소스 섹션만 포함하는 데이터 파일을 리소스 DLL이라고 할 수 있습니다.이러한 DLL의 예로는 아이콘 라이브러리가 있으며 확장자가 있을 수 있습니다.ICL확장자를 가진 , 및 글꼴파일FON그리고.FOT를 클릭합니다.[1]

ELF를 사용하는 Unix 계열 시스템 및 Darwin 기반 시스템

대부분의 Unix 유사 시스템에서 동적 링커를 구성하는 머신 코드의 대부분은 실제로 외부 실행 파일이며, 호출의 결과로 새로 구축된 프로세스 주소 공간에서 운영 체제 커널이 로드되고 먼저 실행됩니다.exec또는posix_spawn기능들.링크 시 사용해야 하는 다이내믹링커의 경로가 실행 가능한 이미지에 포함됩니다.

실행 파일이 로드되면 운영 체제 커널은 해당 파일에서 다이내믹 링커의 경로를 읽고 이 다른 실행 가능 바이너리를 로드 및 실행하려고 시도합니다.예를 들어 해당 경로를 가진 파일이 없기 때문에 이 시도가 실패하면 원래 실행 파일의 실행 시도가 실패합니다.그런 다음 동적 링커는 초기 실행 가능 이미지와 이 이미지가 의존하는 동적으로 연결된 모든 라이브러리를 로드하고 실행 가능 파일을 시작합니다.따라서 동적 링커의 경로 이름은 운영 체제의 응용 프로그램 바이너리 인터페이스의 일부가 됩니다.

ELF를 사용하는 시스템

Solaris, HP-UX, Linux, FreeBSD, NetBSD, OpenBSD, DragonFly BSD 등의 실행 가능 이미지 및 동적 라이브러리에 ELF를 사용하는 Unix 유사 시스템에서는 링크 시 사용해야 하는 동적 링커의 경로가 포함됩니다..interp실행 파일의 섹션PT_INTERP부분.이러한 시스템에서는 동적으로 로드된 공유 라이브러리를 파일 이름 접미사로 식별할 수 있습니다..so(공유 객체).

동적 링커는 프로그램 실행 중 또는 프로그램 링크 중 하나의 동작을 수정하도록 영향을 받을 수 있으며, 이 예는 다양한 Unix 유사 [2][3][4][5][6]시스템의 런타임 링커 매뉴얼 페이지에서 볼 수 있습니다.이 동작의 일반적인 변경은 다음 명령어를 사용하는 것입니다.LD_LIBRARY_PATH그리고.LD_PRELOAD 환경 변수 - 대체 위치에서 공유 라이브러리를 검색하고 그렇지 않으면 그렇지 않을 라이브러리를 각각 로드 및 링크함으로써 런타임 링크 프로세스를 조정합니다.예로는 zlibc가 [7]있습니다.uncompress.so를 사용하여 투과적인 압축을 쉽게 해제할 수 있습니다.[a]LD_PRELOAD 따라서 BSD 및 Linux 시스템에서 미리 압축된(gzip) 파일 데이터를 파일이 압축되지 않은 것처럼 읽을 수 있으므로 기본적으로 사용자는 기본 파일 시스템에 투명 압축을 추가할 수 있습니다. 단, 몇 가지 주의 사항이 있습니다.이 메커니즘은 유연하기 때문에 동일한 코드의 사소한 적응으로 해당 데이터를 [8][9]요청한 사용자 프로세스에 제공하기 전에 파일 읽기 중에 데이터의 추가 또는 대체 처리를 수행할 수 있습니다.

MacOS 및 iOS

Apple Darwin 운영 체제 및 그 위에 구축된 MacOSiOS 운영 체제에서는 링크 시 사용해야 하는 동적 링커의 경로가 실행 이미지 내의 마하-O 로드 명령 중 하나에 포함됩니다.이러한 시스템에서는 동적으로 로드된 공유 라이브러리를 파일 이름 접미사로 식별할 수 있습니다..dylib또는 프레임워크의 번들 내 배치에 의해 결정됩니다.

다이내믹 링커는 타깃 실행 가능 파일을 공유 라이브러리에 링크할 뿐만 아니라 타깃 실행 가능 파일이 링크 시 알고 있는 메모리의 특정 주소 지점에 머신 코드 함수를 배치합니다.실행파일이 다이내믹링커와 대화하고 싶을 때는 머신 고유의 콜 또는 점프명령어를 이들 잘 알려진 어드레스 포인트 중 하나로 실행합니다.MacOS 및 iOS 플랫폼의 실행 파일은 프로세스 실행 중에 동적 링커와 상호 작용하는 경우가 많습니다. 심지어 실행 파일이 동적 링커와 상호 작용하여 처음 실행한 후 몇 시간 후에 더 많은 라이브러리를 로드하고 더 많은 기호를 해결할 수도 있습니다.MacOS 또는 iOS 프로그램이 동적 링커와 자주 상호 작용하는 이유는 Apple의 Cocoa 및 Cocoa Touch API와 구현 언어인 Objective-C 둘 다 때문입니다(자세한 내용은 주요 기사 참조).

다이내믹 링커는 동작의 일부를 강제로 변경할 수 있습니다.다만, 다른 Unix 계열의 operating system과 달리, 이러한 변경은 다이내믹링커에 의해서 무시될 가능성이 있는(또는 무시될 수도 있습니다) 힌트입니다.이 예는 에서 확인할 수 있습니다.dyld의 매뉴얼 [10]페이지이 동작의 일반적인 변경은 의 사용입니다.DYLD_FRAMEWORK_PATH그리고.DYLD_PRINT_LIBRARIES환경변수앞에서 설명한 변수 중 하나는 공유 라이브러리에 대한 실행 파일의 검색 경로를 조정하는 반면, 후자는 로드 및 링크된 라이브러리의 이름을 표시합니다.

애플의 macOS 다이내믹 링커는 다윈의 일부로 출시된 오픈 소스 프로젝트로 애플의 오픈 소스에서 찾을 수 있습니다.dyld프로젝터[11]

XCOFF 기반의 Unix 라이크 시스템

AIX와 같은 XCOFF를 사용하는 Unix 유사 운영 체제에서는 동적으로 로드된 공유 라이브러리가 파일 이름 접미사를 사용합니다..a.

동적 링커는 프로그램 실행 중 또는 프로그램 링크 중 하나의 동작을 수정하도록 영향을 받을 수 있습니다.이 동작의 일반적인 변경은 의 사용입니다.LIBPATH 환경 변수입니다.이 변수는 대체 위치에서 공유 라이브러리를 검색하고 그렇지 않으면 그렇지 않은 라이브러리를 각각 강제로 로드 및 링크함으로써 런타임 링크 프로세스를 조정합니다.

OS/360 이후

IBM OS/360 및 그 후속 어셈블러 언어 프로그램으로부터의 동적 링크는 일반적으로 프로그램에 라이브러리 모듈을 링크할 수 있도록 하는 운영 체제 루틴을 활성화하는 슈퍼바이저 호출 명령을 포함하는 LINK 매크로 명령을 사용하여 수행됩니다.라이브러리 모듈은 컨트롤 카드에 지정된 "STEPLIB" 또는 "JOBLIB"에 상주하며 프로그램의 특정 실행에만 사용할 수 있으며 PARMLIB의 LINKLIST에 포함된 라이브러리(시스템 시작 시 지정), 시스템 시작 시 특정 리엔트 모듈이 로드되는 "링크 팩 영역"에만 사용할 수 있습니다.

멀티틱스

Multics 운영 체제에서는 실행 파일을 포함한 모든 파일이 세그먼트입니다.현재 세그먼트의 일부가 아닌 루틴에 호출하면 시스템은 메모리 또는 디스크에서 참조 세그먼트를 검색하여 실행 중인 프로세스의 주소 공간에 추가합니다.동적 링크는 일반적인 작동 방식이며 정적 링크(바인더 사용)는 예외입니다.

효율성.

동적 링크는 런타임에 실행되는 대부분의 프로세스와 마찬가지로 컴파일 [12]시 링크보다 일반적으로 속도가 느립니다(CPU 사이클이 더 필요).단, 동적 링크는 (실행 시 디스크와 메모리의) 공간 효율이 높은 경우가 많습니다.라이브러리가 정적으로 링크되면 실행 중인 모든 프로세스는 호출되는 라이브러리 함수의 자체 복사본과 링크됩니다.따라서 라이브러리가 다른 프로그램에 의해 여러 번 호출되면 해당 라이브러리의 동일한 기능이 시스템 메모리의 여러 위치에 복제됩니다.공유 동적 라이브러리를 사용하면 컴파일 시 각 파일을 라이브러리의 자체 복사본에 링크하여 메모리 공간을 낭비하는 대신 라이브러리의 복사본이 한 번에 1개만 메모리에 저장되므로 다른 [13]곳에서 사용할 수 있는 메모리 공간을 확보할 수 있습니다.또한 동적 링크에서 라이브러리는 실제로 [14]사용 중인 경우에만 로드됩니다.

「 」를 참조해 주세요.

메모들

  1. ^ zlib 압축 라이브러리와 혼동하지 마십시오.

레퍼런스

  1. ^ Microsoft Corporation. "Creating a Resource-Only DLL". Microsoft Developer Network Library.
  2. ^ ld.so.1(1): Solaris 다이내믹링커/로더Solaris 10 사용자 명령어레퍼런스 매뉴얼
  3. ^ ld-linux.so(8)Linux 프로그래머 매뉴얼– 관리 및 특권 명령어
  4. ^ rtld(1): FreeBSD 다이내믹 링커/로더– FreeBSD 일반 명령어 매뉴얼
  5. ^ ld.elf_so(1): NetBSD 다이내믹 링커/로더– NetBSD 일반 명령어 매뉴얼
  6. ^ ld.so(1): OpenBSD 다이내믹 링커/로더– OpenBSD 일반 명령 매뉴얼
  7. ^ "ZLIBC - Transparent access to compressed files". Archived from the original on 2000-06-04.
  8. ^ "uncompress.so". delorie.com. Retrieved 2014-07-04.
  9. ^ "zlibc.conf". delorie.com. Retrieved 2014-07-04.
  10. ^ dyld(1): Darwin/Mac OS X 다이내믹 링커/로더– Darwin 및 MacOS 일반 명령어 매뉴얼
  11. ^ Apple Inc. "Open Source - Releases". apple.com. Retrieved 2014-07-04.
  12. ^ Xuxian, Jiang (2009). "Operating Systems Principles: Linking and Loading" (PDF). North Carolina State University. Retrieved 2020-09-24.
  13. ^ Jones, M. (2008-08-28). "Anatomy of Linux dynamic libraries". IBM. Retrieved 2020-09-24.
  14. ^ Sivilotti, Paul (August 2012). "Dynamic Linking and Loading" (PDF). Ohio State University. Retrieved 2020-09-24.

추가 정보

외부 링크