학사 나부랭이
Operating System - DLL 본문
여태까지 동적 링크 라이브러리, 동적으로 컴파일할 때 필요한 파일이라고 두리뭉실하게 설명했는데, 라이브러리는 다른 프로그램에서 이용하는 함수들을 모아둔 곳이에요. 그러나 DLL은 표준 C 라이브러리 같은 일반 라이브러리의 파일과는 구조나 사용법이 달라요.
Static Linking Library
일반 라이브러리는 소스 코드를 컴파일한 결과로 생성되는 오브젝트 파일을 그대로 모아둔 것이에요. 그리고 링커(Linking 단계에서)가 이 일반 라이브러리 파일 중, 필요한 함수가 포함된 오브젝트 파일을 꺼내서 실행 파일에 결합하는게 정적 링크 방식이에요.
정적 라이브러리르 사용하려면 프로젝트 설정의 Link 옵션에 라이브러리를 추가해주거나 #pragma comment(;ib, "asdf.lib")처럼 #pragma 지시자를 사용하면 돼요.
라이브러리의 동작 코드가 실행 파일 안에 있기에, 추가적인 작업 없이, 독립적으로 라이브러리의 함수를 사용할 수 있어요. 딱 듣기만 해도 실행 파일의 크기가 쓸데없이 커질거 같다는 느낌이 들죠?
예를 들어 종이학 접기 메뉴얼을 100명이 보고 따라해야 한다면 무지성으로 100장 프린트해서 나눠주는거 보단 대자보처럼 중앙에 붙여놓고 여러 명이 볼 수 있도록 하면, 종이 같은 자원을 아낄 수 있겠죠? 이게 동적 링크 라이브러리예요.
Dynamic Linking Library
동적으로 링크해서 사용하는 라이브러리로, 링킹한 후 프로그램 실행 시 DLL도 함께 메모리 공간으로 읽어와 해당 함수가 실행될 때, 호출될 주소 등을 적절하게 바꾸는 것이에요. 그러니까 아예 독립적으로 해당 함수가 필요할 때 DLL을 로드, 필요 없어질 때 해제할 수 있죠.
실행 파일은 DLL에 있는 함수를 Import하고 DLL은 실행 파일에게 해당 함수를 Export 해주죠. 여러 프로그램에서 동시에 사용함으로 실행 파일의 용량을 줄일 수 있지만 사용하려고 하는 함수나 변수를 컴파일러나 링커에게 알려주어야 해요.
Import Address Table
DLL은 항상 같은 메모리 공간에 적재되지는 않아요. 그럼, DLL 안의 함수 주소도 바뀌겠죠? 이 바뀐 함수 주소를 프로그램이 실행될 때, PE 로더가 찾아서 IAT에 기록해요.
EAT
'Dot-Gabi > Operating System' 카테고리의 다른 글
Operating System - Registry (0) | 2021.05.14 |
---|---|
Operating System - Boot loader (0) | 2021.05.14 |
Operating System - Memory management (0) | 2021.04.06 |
Operating System - Compile to execute (0) | 2021.04.06 |
Operating System - Memory (0) | 2021.04.02 |