-
Static Link(정적 링크) Dynamic Link(동적 링크)Operating System 2020. 4. 28. 15:52
소스코드를 컴파일하면 목적 파일이 생성된다. 그런데 이 목적 파일을 실행파일로 만들기 위해서는 링크 단계를 거치게 되는데 이때 라이브러리 함수를 사용했다면 이 라이브러리 파일이 정적 라이브러리 파일인지 동적 라이브러리 파일인지에 따라서 프로그램 동작이 다르다.(라이브러리 파일을 만들 때 정적 라이브러리 파일로 만들면 정적 링크를 해야 되고 동적 라이브러리 파일로 만들면 동적 링크를 해야 한다.)
Static Library(정적 라이브러리) Dynamic Library(동적 라이브러리)
리눅스는 다음과 같은 확장자를 가진다. *.a 정적 라이브러리 파일 *.so 동적 라이브러리 파일 (so: shared object) 윈도우는 다음과 같은 확장자를 가진다. *.lib 정적 라이브러리 파일 *.lib *.dll 동적 라�
johnjarrer.tistory.com
Static Link(정적 링크)
링커는 정적 링크 시 소스코드를 컴파일해서 나온 목적 파일과 정적 라이브러리 파일(*.a or *.lib)을 합쳐 하나의 실행파일을 만든다. 이렇게 나온 실행파일은 라이브러리가 포함되어있어 단독으로 실행이 가능하다. 우리가 어떤 *.exe 파일만을 다운로드하고 설치는 하지 않았지만 실행이 가능한 경우와 비슷하다.??
Dynamic Link(동적 링크)
동적 링크로 만들어진 실행파일과 동적 라이브러리 파일(*.a or *.lib)을 따로 메모리에 올라간다.
동적 링크에는 묵시적 링크와 명시적 링크가 있다.
Implicit Link(묵시적 링크)
링커는 묵시정 링크 시 소스코드를 컴파일해서 나온 목적 파일과 동적 라이브러리의 어떤 함수를 사용하겠다는 정보가 합쳐 하나의 실행파일을 만든다. 그래서 프로그램 실행 시 동적 라이브러리의 어떤 함수를 사용하겠다는 정보로 동적 라이브러리 파일에서 해당 함수를 메모리에 올려 사용한다.
Explicit Link(명시적 링크)
링커는 명시적 링크 시 소스코드를 컴파일해서 나온 목적파일과 동적 라이브러리의 어떤 함수를 사용하겠다는 정보가 없다. 대신 프로그램 동작 시 소스코드에서 사용한 API 함수로 사용하려는 라이브러리 파일이 있는지 검사하고 동적으로 해당 함수를 메모리에 올린다.
요약하면
정적 링크로 만들어진 프로그램은
- 라이브러리를 내리려면 프로그램도 같이 내려야 하고 올리려면 프로그램도 같이 올려야 한다.
- 실행파일에 포함된 라이브러리 함수만 실행 가능하다.
- 동적으로 라이브러리를 올리지 않아 빠르다.
- 하나의 라이브러리를 여러 프로그램이 사용했다면 각 프로그램 마다 똑같은 라이브러리가 포함되어 메모리 자원이 낭비된다.
동적 링크(묵시적 링크)로 만들어진 프로그램은
- 프로그램 실행 시 라이브러리를 올린다.
- 프로그램을 내려도 라이브러리는 메모리에 남아있다.
- 다른 프로그램에서 다른 라이브러리를 참조하여 사용할 수 있다.(공유 라이브러리인 듯?)
- 하나의 라이브러리를 여러 프로그램이 사용했다면 각 프로그램은 같은 라이브러리를 참조하므로 메모리 자원이 낭비되지 않는다.
- 동적 라이브러리 파일을 찾지 못하면 런타임 에러가 뜬다.
- 라이브러리를 실행파일과 따로 올려 동적 링크라 불리긴 하지만 사실 정적 링크랑 비슷하다.
동적 링크(명시적 링크)로 만들어진 프로그램
- 프로그램 동작 중에 라이브러리를 올린다.
- 라이브러리를 따로 내리고 올릴 수 있다.
- 상황에 따라 다른 라이브러리를 사용해야 할 경우 좋다.(선택할 수 있다.)
- 라이브러리가 필요 없으면 내리면 되니까 메모리 자원이 낭비되지 않는다.
- 하나의 라이브러리를 여러 프로그램이 사용했다면 각 프로그램은 같은 라이브러리를 참조하므로 메모리 자원이 낭비되지 않는다.
- 라이브러리를 동적으로 올려야 하기 때문에 느리다.
- API 함수를 사용해야 한다.
- 동적 라이브러리 파일을 못 찾으면 런타임 에러가 뜬다.
- 내가 필요하면 올리고 필요 없으면 내리는 이게 진짜 동적 링크다
틀린 점이 있다면 댓글 부탁드리겠습니다. 감사합니다.
'Operating System' 카테고리의 다른 글
Static Library(정적 라이브러리) Dynamic Library(동적 라이브러리) (0) 2020.09.27 페이징(paging) 세그먼테이션(segmentation) (0) 2020.04.29 11. 타이머와 시간 관리 (0) 2019.12.30 10. 커널 동기화 방법 (0) 2019.12.14