bunta의 보조기억장치

[3주차 TIL] KnockOn Bootcamp 링커 본문

KnockOn Bootcamp

[3주차 TIL] KnockOn Bootcamp 링커

bunta 2025. 4. 19. 18:16
반응형

💡 링커(Linker)란?

여러 개의 오브젝트 파일을 하나의 실행 파일로 연결해주는 프로그램을 말한다.

코드를 컴파일 했을 때 목적 파일이 생성되는데 이 때 이 목적 파일만으로는 프로그램을 실행할 수 없으므로 여러 개의 목적 파일들 사이의 함수 참조나 변수 참조를 연결해주는 것이 링커의 역할이다.


🔎 동적 링킹(Dynamic Linking)

프로그램 실행 시점에 필요한 라이브러리를 따로 불러오는 방식

 

✅ 장점

1. 파일 크기 감소

    - 여러 프로그램이 같은 라이브러리를 공유하므로 실행 파일 크기가 작아짐

 

2. 메모리 사용 효율성

    - 운영체제는 하나의 라이브러리를 여러 프로세스에서 공유하기 때문에 메모리 절약이 가능

 

3. 업데이트 용이

    - 라이브러리 하나만 교체하면 모든 프로그램이 자동으로 최신 버전으로 패치 반영이 가능

 

4. 배포 용이

    - 프로그램을 배포할 때 이미 시스템에 있는 표준 라이브러리를 활용하여 필요한 파일만 배포하면 됨

 

❌ 단점

1. 의존성 문제

    - 라이브러리 버전이 맞지 않거나 누락되면 프로그램 실행이 안될 수 있음

 

2. 버전 불일치로 인한 오류

    - 라이브러리가 업데이트 되었는데 프로그램이 예전 버전에 의존하고 있을 경우, 예상치 못한 동작이나 충돌이 발생할 수 있음

 

3. 실행 시간에 로딩이 필요

    - 프로그램이 실행되면서 라이브러리를 불러오기 때문에 초기 실행 속도가 정적 링킹보다 느릴 수 있음

 

4. 보안 위험성

    - 악성 코드가 라이브러리 파일을 조작해서 악용하는 경우가 있음

 

 

🔎 정적 링킹(Static Linking)

컴파일 시점에 필요한 모든 라이브러리를 실행 파일에 통합하는 방식

 

✅ 장점

1. 독립성 보장

    - 실행 파일이 모든 필요한 코드와 리소스를 내부에 포함하고 있기 때문에 외부 라이브러리 없이도 바로 실행 가능

 

2. 버전 문제 없음

    - 어떤 버전의 라이브러리를 사용했는지 고정된 상태이기 때문에 다른 시스템에서 라이브러리 버전이 달라도 이상 없음

 

3. 예측 가능한 실행 환경

    - 항상 동일한 코드와 상태로 실행되므로 디버깅이나 테스트가 용이함

 

4. 실행 속도가 약간 빠름

    - 실행 시점에 외부 라이브러리를 로딩할 필요가 없어 초기 실행 속도가 동적 링킹보다 빠름

 

❌ 단점

1. 파일 크기 증가

    - 모든 코드가 한 파일에 포함되어야 하므로 실행 파일이 크고 무거워짐

 

2. 메모리 낭비

    - 동일한 라이브러리가 여러 프로그램에 중복으로 포함될 수 있어 메모리 사용량이 증가할 수 있음

 

3. 업데이트 어려움

    - 보안 패치나 기능 수정이 필요한 경우 전체 프로그램을 다시 컴파일하여 배포해야 함

 

4. 재사용성 감소

    - 정적으로 링크된 라이브러리는 다른 프로그램과 코드를 공유할 수 없음

 

  정적 링킹 동적 링킹
실행 파일 크기 작음
메모리 사용 비효율적 (라이브러리 중복 포함) 효율적 (라이브러리 공유)
실행 속도 빠름 (즉시 실행) 초기 로딩 필요
배포 간단 (파일 하나로 충분) 라이브러리 동봉 필요
버전 문제 없음 발생할 가능성 있음
업데이트 재컴파일 필요 라이브러리만 교체
보안 / 안정성 안정적 외부 요인에 영향을 받을 가능성 있음

🔎 재배치

각 오브젝트 파일들은 자신의 코드가 메모리의 어떤 부분에 로딩이 될지 모르는 상태이기 때문에 대략적인 주소를 기준으로 기계어를 만든다. 하지만 여러 파일을 합치거나 라이브러리를 넣을 때 서로 주소가 겹치면 안되기 때문에 링커를 통해 주소를 새로 할당하고 코드나 데이터 안에 있는 주소 참조들을 새 주소에 맞게 재배치 해주는 과정을 거친다.


🔎 .dll 파일과 .so 파일

.dll 파일과 .so 파일 모두 동적 라이브러리를 뜻하지만 윈도우에서는 .dll 확장자를, Linux와 Unix 에서는 .so 확장자를 사용한다.

이 파일들은 공통된 기능을 여러 프로그램에서 공유하여 재사용할 수 있도록 해주는 파일이다.

반응형
Comments