[CS] Library와 Linking (링킹)

Cookie·2025년 1월 2일
0

ComputerScience

목록 보기
4/9
post-thumbnail

Library

주로 소프트웨어를 개발할 때 컴퓨터 프로그램이 사용하는 비휘발성 자원의 모임으로 간단하게 말하자면 개발을 위해 필요한 기능을 모아놓은 소프트웨어 혹은 프로그래밍에 사용할 수 있게 미리만들져 있는 함수나 변수들의 묶음


Library의 특징

컴파일된 오브젝트 파일 형태로 존재하며 컴파일 과정(링킹 과정)에서 링킹되어 실행가능한 프로그램을 이룸


Library의 장점

  1. 코드의 재사용이 쉬워짐

    • 이미 구현된 기능들을 다시 가져다 쓸 수 있기 때문에 개발시간이 단축됨
  2. 코드의 내용을 숨겨 은닉할 수 있음

  3. 컴파일 시간을 단축할 수 있음

    • 라이브러리는 미리 컴파일되어있어 링킹만하면 바로 사용가능



Library의 종류

정적링킹 방식과 동적링킹 방식에 따라 정적 라이브러리와 동적 라이브러리(=공유 라이브러리)로 나눌 수 있음


정적 링킹(Static Linking)과정에서 링커가 프로그램에 필요로 하는 부분을 lib에서 찾아 실행 파일에 복사하는 방식의 lib

  • 확장자
    windows : *.lib(무조건 정적 lib는 아님)
    Linux : *.a

  • 👍 장점 : 이식성이 좋고 안정적임
    실행 파일이 정적 라이브러리를 복사해서 갖고 있기 때문에 실행할 때 라이브러리가 필요없다. (실행 파일만 있으면 프로그램이 동작함)


  • 👎 단점
    1. 실행 파일이 lib내용을 복사해서 갖고 있기 때문에 lib에
      • 수정사항이 생기면 파일 전체를 다시 컴파일 해야함
      • 실행 파일이 lib를 가지고 있는 만큼 실행 파일 크기가 커짐
    2. 메모리 자원의 낭비
      • 같은 lib를 가진 여러 프로그램이 동시에 실행될 경우 코드의 중복으로 메모리 자원이 낭비됨
      • 정적 라이브러리 전체를 링킹하면서 사용하지 않는 함수나 변수들 까지 전부 프로그램에 포함됨

동적 링킹(Dynamic Linking)과정에서 링커가 라이브러리 내용을 복사하지 않고 해당 내용의 주소만 가지고 있다가 런타임에 실행 파일과 라이브러리가 메모리에서 위치 할 때 해당 주소로 가서 필요한 내용을 가져오는 방식

  • 확장자
    windows : *.dll
    Linux : *.so

  • 👍 장점
    1. 실행파일의 크기가 작아지고, 여러 프로그램이 동적 라이브러리를 메모리에 올려놓고 공유해서 사용하기 때문에 메모리 자원을 효율적으로 사용

    2. 수정사항이 생기면 실행 파일을 새로 컴파일할 필요 없이 동적 라이브러리만 다시 컴파일하여 재배포 하면 됨


  • 👎 단점
    1. 외부 의존도가 높고, 이식성이 낮음
      • 동적 라이브러리가 제대로 링크되어 있지 않거나 버전이 맞지 않는 등의 문제가 생길 수 있음(실행이 안됨)

    2. 약간의 성능 감소
      • 프로그램의 영역에 따라 라이브러리가 저장된 주소로 이동하는 과정이 필요함

동적 라이브러리의 분류

암시적 링킹(Implicit Linking)

어떤 *.dll의 어떤 함수를 호출하겠다는 정보를 포함 시키고 프로그램 실행 시 해당 함수들을 초기화한 후 이용하는 방식

  • 실행파일에 어떤 함수를 사용하겠다는 정보를 포함하기 위해서는 *.lib파일이 필요함
    • 이때 .lib파일은 정적 라이브러리가 아니라 암시적 링킹을 위해 필요한 심볼이 들어있는 .lib파일로 동적 링킹 과정에 꼭 필요함
  • 특징
    • 프로그램을 시작하면서 해당 .dll을 로드하며 .dll 에 정의된 함수를 마치 자신의 함수처럼 호출할 수 있음
    • 프로그램이 실행될 때 *.dll 파일이 로드되므로 실행 시 연결이라고 표현함
  • 장점 : 코드가 간결하여 사용하기 쉬움

명시적 링킹(Explicit Linking)

프로그램이 실행 중일 때 *.dll 파일이 있는지 검사하고 동적으로 원하는 함수만 호출하는 방법

호출할 함수의 포인트를 얻어 함수를 호출

  • 특징
    • 링킹과정에서 .dll의 함수 정보가 필요하지 않기 때문에 .lib파일이 필요없음
    • 사용하지 않는 함수들까지 전부 다 프로그램에 포함할 필요가 없어 자원을 아낄 수 있음
    • 프로그램이 실행 중에 *.dll 파일이 메모리에 읽히므로 실행 중 연결이라고 표현함

라이브러리를 링크하는 방법에 따라 정적 링킹(Static Linking)과 동적 링킹(Dynamic Linking)으로 나눔




링커의 역할


심볼 해석(Symbol Resolution)

각 오브젝트 파일에 있는 심볼 참조를 어떤 심볼정의에 연관시킬지 결정하는 과정

여러 개의 오브젝트 파일에 같은 이름의 함수 또는 변수가 정의되어 있을 때 어떤 파일의 어떤 함수를 사용할지 결정



재배치(Relocation)

오브젝트 파일에 있는 데이터의 주소나 코드의 메모리 참조 주소를 알맞게 배치하는 과정

  • 각 오브젝트 파일에 있는 데이터의 주소나 코드의 메모리 참조 주소가 링커에 의해 합쳐진 실행 파일에서의 주소와 다르기 때문에 그것을 알맞게 수정해야함

  • 오브젝트 파일 포맷의 재배치 정보 섹션에서 링커에게 오브젝트 파일을 만들때 어떻게 재배치 해야하는지 방법을 알려줌

여러 개의 오브젝트 파일들을 하나의 실행 파일로 묶을 때 필요한 정보를 효율적으로 파악할 수 있는 구조

profile
나만의 공부 일지... [임시 休]

0개의 댓글