[dll] DLL 및 LIB 파일-무엇과 왜?

DLL과 LIB에 대해서는 프로그램이 올바르게 실행하는 데 필요한 필수 코드 인 라이브러리가 있다는 것 외에는 거의 알지 못합니다. 그러나 왜 컴파일러가 그것들을 전혀 생성하지 않습니까? 모든 코드를 단일 실행 파일에 포함시키는 것이 더 쉽지 않습니까? 그리고 DLL과 LIB의 차이점은 무엇입니까?



답변

정적 라이브러리 (LIB)와 동적 라이브러리 (DLL)가 있지만 .LIB 파일은 정적 라이브러리 (오브젝트 파일 포함) 또는 가져 오기 라이브러리 (링커가 DLL에 링크 할 수 있도록 기호 포함) 일 수 있습니다.

많은 프로그램에서 사용하려는 코드가있을 수 있으므로 라이브러리가 사용됩니다. 예를 들어 문자열의 문자 수를 계산하는 함수를 작성하면 해당 함수는 많은 프로그램에서 유용합니다. 함수가 올바르게 작동하면 코드를 사용할 때마다 코드를 다시 컴파일 할 필요가 없으므로 해당 함수의 실행 코드를 라이브러리에 넣고 링커에서 컴파일 된 코드를 추출하여 프로그램에 삽입 할 수 있습니다. . 이러한 이유로 정적 라이브러리를 ‘아카이브’라고도합니다.

동적 라이브러리는이 단계를 한 단계 더 발전시킵니다. 각 프로그램에서 공간을 차지하는 라이브러리 함수의 여러 사본을 갖는 것은 낭비 적입니다. 왜 모두 함수의 사본 하나를 공유 할 수 없습니까? 이것이 바로 동적 라이브러리입니다. 라이브러리 코드를 컴파일 할 때 프로그램에 빌드하는 대신 메모리에로드 될 때 프로그램에 맵핑하여 실행할 수 있습니다. 동일한 기능을 사용하는 동시에 실행되는 여러 프로그램은 모두 하나의 사본을 공유하여 메모리를 절약 할 수 있습니다. 실제로 코드를 통과하는 경로에 따라 필요한 경우에만 동적 라이브러리를로드 할 수 있습니다. 인쇄를하지 않는 경우 프린터 루틴이 메모리를 차지하지 않도록주의하십시오. 반면에 이것은 프로그램이 실행되는 모든 머신에 동적 라이브러리의 사본이 설치되어 있어야 함을 의미합니다.

예를 들어, ‘C’로 작성된 거의 모든 프로그램에는 ‘C 런타임 라이브러리’라는 라이브러리의 함수가 필요하지만 모든 함수가 필요한 프로그램은 거의 없습니다. C 런타임은 정적 및 동적 버전으로 제공되므로 특정 요구에 따라 프로그램이 사용하는 버전을 결정할 수 있습니다.


답변

또 다른 측면은 보안 (난독 화)입니다. 기본 응용 프로그램에서 코드 조각을 추출하여 “분리 된”동적 링크 라이브러리에 넣으면 코드가 분리되어 있으므로 공격, 분석 (역 엔지니어링)하기가 더 쉽습니다. 동일한 코드 조각이 LIB 라이브러리에 보관되면 컴파일 된 (연결된) 대상 응용 프로그램의 일부이므로 해당 코드 조각을 나머지 대상 바이너리에서 분리 (분화)하기가 더 어려워집니다.


답변

코드를 실행 파일로 컴파일하는 대신 DLL / LIB를 작성하는 중요한 이유 중 하나는 재사용 및 재배치입니다. 예를 들어 일반적인 Java 또는 .NET 응용 프로그램은 여러 타사 (또는 프레임 워크) 라이브러리를 사용합니다. 타사 코드를 모두 응용 프로그램으로 컴파일하지 않고 미리 작성된 라이브러리에 대해 컴파일하는 것이 훨씬 쉽고 빠릅니다. 코드를 라이브러리로 컴파일하면 클래스를 다른 유형의 응용 프로그램에서 사용할 수 있도록 디자인하는 등 좋은 디자인 방법을 장려 할 수 있습니다.


답변

DLL은 다른 실행 프로그램과 공유되는 기능 라이브러리입니다. windows / system32 디렉토리를 보면 수십 개의 디렉토리를 찾을 수 있습니다. 프로그램이 DLL을 만들 때 응용 프로그램 * .exe 프로그램이 DLL에 선언 된 기호를 확인할 수 있도록 일반적으로 lib 파일도 만듭니다.

.lib는 프로그램에 정적으로 링크 된 함수 라이브러리이며 다른 프로그램과 공유하지 않습니다. * .lib 파일과 연결되는 각 프로그램에는 해당 파일의 모든 코드가 있습니다. C.lib와 연결되는 두 개의 프로그램 A.exe 및 B.exe가있는 경우 각 A와 B에는 모두 C.lib의 코드가 포함됩니다.

DLL과 lib를 만드는 방법은 사용하는 컴파일러에 따라 다릅니다. 각 컴파일러는 다르게 수행합니다.


답변

또 다른 차이점은 성능에 있습니다.

DLL이 런타임에 .exe에 의해로드되면 .exe 및 DLL은 공유 메모리 개념으로 작동하므로 정적 링크에 비해 성능이 상대적으로 낮습니다.

반면에 .lib는 컴파일 타임에 요청하는 모든 프로세스에 정적으로 링크되는 코드입니다. 따라서 .exe는 단일 메모리를 가지므로 프로세스 성능이 향상됩니다.


답변