kwan's note

[링커] 정적 링킹과 동적 링킹 본문

Computer Programming/c++ programming

[링커] 정적 링킹과 동적 링킹

kwan's note 2022. 3. 30. 01:07
반응형

정적 링킹과 동적 링킹

 

코드를 컴파일 한 오브젝트 파일이 미리 만들어놓은 혹은 외부에서 구현한 함수등이 존재하는 라이브러리에 접근하기 위해서는 링킹을 진행해야 합니다.

 

즉, 외부 라이브러리를 참조하는 실행파일을 만들기 위해서는 다른 프로그램또는 라이브러리를 가져오는 과정인 링킹이 필요합니다.

 

이러한 링킹에는 두종류가 있는데 하나는 정적 라이브러리를 통해 진행되는 static linking이고

다른 하나는 동적 라이브러리를 통해 진행되는 dynamic linking입니다.

 

정적 링킹

정적 라이브러리와 링크하는것을 정적링킹이라고 합니다.

만든 오브젝트 파일에서 정적라이브러리의 함수를 오브젝트 파일에 추가하여 실행파일을 만들게 됩니다.

실행파일에 정적라이브러리를 넣기 때문에 실행파일의 크기가 커지고 메모리를 더 많이사용할 수 있습니다.

장점으로는 일반적인 링커는 링킹도중 최적화를 진행하므로 실행 속도가 빨라지게 됩니다.

다만, 동적라이브러리만 바꿀 수 없으므로 라이브러리 소스코드가 바뀔때마다 매번 실행파일을 재배포 해야합니다. 예를들어 동적라이브러리는 세대별로 다른 라이브러리 파일을 만들어 사용할 수 있는데 정적 라이브러리는 이러한 방식이 불가능합니다.

 

일반적으로 윈도우의 vs에서는 .lib 확장자의 파일입니다.

동적 링킹

 

동적 라이브러리와 링크하는것을 동적링킹이라고 합니다.

 

정적 라이브러리와 다르게 동적라이브러리는 실행파일의 실행도중 링킹이 발생합니다.

실행파일이 작동하는 동안 링킹을 진행하므로 실행파일의 크기가 작아지고 여러 실행파일들이 동일한 동적 라이브러리를 공유하므로 메모리를 더 적게  사용할 수 있습니다.

 

다만, 동적라이브러리를 사용하는 프로그램은 동적라이브러리 파일도 같이 배포해야 합니다.

따라서 여러 실행파일이 같은 이름의 다른 버전의 동적라이브러리를 사용한다면 문제가 발생할 수 있습니다. 

 

예를들어, 어떠한 동적라이브러리 a가 0.9버전에서는 simpleadd를 소수 둘째자리까지 더하도록 구현했는데 라이브러리의 개발자가 이러한 구현이 불편하다고 생각하여 1.0버전에서는 simpleadd를 소수 넷째짜리까지 더하도록 변경했다고 해봅시다.

이때 0.9버전의 a를 이용하던 응용프로그램은 소수 둘째짜리 까지 더해야 정상적으로 동작하는 프로그램을 배포했고 전혀 다른 회사의 응용프로그램 b는 1.0버전의 a를 사용하여 소수 넷째짜리까지 더해야 동작하는 프로그램을 배포했다면

a를 동일하게 같은 이름의 라이브러리(예를들면 a.dll)로 사용한다면 두 응용프로그램중 하나에서는 반드시 오류가 날 것입니다.

 

또다른 단점으로는 라이브러리 안에 있는 함수 주소가 동적으로 링킹되므로 이를 이용해 dll파일을 덮어쓰게 되면 해킹이 가능하게 된다.

 

일반적으로 윈도우에서는 .dll 확장자의 파일입니다.

반응형