윈도우상에서 sw를 사용할 때 이런 경험이 있을것이다.
sw를 실행했더니 xxx.dll 파일이 없어서 실행못합니다. 이런 형태의 에러가 발생하며 실행되지 않는 경우.
또는 sw를 실행해서 잘 동작하고있었는데 특정 기능을 실행했더니 갑자기 xxx.dll 파일이 없다고하면서 에러가나고 sw가 꺼지는 경우
그래서 이런 문제가 있을때 구글이나 네이버에 검색해보면 xxx.dll 파일을 다운받으라고 한다.
dll 파일이 뭘까?
우리가 sw 코드를 구현 할 때, 우리가 구현하지않은 남이 이미 만들어놓은 라이브러리 등을 사용하는 경우가 있다.
예를 들어 printf 함수 같은 것들이다.
링킹과정에서 이러한 라이브러리 파일들도 함께 링킹이되서 하나의 sw가 완성된다고 하였다.
그런데, 만약 서로다른 sw인 sw1, sw2, sw3 3개의 sw가 모두 printf 함수를 사용한다고 해보자.
그러면 sw1. sw2. sw3 모두 printf 함수의 기계어 코드를 갖게 된다.
그리고 sw1.2.3을 우리가 동시에 실행시켜서 사용하면 printf 를 위한 똑같은 기계어 코드가
각각의 sw를 위해서 서로다른 메모리공간에 중복해서 올라가게된다. 이는 메모리의 낭비이다.
따라서, 이런 경우 링킹을 할 때
라이브러리 파일을 링커가 가져와서 printf 함수에 메모리주소를 직접 할당하는 작업을 하지않고,
printf함수는 내 exe 파일 안에는 없고 나중에 run time에 다른 메모리 공간에 올려놓고(로드해서) 쓸거라고 표시를 남겨놓게된다.
어찌보면 이것은 약간 불완전한 코드라고 생각할 수도 있긴하다.
암튼 이러한 .exe 파일을 우리가 실행하면 로더에 의해서 sw가 메모리로 복사되어 코드가 실행되는데, 이때 로더가 로딩을 할 때
printf 함수 부분을 메모리의 특정 위치에 함께 올린다.
이제 우리 sw가 실행을 하다가 printf 를 만나면.아까 링킹 할 때 printf 주소를 적어두지않았지만 run time에 적을거라고 했다.
그래서 printf를 만나면 메모리를 뒤져서 printf가 어디올라가있나를 보고. 그 주소로점프해서 printf를 실행하는 것이다.
이때 이런식으로 사용되는 printf를 dll파일
(다이나믹 링크 라이브러리) 라 부른다
한편, 이런식으로 sw를 사용하면
sw1. sw2. sw3은 각자 printf 함수를 가질 필요 없고 실행될때 printf 를 별도의 메모리 공간에 올려놓고 sw1.2.3 모두 이 위치로 접근해서 printf를 호출해서 쓰면 된다.
다시 처음으로 돌아와서. sw가 실행되다가 dll파일 없다고 에러나는건 무슨 의미일까? 바로
위와 같은 예시에서 printf 함수를 메모리에 써놓지않은 상황을 말한다.
sw1.2.3은 printf를 사용하는 sw이지만 링킹을 할 때 라이브러리 파일을 직접 가져오지는 않고, 나중에 런타임에 메모리를 찾아서 쓰겠다고 적어둔 일종의 불완전 코드였다.
따라서. sw가 처음에는 정상동작하다가 print를 부를 상황이 생기면 메모리를 뒤져서 printf 찾아서 그쪽으로 점프해야되는데 printf가 아직 메모리에 올라와있지않다면 그게 없어서 dll에러가 발생하는것이다.
그래서 이럴 때 dll 파일을 다운받으면 이제 dll 파일이 생겼으니까
sw 1 2 3이 실행될때 dll파일을 메모리 어딘가에 쓰게되고. sw 1 2 3이 코드실행하다가 해당영역이 필요하면 그쪽으로 점프해서 코드를 수행하게 된다.
이것이 dll이다.
'컴퓨터공학' 카테고리의 다른 글
가상메모리.페이지2 (0) | 2020.08.31 |
---|---|
로더.가상메모리.페이지.세그멘테이션 (0) | 2020.08.31 |
로더 (0) | 2020.08.30 |
컴파일.어셈블.링커(빌드) (0) | 2020.08.30 |