DLL 및 LIB 파일-무엇과 왜?


214

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


답변:


298

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

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

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

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


81
밝혀 .LIB파일은 정적 (오브젝트 파일을 포함) 라이브러리 또는 수입 라이브러리 (DLL을 링크로 링커를 허용하는 문자 포함)이 될 수 있습니다. 왜 그런지 궁금합니다.
Lumi

2
좋은 설명! 코드가 공유되고 Dll을 소비하는 응용 프로그램간에 데이터가 공유되지 않습니다 (기본값).
mox

4
@ 루미 : 좋은 지적입니다. DLL 측면에서 두 가지 유형의 연결이 있습니다. DLL 생성자가 적절한 헤더와 함께 제공 한 파일 이있을 때 암시 적 링크.lib ; 이것은 .lib단순히 대상 DLL의 설명자이며 주소, 진입 점 등을 포함하지만 코드는 없습니다. 이것은 .lib링커에 전달해야합니다. 두 번째 는 DLL을 함수 와 함께 수동으로로드하여 DLL을 사용할 때 명시 적 연결LoadLibrary 입니다. 이 형식에서는 해당 .lib파일이 필요하지 않지만 DLL 내보내기와 해당 주소를 찾고 포인터를 통해 이러한 함수를 호출하기 위해 약간의 노력을 기울여야합니다.
itachi

37

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


보안 측면은 나에게 새로운 것이었다. 관리되지 않는 네이티브 C ++ dll을 호출하는 C # 앱의 경우 위의 추론이 적용됩니까?
Martin

1
그러나 LIB도 격리되어 있지 않습니까? 따라서 공격자는 간단히 LIB를 분석 할 수 있습니다. 아니면 일반인이 LIB에 액세스 할 수없는 것이 일반적인 시나리오입니까?
Nick Russler

8
컴파일러 프로세스에 관한 한 LIB도 "절연"되지만, 일단 링커가 일단 부품을 결합하면 LIB는 EXE의 일부이므로 사용자의 코드와 구별 할 수 없습니다.
mox

17

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


7

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

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

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


4

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

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.