2010-01-13 3 views

답변

17

로드 타임 링크는 실행 파일/라이브러리가 메모리에로드 될 때 실행 파일 (또는 다른 라이브러리)이 참조하는 라이브러리의 심볼이 운영 체제에 의해 처리되는 경우입니다.

런타임 연결은 필요한 경우 DLL 또는 DSO를로드하기 위해 OS 또는 라이브러리에서 제공하는 API를 사용하고 심볼 해상도를 수행 할 때 사용됩니다.

Windows DLL보다 Linux DSO에 대해 더 많이 알고 있지만 원칙은 동일해야합니다. .NET 라이브러리는 다를 수 있습니다.

리눅스에서는 플러그인 아키텍처가 이렇게 이루어집니다. 프로그램은 런타임 링크를 사용하여 라이브러리를로드하고 일부 기능을 호출합니다. 그런 다음 언로드하십시오. 또한 내 보낸 동일한 기호가있는 여러 라이브러리를 충돌없이로드 할 수 있습니다. 나는 DLL이 거의 같은 방식으로 작동한다고 생각한다.

실행 파일에는 기호 테이블에 일부 라이브러리를 채워야하는 "공백"이 있습니다. 이 공백은 일반적으로로드 시간 또는 컴파일 시간에 채워집니다. 런타임 연결을 사용하여 기호 테이블에서 "공백"의 필요성을 무효화 할 수 있습니다.

런타임 링크가 유용한 다른 시나리오는 라이브러리를 디버깅하거나 런타임에 여러 개의 ABI/API 호환 라이브러리 중에서 선택하는 것입니다. 필자는 종종 "foo"라고 불리는 라이브러리와 "foo_unstable"이라고 불리는 라이브러리를 가지고 있으며 2 사이를 전환하고 테스트를 수행하는 테스트 응용 프로그램을 가지고 있습니다.

linux-vdso.so.1 => (0x00007fff139ff000) 
librt.so.1 => /lib64/librt.so.1 (0x0000003c4f200000) 
libselinux.so.1 => /lib64/libselinux.so.1 (0x0000003c4fa00000) 
libcap.so.2 => /lib64/libcap.so.2 (0x0000003c53a00000) 
libacl.so.1 => /lib64/libacl.so.1 (0x0000003c58e0000 

운영 체제가 시도합니다 :

리눅스에서, 당신은 ldd 명령을 실행하고 같은 (/ 빈/LS와) 같은 출력을 얻을로드시에 실행 링크를 도서관 것을 볼 수 로드시 라이브러리 (.so 파일)를로드하십시오. 이미 메모리에 라이브러리가있을 수 있습니다.

14

에이든 벨 기초를 포함,하지만 난 추가 할 것입니다 :

로드시 동적 링크는 일반적으로 수행됩니다 정적으로 자동으로 문자로 런타임 링크를 확립하기위한 코드를 포함하는 .lib 또는 .a 파일에 응용 프로그램을 연결하여 프로그램 시작시 .dll 또는 .so 파일에 있습니다. 이는 일반적으로 고정 기능 (예 : C 런타임 라이브러리 등)을위한 것으로, 프로그램에서 실행 파일 크기를 작게 유지하면서 라이브러리에서 버그 수정의 이점을 누릴 수 있습니다 (일반적인 코드를 단일 라이브러리로 분해).

런타임 연결은 플러그인로드와 같은보다 동적 인 기능을 위해 사용됩니다. Aiden이 말했듯이, LoadLibrary() 또는 이와 동등한 것을 사용하면 런타임에 프로그램에 모듈을 적극적으로 첨부 할 수 있습니다. 플러그인 DLL을 포함하는 디렉토리를 조사하고 각각을 차례로로드하고 자체 개발 한 플러그인 API로 대화를 나누십시오. 그렇게함으로써 프로그램은 앱이 컴파일/링크 될 때 존재하지도 않은 모듈을로드 할 수 있으므로 배포 후에 유기적으로 성장할 수 있습니다.

근본적으로 두 가지 방법 모두 LoadLibrary() API를 호출하지만 결국 전자의 경우 고정 된 기호 및 라이브러리 집합과 후자의 경우 동적 집합을 사용합니다.

+2

+1입니다. 모듈 형 아키텍처가 멋지다. –

+2

.Net 실행 파일에 대한 추가 정보 : 런타임 동적 연결을 사용합니다. "Dependency Walker"에서 .Net DLL을 열면 MSCOREE.DLL과 함께로드 타임 동적 연결 만 볼 수 있습니다. 이것에 관한 더 많은 정보는 다음과 같습니다 : http://stackoverflow.com/questions/9545603/is-mscorlib-dll-mscoree-dll-loaded-when-net-application-runs DLL을 참조하고 사용하지는 않지만 DLL이 누락되면 앱에 오류가 발생하지 않습니다. Debug> Windows> Modules에서 현재로드 된 DLL을 볼 수 있습니다. –

9

질문을받은 지 오래되었습니다. 그리고 Aiden과 Drew의 대답은 대부분의 본질을 다뤘습니다.프로그래머의 관점에서 몇 가지를 추가하기 만하면됩니다.

로드 타임 동적 연결을 사용하는 경우 LIB 파일에 연결해야합니다. 그리고 코드에서 우리는 평소와 같이 명시 적으로 메소드를 호출 할 수 있습니다. 코드 샘플은 Using Load-Time Dynamic Linking을 참조하십시오.

런타임 동적 연결을 사용하는 경우 DLL로드/해제 및 함수 조회를 직접 관리해야합니다. 코드 샘플은 Using Run-Time Dynamic Linking을 참조하십시오.

2 가지 옵션 중에서 선택하려면 Determining Which Linking Method to Use을 선택하십시오.

로드 타임 동적 연결은 프로그래머의 노력을 저장하는 또 다른 방법 일뿐입니다. 그러나 그것은 약간의 확장 성의 대가를 치러옵니다. 가져 오기 라이브러리로 사용하는 LIB 파일에 해당하는 DLL 만 사용할 수 있습니다.

기본적으로 두 연결 방법 모두 Windows 플랫폼에서 LoadLibrary() API를 사용합니다.

0

로드 타임 동적 연결 실행 파일은 DLL 라이브러리에 연결되어 있으며 런타임 동적 연결에서는 실행 파일이 모든 DLL과 연결되어 있지 않습니다.

응용 프로그램의 시작 성능이 중요 할 때 런타임 동적 연결이 바람직합니다. 개발/성장 혜택은