산타는 없다

Lib와 Dll 본문

Computer Science/운영체제

Lib와 Dll

LEDPEAR 2021. 5. 8. 00:13
반응형

일반적으로 실행 파일을 생성할 때 링킹 과정에서 기계어로 번역된 목적 프로그램(오브젝트 파일 / .obj)과 라이브러리를 연결하여 만들게 됩니다. 

하지만 이것은 .lib 즉 정적 라이브러리 파일에 한정된 동작입니다.

만약에 프로그램이 사용하는 라이브러리가 dll이면 라이브러리는 런타임 중에 로드하게 됩니다.


라이브러리는 정적 라이브러리(.lib)와 동적 라이브러리(.dll)로 나눠어집니다.

정적 라이브러리 (Lib)

정적 라이브러리는 소스 코드가 컴파일되어 실행 파일로 만들어 질 때 링크 과정에서 소스 코드가 번역 돼 기계어로 만들어진 목적 프로그램과 연결됩니다.

연결되면서 exe 파일 안에 필요한 Lib의 내용이 복사 됩니다. 이렇게되면 프로그램이 무거워지고 메모리를 많이 차지하게 됩니다.

동적 라이브러리 (Dll)

동적 라이브러리는 정적 라이브러리와 다르게 컴파일시 링크가 되지 않고 런타임시 링크가 됩니다.
때문에 정적 라이브러리를 사용한 프로그램보다 가벼워지고 메모리도 덜 차지하게 됩니다.

이러한 동적 라이브러리는 암시적 링킹과 명시적 링킹이 있습니다.

  • 암시적 링킹 : 실행 파일 자체에서 어떤 dll을 사용할 것지 정보를 포함하고 운영체제가 프로그램 실행 시 해당 함수들을 초기화하여 사용하는 방법
  • 명시적 링킹 : 프로그램이 실행 중일 때 dll 파일이 있는지 검사하고 동적으로 원하는 함수만 불러와서 사용하는 방법

동적 라이브러리는 정적 라이브러리와 다르게 여러 프로그램에서 공유해서 사용할 수 있습니다.
즉 DLL을 사용하려고 할 때 다른 프로그램에 의해서 이미 해당 DLL이 메모리에 로드된 상태라면 이미 로드된 DLL을 참조하여 사용하게 됩니다.
이것은 DLL이 물리 메모리에 한번 올라가면 이 DLL을 참조하는 프로세서가 모두 종료될 때까지 물리 메모리에 존재하는 특성 때문입니다.

여기서 주의해야 할 점은 DLL의 코드만 공유하여 같이 쓸 뿐 DLL 내에서 사용하는 변수같은 데이터는 공유하지 않고 각각 별도의 공간을 이용하여 독립적으로 사용합니다.

링킹된 dll의 함수는 힙 영역에 저장됩니다.

 


참고 - wnsgml972.github.io/setting/2018/11/01/dll_lib/

반응형
Comments