본문 바로가기
자동차 임베디드 SW/잡

dll (다이나믹 링킹 라이브러리) 개념

by 존버매니아.임베디드 개발자 2021. 11. 14.
반응형

앞에서 빌드의 개념을 설명할 때. 라이브러리 파일도 링킹 단계에서 함께 링크되어야한다고 했다.
근데 다이나믹 링킹이 뭐냐면 exe 파일을 만드는 단계에서 라이브러리 파일을 링크하는게 아니라
exe 파일이 실행되서 해당 라이브러리를 런타임에 실제로 '호출'할 때 가져다 쓰겠다는 소리이다.

무슨말이냐면
test1.c - > test1.exe
test2.c -> test2.exe
두개의 서로 다른 exe 파일을 만드는 상황.
이때 두개의 파일은 모두 printf 라는 라이브러리를 사용한다.

printf를 사용하기 위해서는 링크단계에서 해당 라이브러리가 함께 링크되야한다.
그래서 test1.exe와 test2.exe는 내부에 각각 printf 라이브러리를 갖게 된다.
이때 한 컴퓨터에서 test1.exe와 test2.exe를 실행시키면 두개의 서로 다른 프로그램은 서로 다른 메모리 영역을 할당 받을 것이다.
이때 printf 는 test1에도 있고 test2에도 있기 때문에 printf 라이브러리에 해당하는 내용은 같은 내용인데도 불구하고 두개의 메모리영역에 할당된다. 이것은 메모리가 낭비라고 생각될 수 있다.

이러한 메모리 낭비를 줄이고자 나온 컨셉이 dll이다.
test1.c에서 test1.exe 파일을 만들때, printf 라이브러리를 링킹단계에서 함께 링크하지않고, test1.exe가 실행될때(런타임에) 그때 메모리에 올라가있는 printf 를 찾아서 실행시키겠다는 소리다.
따라서, dll을 포함하고 있는 exe 파일은 일종의 불완전한 exe 파일이라고 할 수 있다.

test1.exe의 코드는 아마도 이런식으로 쓰여있을것이다.
call printf(dll)
오브젝트 파일에 대한 설명에서 말했듯이 실행가능한 파일은 이런식으로 쓰여있으면 안된다.
printf(dll)이 아니라 printf 함수가 실제로 위치하는 메모리 주소가 쓰여있어야한다.

하지만 dll을 사용하는 경우에는 저런식으로 만들어도 허용을 하는것이다.
test1.exe가 실행되다가 만약 printf를 만나는 일이 생기면 메모리 어딘가에 올라가 있는 printf를 찾아서 그쪽으로 pc(program counter)를 옮겨서 실행하겠다는 소리다.

이렇게하면 test1.exe 파일 입장에서는 test1.exe를 만들때 굳이 print 라이브러리를 같이 링크하지않기 때문에 그만큼 용량을 아끼게 된다.
마찬가지로 test2.exe도 printf 라이브러리를 링크하지않기 때문에 그만큼 용량이 작아진다.

대신 , 중요한 것은 test1.exe와 test2.exe가 실행될때 메모리 어딘가에는 printf 라이브러리가 올라가있어야한다. 그렇지않으면 런타임 중에 에러가 발생할 것이다.
만약 test1.exe 를 실행시킨 컴퓨터에 print 라이브러리가 없고 실행이 안되어있다면 test1.exe가 런타임에 printf 를 호출하면 dll이 없다고 에러가 날 것이다.

반응형