[CSAPP 7장 완전 정복] 7.10~7.11 정적 링크 vs 동적 링크, 라이브러리 연결의 두 방식

2025. 4. 18. 13:09·크래프톤 정글/컴퓨터구조(CSAPP)

정적 링크 vs 동적 링크, 라이브러리 연결의 두 방식

링커는 여러 개의 목적 파일을 하나로 묶을 수 있는데요. 그런데 그 대상이 정적 라이브러리(.a)인지, 동적 라이브러리(.so)인지에 따라 링크 시점과 실행 시점, 파일 크기, 유연성까지 모두 달라지게 됩니다.

 

이번 글에서는 CSAPP 7.10~7.11절 내용을 바탕으로 정적 링크와 동적 링크의 차이점과 작동 방식을 명확하게 정리해 보겠습니다.

 

 

7.10 정적 라이브러리(.a)와 정적 링크

정적 라이브러리는 여러 개의 오브젝트 파일(.o)을 아카이브(archive) 형태로 묶은 것으로, 확장자는 .a를 사용합니다. 링커는 이 .a 라이브러리를 참조할 때, 필요한 .o 파일만 골라서 실행 파일에 포함시킵니다.

 

필요한 목적 파일을 모아 정적 라이브러리를 생성하고, 실행 파일에 연결하는 명령어는 다음과 같습니다.

ar rcs libfoo.a foo.o bar.o     # 정적 라이브러리 생성
gcc main.o -L. -lfoo -o prog    # main.o에 libfoo.a 링크

 

정적 링크의 특징

항목 내용
링크 시점 컴파일할 때 (실행 파일 생성 시)
실행 파일 크기 큼 (라이브러리 코드가 포함됨)
실행 속도 빠름 (모든 코드가 포함되어 있음)
유연성 낮음 (라이브러리 업데이트 반영이 어려움)
의존성 없음 (단독 실행 가능)

아카이브 내부의 심볼 목록은 nm 라이브러리명.a 명령어로 확인이 가능합니다.

 

 

7.11 동적 라이브러리(.so)와 동적 링크

동적 라이브러리는 실행 시점에 링커가 연결하는 공유 라이브러리(shared object) 파일로, 확장자는 .so입니다. 실행파일에는 .so 파일의 전체 코드가 포함되지 않고, 필요한 심볼만 기록되어 있다가 실행 시점에 .so 파일에서 필요한 코드가 로딩됩니다.

 

필요한 목적 파일을 모아 동적 라이브러리를 생성하고, 실행 파일에 연결하는 명령어는 다음과 같습니다.

gcc -shared -fPIC -o libfoo.so foo.o      # 동적 라이브러리 생성
gcc main.o -L. -lfoo -o prog              # 링크 시 동적 연결 (기본 gcc 옵션)

 

동적 링크의 특징

항목 내용
링크 시점 실행 시간(runtime)
실행 파일 크기 작음 (코드가 직접 포함되지 않음)
실행 속도 첫 호출 시에만 다소 느릴 수 있음
유연성 높음 (.so 파일만 교체하면 됨)
의존성 있음 (.so 가 없으면 실행 불가)

실행 파일이 참조하는 공유 라이브러리 목록은 ldd 프로그램명 명령어를 통해 확인할 수 있습니다.

 

동적 링크의 내부 작동 방식

실행파일이 동적 라이브러리(.so)를 참조할 때, 실행 파일에는 실제 코드가 포함되지 않고, 필요한 심볼 정보만 포함됩니다. 실행 시 OS는 실행파일 내부의 .interp 섹션에 정의된 동적 링커(/lib64/ld-linux-x86-64.so.2 등)를 먼저 호출합니다.

동적 링커는 .so 파일을 메모리에 적재하고, 각 함수/변수 참조에 대해 재배치를 수행한 후 프로그램의 엔트리 포인트로 점프하게 됩니다.

 

실행 중 동적 로딩, dlopen()

정적/동적 링크 외에도, 프로그램 실행 중에 동적으로 공유 라이브러리를 불러올 수도 있습니다. 이때는 다음과 같은 API를 사용합니다:

  • dlopen(): 공유 라이브러리를 열고
  • dlsym(): 함수 포인터를 얻고
  • dlclose(): 사용 후 라이브러리를 닫습니다.

이 방식은 플러그인 구조처럼 런타임 확장이 필요한 상황에서 매우 유용합니다.

#include <dlfcn.h>

int main() {
    void *handle = dlopen("./libfoo.so", RTLD_LAZY);
    int (*sum)(int, int) = dlsym(handle, "sum");
    int result = sum(1, 2);
    dlclose(handle);
}

 

정적 링크 vs 동적 링크

정적 링크는 실행파일에 코드가 포함되기 때문에 파일 크기가 크고, 실행이 빠르며 단독 실행이 가능합니다. 반면 동적 링크는 .so 파일을 외부에서 불러오기 때문에 실행파일은 작지만, 런타임에 오류가 발생할 수도 있다는 차이가 있습니다.

 

핵심 요약

  • 정적 링크는 .a 파일에서 필요한 .o만 포함해 실행 파일에 직접 삽입하는 과정이다
  • 동적 링크는 .so 파일을 런타임에 메모리에 로드하여 참조하는 과정이다
  • 실행파일 크기는 정적 > 동적
  • 유연성은 동적 > 정적
  • 성능은 정적이 일정하게 빠르고, 동적은 처음 호출 시 약간 느리지만 이후 동일하게 작동한다
  • 작업 명령어로는 ar, nm ldd, ld 등이 사용된다
저작자표시 비영리 변경금지 (새창열림)

'크래프톤 정글 > 컴퓨터구조(CSAPP)' 카테고리의 다른 글

[CSAPP 7장 완전 정복] 7.13 라이브러리 삽입 완전 이해하기  (0) 2025.04.18
[CSAPP 7장 완전 정복] 7.12 공유 라이브러리의 핵심 기술 - PIC, GOT, PLT  (0) 2025.04.18
[CSAPP 7장 완전 정복] 7.7~7.9 링커의 마지막 퍼즐 - 재배치, 실행 가능 목적 파일, 그리고 로딩  (0) 2025.04.18
[CSAPP 7장 완전 정복] 7.5~7.6 심볼 테이블과 심볼 해석, 링커의 두뇌를 들여다보다  (0) 2025.04.17
[CSAPP 7장 완전 정복] 7.3~7.4 오브젝트 파일과 재배치 가능 오브젝트 파일  (0) 2025.04.17
'크래프톤 정글/컴퓨터구조(CSAPP)' 카테고리의 다른 글
  • [CSAPP 7장 완전 정복] 7.13 라이브러리 삽입 완전 이해하기
  • [CSAPP 7장 완전 정복] 7.12 공유 라이브러리의 핵심 기술 - PIC, GOT, PLT
  • [CSAPP 7장 완전 정복] 7.7~7.9 링커의 마지막 퍼즐 - 재배치, 실행 가능 목적 파일, 그리고 로딩
  • [CSAPP 7장 완전 정복] 7.5~7.6 심볼 테이블과 심볼 해석, 링커의 두뇌를 들여다보다
그냥사람_
그냥사람_
IT 관련 포스팅을 합니다. 크래프톤 정글 8기 정경호
  • 그냥사람_
    그냥코딩
    그냥사람_
  • 전체
    오늘
    어제
    • 글 전체보기 N
      • 크래프톤 정글 N
        • 로드 투 정글(입학시험)
        • CS기초(키워드, 개념정리)
        • 컴퓨터구조(CSAPP)
        • Code 정글(C언어)
        • Equipped in 정글(나만무)
        • 마이 정글(WIL, 에세이) N
      • 자료구조&알고리즘
        • 자료구조
        • 알고리즘
      • 일상
  • 블로그 메뉴

    • 홈
  • 링크

    • Github
  • hELLO· Designed By정상우.v4.10.3
그냥사람_
[CSAPP 7장 완전 정복] 7.10~7.11 정적 링크 vs 동적 링크, 라이브러리 연결의 두 방식
상단으로

티스토리툴바