정적 링킹 vs 동적 링킹: 차이점 설명

링킹은 컴파일된 코드를 그 코드가 사용하는 라이브러리 코드와 결합하는 과정입니다. 정적 링킹에서는 필요한 라이브러리 코드가 빌드 시점에 실행 파일에 복사되므로 프로그램이 독립적으로 동작합니다. 동적 링킹에서는 실행 파일이 필요한 공유 라이브러리만 기록해 두고, 운영체제가 프로그램 시작 시 이를 로드하므로 여러 프로그램이 하나의 사본을 공유할 수 있습니다. 정적 링킹은 배포가 더 간단하고, 동적 링킹은 메모리를 절약하며 업데이트가 쉽습니다.

비교 항목정적 링킹동적 링킹
수행 시점빌드 시점: 라이브러리 코드가 실행 파일에 복사됨로드 시점 또는 실행 시점: 동적 링커가 공유 라이브러리(.so, .dll)를 찾아 매핑함
실행 파일 크기큼작음
메모리 사용각 프로그램이 라이브러리 코드 사본을 따로 가짐공유 라이브러리 하나를 여러 프로세스가 공유할 수 있음
업데이트와 보안 패치프로그램을 다시 빌드하고 재배포해야 함라이브러리를 한 번만 업데이트하면 재빌드 없이 모든 프로그램이 혜택을 봄(인터페이스가 호환되는 경우)
시작 시간약간 빠름약간 느림: 심볼을 해석해야 함(대개 지연 방식)
배포독립적: 라이브러리가 설치되어 있지 않아도 실행됨대상 시스템에 올바른 버전의 라이브러리가 필요하며, 없으면 프로그램이 시작되지 않음
실행 시간 비용프로그램 전체 최적화와 직접 호출 가능GOT와 PLT를 거치는 간접 호출로 인한 작은 오버헤드
버전 문제실행 시점에는 없음프로그램과 설치된 라이브러리 간 불일치 가능
주요 용도임베디드 펌웨어, 단일 파일 도구, 최소 컨테이너범용 운영체제의 대부분의 프로그램, 플러그인, libc 같은 시스템 라이브러리

수치는 대략적인 자릿수 기준이며, 공정 세대와 제품에 따라 달라져요.

상황별 선택 기준

정적
어디서나 실행되는 독립적인 바이너리가 필요하거나, 임베디드 펌웨어처럼 운영체제 로더가 없을 때.
동적
여러 프로그램이 같은 라이브러리를 공유하며 메모리를 절약하고 라이브러리를 중앙에서 패치하고 싶을 때.

자주 묻는 질문

프로그램이 라이브러리 누락 오류로 실행되지 않는 이유는 무엇인가요?

동적으로 링크된 프로그램인데, 필요한 공유 라이브러리(.so 또는 .dll 파일)가 해당 컴퓨터에 설치되어 있지 않기 때문입니다. 라이브러리를 설치하거나 프로그램을 정적으로 링크하세요.

동적 링킹은 메모리를 절약하나요?

그렇습니다. RAM에 있는 공유 라이브러리 하나를 여러 프로세스가 공유할 수 있습니다.

정적 링킹이 더 빠른가요?

약간 빠릅니다. 시작 시 심볼 해석과 GOT, PLT를 통한 간접 호출을 피할 수 있고, 프로그램 전체 최적화도 가능합니다.

동적 링킹이 보안 업데이트에 유리한 이유는 무엇인가요?

공유 라이브러리를 한 번만 패치하면 그것을 사용하는 모든 프로그램이 재빌드 없이 혜택을 받기 때문입니다.

주요 용어 설명

静的リンク
使うライブラリのコードを実行ファイルの中にコピーして結合する方式。実行環境にライブラリがなくても動くが、ファイルが大きくなり、ライブラリの修正は作り直さないと反映されない。
動的リンク
実行時に共有ライブラリを読み込んで結びつける方式。ライブラリをプロセス間で共有でき、差し替えで修正が反映されるが、実行環境に合うライブラリが必要。
共有ライブラリ
動的リンクで実行時に読み込まれるライブラリ。Linuxでは.so、Windowsでは.dll。位置独立コードで作られ、コードのページを多くのプロセスで共有できる。
静的ライブラリ
多くのオブジェクトファイルを1つにまとめたアーカイブ(Linuxでは.a)。静的リンクのとき、リンカは必要なオブジェクトだけを取り出して実行ファイルに組み込む。

관련 비교