라이브러리, 실행 파일

김석·2023년 6월 2일
0

Computer Architecture

목록 보기
2/2

1. 라이브러리

  • 소프트웨어 개발에서 자주 쓰고, 기초적인 함수들을 중복 개발하는 것을 피하기 위해 표준화된 함수 및 데이터 타입을 만들어서 모아 놓은 것.
  • 미리 컴파일된 오브젝트 파일 형태로 존재하며, 컴파일 과정(링킹 과정)에서 링킹되어 실행 가능한 프로그램이 됨.
  • 라이브러리는 미리 컴파일되어 있어 링킹만 하면 바로 사용이 가능하기 때문에, 컴파일 시간을 단축시킴.
  • 코드를 컴파일하므로 기술 유출을 방지할 수 있음.
  • #include 지시문을 통해 헤더 파일을 삽입하는 이유는, 링커가 최종 실행 파일을 생성하기 위해 모든 함수의 심볼을 필요로 하는데, 헤더 파일이 심볼을 생성하는 역할을 하기 때문.
  • 라이브러리는 정적 링킹 방식과 동적 링킹 방식에 따라, 정적 라이브러리와 동적 라이브러리(공유 라이브러리)로 나눌 수 있음.

2. 정적 라이브러리

  • Static Link Library
  • 정적 링킹 과정에서 링커가 프로그램에 필요로 하는 부분을 라이브러리에서 찾아, 실행 파일에 복사하는 방식.
  • 정적 라이브러리 확장자는 윈도우 환경에서 *.lib, 리눅스 환경에서 *.a이다.
  • 하지만 *.lib라고 무조건 정적 라이브러리는 아님.

2-1. 장점

  • 실행 파일에 정적 라이브러리를 복사해서 가지고 있으므로, 실행할 때 라이브러리가 따로 필요 없음.
  • 실행 파일만 있으면 프로그램이 동작하기 때문에 이식성이 좋고 안정적임.

2-2. 단점

  • 실행 파일이 라이브러리 내용을 복사해서 가지고 있음. 따라서 라이브러리에서 수정할 부분이 있으면 파일 전체를 다시 컴파일해서 재배포 해야함.
  • 실행 파일이 라이브러리를 가지고 있는 만큼 실행 파일의 크기가 커짐.
  • 같은 라이브러리를 가진 여러 프로그램이 동시에 실행될 경우, 코드가 중복되어 메모리 자원을 낭비함.
  • 정적 라이브러리 전체를 링킹하면서 사용하지 않는 함수들까지 전부 다 프로그램에 포함함.
  • 이러한 단점을 해결하기 위해 동적 라이브러리가 존재.

3. 동적 라이브러리

  • Dinamic Link Library
  • 동적 링킹 과정에서 링커가 라이브러리 내용을 복사하지 않고, 해당 내용의 주소만 가지고 있다가, 런타임에 실행 파일과 라이브러리가 메모리에 위치할 때 해당 주소로 가서 필요한 내용을 가져오는 방식.
  • 동적 라이브러리 확장자는 윈도우 환경에서 *.dll, 리눅스 환경에서 *.so이다.

3-1. 장점

  • 실행 파일의 크기가 작음.
  • 여러 프로그램이 동적 라이브러리를 메모리에 올려놓고 공유해서 사용하기 때문에, 메모리 자원을 효율적으로 사용할 수 있음.
  • 라이브러리에서 수정할 부분이 있으면 실행 파일을 새로 컴파일할 필요 없이, 동적 라이브러리만 다시 컴파일해서 재배포하면 됨.

3-2. 단점

  • 동적 라이브러리를 사용하는 실행 파일은 실행할 때 동적 라이브러리가 필요함. 라이브러리가 제대로 링크되어 있지 않거나 버전이 맞지 않으면 실행이 안 될 수 있다.
    -즉, 외부 의존도가 생기며 이식성이 낮다.
  • 매번 프로그램 영역에서 라이브러리가 저장된 주소로 이동하는 과정이 필요하기 때문에 약간의 성능 감소를 감수해야 한다.

4. DLL(동적 라이브러리의 분류)

  • 윈도우에서, 실행 파일에서 동적 라이브러리인 *.dll 함수를 호출하는 방법에 따라, 암시적 링킹과 명시적 링킹으로 나눌 수 있음.

4-1. 암시적 링킹

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

4-2. 명시적 링킹

  • Explicit Linking
  • 프로그램이 실행 중일 때, dll 파일이 있는지 검사하고, 동적으로 원하는 함수만 호출하는 방법.
  • 정확하게는 호출할 함수의 포인터를 얻어 함수를 호출하는 방법.
  • 링킹 과정에서 dll의 함수 정보가 필요하지 않기 때문에, lib 파일이 필요 없음.
  • 코드를 통해 원하는 함수만 불러오기 때문에, 사용하지 않는 함수는 프로그램에 포함되지 않기 때문에 자원을 아낄 수 있음.
  • 프로그램 실행 중에 dll 파일이 메모리에 읽히므로 실행 중 연결이라고 표현.

5. 라이브러리와 실행 파일

  • 실행 파일은 독립적으로 실행되는 컴파일된 파일.
  • 실행 파일은 컴파일러에 의해 해당 운영체제와 CPU 아키텍처에 맞게 컴파일됨.
  • 라이브러리는 컴파일 되어 있지만, 자체적으로 실행되지 않고, 다른 프로그램의 런타임에 로드되어 사용됨.
  • 리눅스에서는 실행 파일과 동적 라이브러리 파일 모두 ELF(Executable and Linkable Format) 형식이며, 윈도우에서는 실행 파일과 동적 라이브러리 파일 모두 PE(Portable Executable) 형식임.
  • arm CPU 기반 아키텍처인 Linux 환경과, x86 CPU 기반 아키텍처인 Linux 환경에서 같은 소스코드를 컴파일하여 실행 파일을 생성하면, 해당 실행 파일은 PE 포멧임.
  • 하지만 CPU 아키텍처가 달라서 ISA가 다르기 때문에, 생성된 두 PE 파일의 내부는 다름.

출처

https://bumday.tistory.com/65
https://bradbury.tistory.com/224

profile
handsome

0개의 댓글