정적 링킹(Static Link), 동적 링킹(Dynamic Link), 그리고 컴파일

2024. 6. 24. 19:06·컴퓨터 공학(Computer Science)

컴파일 과정

프로그래머가 코드를 작성하면 컴파일러는 .exe(실행파일)을 만들어 낸다.

그 과정은 이렇다.

컴파일 과정

  1. 코드 작성 : 프로그래머가 c코드를 작성.
  2. 전처리(Preprocessing) : 전처리기 처리
  3. 컴파일(Complie) : C컴파일러가 작동하여, C코드를 어셈블리어로 변환
  4. 어셈블(Assembling) : 어셈블러가 .obj(목적파일)을 생성
  5. 링킹(Linking) : 링커가 라이브러리의 .obj(목적파일)을 다른 .obj파일과 결합해 실행파일 생성

여기서 볼 구간은 링킹구간이다.

예를 들어, 다음과 같은 간단한 C코드가 있다고 가정해보자.

#include <stdio.h>

int main(void)
{
    printf("hello world!\n");
    return 0;
}

이 코드에서 stdio.h라는 헤더 파일을 전처리 한다(헤더파일을 현재 파일에 포함시킴).

main.obj파일이 생성되고, 표준라이브러리 파일에 있는 printf.obj파일(printf의 실제 구현)을 main.obj과 결합한다.

이 과정이 끝나면 실행파일(.exe)가 만들어진다.

※주의 : 라이브러리는 코드가 아니다

많은 사람들이 라이브러리를 코드의 집합이라고 생각하지만, 이는 정확하지 않다.

라이브러리는 코드가 아닌, .obj파일들의 집합체이다.

헤더파일에는 이러한 라이브러리 함수의 함수 원형이 적혀있다.


동적 링크 라이브러리(Dynamic Link Library)와 정적 링크 라이브러리(Static Link Library)

라이브러리에는 동적 링크 라이브러리와 정적 링크 라이브러리가 있다.

동적 링크 라이브러리

※프로그램 실행시 필요할 때 외부에서 라이브러리를 가져오는 방식

 

즉, 컴파일 시점에 라이브러리 함수를 실행파일에 복사하지 않고, 함수의 위치 정보를 이용하여 필요 시에 그 함수를 호출한다.

동적 링크 라이브러리는 다음과 같은 장점이 있다.

  • 프로그램 로딩 시간 단축
  • 메모리 절약
  • 함수 수정시에 DLL만 수정

동적 링크 라이브러리는 외부에서 가져오는 라이브러리를 가져오는 방식이기 때문에, 실행하려면 .dll파일이 있어야만 한다.

 

정적 링크 라이브러리

※필요한 함수를 프로그램 코드에 붙여, 프로그램 자체에서 참조

 

위에 제시한 컴파일 과정은 정적 링킹에 해당한다.

링커가 printf.obj파일을 main.obj파일과 결합하는데, 이것은 정적 링크와 같다.

정적 링크 라이브러리는 다음과 같은 장점이 있다.

  • 프로그램 실행 후에 빠른 처리시간을 가진다
  • 프로그램 실행 파일만 있다면 프로그램을 실행 할 수 있다.

참고 : https://medium.com/@dkwok94/the-linking-process-exposed-static-vs-dynamic-libraries-977e92139b5f

'컴퓨터 공학(Computer Science)' 카테고리의 다른 글

책 - 그래서 컴퓨터는 어떻게 동작하나요? 후기  (3) 2023.06.19
버퍼(Buffer)란?  (0) 2023.04.17
32비트 컴퓨터, 64비트 컴퓨터란?  (6) 2023.04.09
'컴퓨터 공학(Computer Science)' 카테고리의 다른 글
  • 책 - 그래서 컴퓨터는 어떻게 동작하나요? 후기
  • 버퍼(Buffer)란?
  • 32비트 컴퓨터, 64비트 컴퓨터란?
Jminu
Jminu
  • Jminu
    뇌 구조가 바이너리
    Jminu
  • 전체
    오늘
    어제
    • 분류 전체보기
      • C프로그래밍
        • 오류해결
        • 개인 공부
        • Programming Lab(학교수업)
        • MemoryTracker
      • C++
        • 개인 공부
      • 자료구조(Data Structure)
      • ARM arch
        • Cortex-M
      • 컴퓨터 공학(Computer Science)
        • OS
        • 컴퓨터 구조
      • Web
      • Linux
      • 똥글
      • 백준
      • Git 학습
        • 오류해결
        • 학습중
      • Python
        • 오류해결
        • 개인 공부
      • Qualcomm 기업과제
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    C++
    소수
    Qualcomm
    파이썬
    피보나치
    thumb2
    Git
    파일 입출력
    rubikpi3
    자료구조
    rubikpi
    ptrace
    백준
    c언어
    권머현
    arm
    aapcs
    커널
    yolo
    과속탐지
    commit
    순환
    동적메모리
    포인터
    INIT
    rubik pi
    Branch
    스택
    버퍼
    이진 트리
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Jminu
정적 링킹(Static Link), 동적 링킹(Dynamic Link), 그리고 컴파일
상단으로

티스토리툴바