맨위로가기

런타임 라이브러리

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

런타임 라이브러리는 프로그래밍 언어의 기능을 지원하며, 컴파일러에 의해 자동으로 링크되는 라이브러리이다. C++과 같은 언어에서 예외 처리, 메모리 할당 등과 같은 기능을 런타임 라이브러리 함수에 의존한다. 런타임 라이브러리는 디버깅 및 릴리스 용도에 따라 여러 버전이 존재하며, 링커는 컴파일 옵션에 따라 적절한 라이브러리를 선택한다. 런타임 라이브러리는 제거하거나, 재배포 시 주의가 필요하며, 특히 동적 링크된 경우 런타임 라이브러리 부재 시 프로그램 실행에 문제가 발생할 수 있다. glibc, msvcrt, Bionic libc 등이 런타임 라이브러리의 예시이다.

더 읽어볼만한 페이지

  • 런타임 시스템 - 디노 (소프트웨어)
    Deno는 Node.js의 대안으로 라이언 달이 개발한 JavaScript 및 TypeScript 런타임 환경으로, 보안 강화, 의존성 관리 단순화, ES 모듈 기본 사용 등 Node.js와 차별화된 특징을 가지며 관련 프로젝트 개발을 통해 생태계를 확장하고 있다.
  • 런타임 시스템 - 메모리 오더링
    메모리 오더링은 컴파일러와 CPU가 메모리 접근 순서를 최적화하는 과정에서 멀티 스레드 환경의 데이터 일관성을 해칠 수 있는 문제로, 메모리 배리어를 통해 제어하고 메모리 모델을 이해해야 한다.
  • 라이브러리 - 바이너리 재컴파일러
  • 라이브러리 - 동적 링크 라이브러리
    동적 링크 라이브러리(DLL)는 윈도우 운영체제에서 프로그램 실행 시 필요한 코드와 데이터를 제공하며, 여러 프로그램에서 공유되어 메모리 효율성을 높이고 모듈성을 향상시키는 라이브러리 형식이다.
런타임 라이브러리
개요
종류소프트웨어 라이브러리
역할컴퓨터 프로그램 실행 시 필요한 기능을 제공
설명컴파일된 코드의 실행을 지원하는 루틴 집합
특징
기능메모리 관리, 입출력 처리, 예외 처리 등
장점프로그램의 이식성 향상, 개발 생산성 향상
단점런타임 라이브러리 자체의 버그 가능성, 보안 취약점 가능성
구성 요소
필수 구성 요소시스템 콜 인터페이스, 시작/종료 루틴
선택적 구성 요소수학 함수, 문자열 처리 함수, 입출력 함수
종류
동적 런타임 라이브러리프로그램 실행 시 로드됨
정적 런타임 라이브러리컴파일 시 프로그램에 포함됨
주목할 런타임
안드로이드 런타임ART
얼랭 가상 머신BEAM
공통 언어 런타임CLR 및 Mono
CPythonCPython 및 PyPy
C 런타임crt0 (C 대상 특정 초기화)
자바 가상 머신JVM
LuaJITLuaJIT
Objective-CObjective-C 및 Swift
V8V8 및 Node.js
Zend 엔진Zend Engine (PHP)
컴파일 전략
선행 컴파일AOT
저스트 인 타임 컴파일JIT
추적 저스트 인 타임 컴파일Tracing just-in-time
컴파일 앤 고 시스템Compile and go system
사전 컴파일Precompilation
소스 투 소스 컴파일러Transcompilation
동적 재컴파일Recompilation

2. 처리계와의 관계

런타임 라이브러리는 일반적인 라이브러리와 달리 언어 기능을 지원한다는 측면에서 컴파일러, 링커 등 처리계의 일부라는 성격이 강하다. 특히 C++(C++)에서는 예외 처리, `new`, `delete`, 사용자 정의 생성자를 가진 타입의 정적 변수와 같이 컴파일 시 코드 생성을 불필요하게 길어지게 하고 코드 비대화를 초래하는 언어 기능들이 존재하며, 이러한 기능들은 공통화된 서브루틴으로서 런타임 라이브러리 함수에 의존한다. 가비지 컬렉션 기능 등도 런타임 라이브러리의 대표적인 예시 중 하나이다.[1]

일반적인 라이브러리와 달리 런타임 라이브러리는 명시적으로 링크 지정을 하지 않아도 처리계의 링커에 의해 자동으로 링크된다. 또한, 런타임 라이브러리는 디버깅용과 릴리스용 등 용도에 따라 하나의 환경에 여러 개가 존재하지만, 처리계의 링커는 컴파일 옵션이나 링크 옵션에 따라 적절한 런타임 라이브러리를 선택한다.[5]

필연적으로 링크되며, 인터페이스적으로도 밀접하게 결합되어 있기 때문에, 동적 링크가 지원되는 환경에서도 정적 링크되는 경우가 많다. 마찬가지로, 동적 링크 라이브러리로 제공되어 동적 링크하는 경우에도 필요에 따라 지연 로드하는 것이 아니라, 프로세스 시작 시 일괄적으로 조기 로드되는 경우도 있다.

3. 런타임 라이브러리 제거

C와 C++는 언어 사양에 따라 OS에 의존하지 않는 프리 스탠딩 환경이 정의되어 있다. C에서의 프리 스탠딩 환경에서는 표준 라이브러리 함수가 전혀 존재하지 않으며, 엔트리 포인트도 `main`일 필요가 없고, 전역 변수 등의 초기화도 필요 없다. C에서는 프리 스탠딩 환경에서 런타임 라이브러리가 필요하지 않다. 그러나 C++에서는 OS가 없는 환경에서도 최소한의 언어 기능을 구현하기 위해 런타임 라이브러리가 필요하다.

처리계 옵션을 통해 강제로 런타임 라이브러리를 제거할 수도 있다. gcc에서는 `-nodefaultlibs`[8]를 지정하고, Microsoft Visual C++에서는 `/NODEFAULTLIB`[9]를 지정한다. 표준 런타임 라이브러리를 제거하면 실행 파일을 경량화하거나, TinyCRT와 같은 제3자 제공 런타임 라이브러리[10]를 사용할 수 있다. 특히 경량화는 메가 데모라고 불리는 데모 씬에서 필수적인 기술이다.

4. 재배포 시 주의점

많은 링커는 런타임 라이브러리를 정적 링크하는 옵션을 명시적으로 지정하지 않으면 용량 감소와 취약점 방지 차원에서 기본적으로 동적 링크 형식의 런타임 라이브러리를 선택한다.[11] 이 때문에, 애플리케이션 프로그램을 실행하는 컴퓨터에는 해당 애플리케이션 프로그램의 모듈과는 별도로 동적 링크 형식의 런타임 라이브러리 모듈이 필요하다. 만약 재배포 대상 컴퓨터(최종 사용자 환경)에 런타임 라이브러리가 없으면, 프로그램은 실행 직후에 비정상 종료된다. 비정상 종료에 이르는 과정은 런타임 라이브러리에 국한되지 않고 동적 링크를 사용하는 경우 전반에 해당하지만, 런타임 라이브러리에 관해서는 암묵적으로 링크해 버리기 때문에 간과하기 쉽고, 특히 문제가 발생하기 쉽다. 또한, 만약 런타임 라이브러리가 애플리케이션마다 프라이빗(private)하지 않고, 시스템 전체에서 공유되는 경우, 버전 호환성 문제도 안게 된다(DLL 지옥).

재배포 대상에 런타임 라이브러리가 존재하지 않는 상황은 다음과 같다.

# 재배포 대상 컴퓨터에 설치된 공유 런타임 라이브러리의 버전이 일치하지 않음.

# 재배포한 프로그램이 개발용(디버그 정보나 성능 측정용 정보를 포함한) 런타임 라이브러리와 링크되어 있음.

런타임 라이브러리는 같은 시리즈의 컴파일러에서도 다른 버전 간에 바이너리 호환성이 없는 경우도 있으며[12], 동적 링크 형식의 모듈에 관해서는 버전에 따른 이름을 붙이는 등, side-by-side로 관리되는 경우가 있다. 그 경우에는 프로그램 빌드에 사용한 컴파일러에 대응하는 버전의 공유 런타임 라이브러리가 필요하다. 또한, 바이너리 호환성이 없는 경우에 모듈 경계를 넘어 오브젝트를 주고받으면 정의되지 않은 문제가 발생한다.[13]

재배포 대상 컴퓨터에 설치된 공유 런타임 라이브러리의 버전이 일치하지 않는 경우의 대책으로는, 런타임 라이브러리를 정적 링크하는 방법이나, 프라이빗 모듈로 애플리케이션 패키지에 동봉하는 방법이 있다. 확실한 방법이지만, 런타임 라이브러리에 보안 구멍(취약점)이 발견된 경우, 공유 런타임 라이브러리라면 OS의 보안 패치(취약점 대책)에 의해 갱신되는 반면, 런타임 라이브러리를 정적 링크하거나 프라이빗 모듈로 재배포해 버리면, 그 혜택을 받을 수 없다는 결점도 있다.

통상, 공유 런타임 라이브러리는 재배포 가능(redistributable) 패키지[14] 또는 OS의 업데이트 프로그램[15]으로 재배포 대상 컴퓨터에 도입할 수 있지만, 이 패키지나 업데이트 프로그램에 의해 도입할 수 있는 런타임 라이브러리는 최종 사용자용(릴리스 빌드용) 런타임 라이브러리뿐이며, 개발자용(디버그 빌드용) 런타임 라이브러리는 포함되지 않는다.[5] 이 때문에 잘못하여 디버그용 런타임 라이브러리와 링크된 프로그램을 배포하면 비정상 종료를 발생시킨다.

특히 문제가 발생하기 쉬워지는 요인은 다음과 같다.

# 개발용 컴퓨터에, 컴파일러를 비롯한 개발 도구를 설치하면, 암묵적으로 디버그용 공유 런타임 라이브러리가 설치되므로, 디버그용 런타임 라이브러리의 존재를 자각하기 어렵다.

# 디버그 옵션의 유무만으로 릴리스용과 디버그용이 전환되므로, 어느 라이브러리를 사용하고 있는지 자각하기 어렵다.

# 릴리스용 런타임 라이브러리를 링크한 프로그램과, 디버그용 런타임 라이브러리를 링크한 프로그램 사이에, 눈에 보이는 큰 차이가 없다.

대책으로는, 개발 도구가 설치되어 있지 않은 컴퓨터상에서 반드시 동작 확인을 하는 것이 있다.

5. 예시

glibc, msvcrt는 C 런타임 라이브러리의 예시이다. C 런타임 라이브러리는 시스템 구성 요소로서 운영체제에 기본 탑재되는 경우가 있다. GNU C 라이브러리에서 파생된 리눅스 libc, 안드로이드의 Bionic|바이오닉 libc영어[7] 등이 이에 해당한다.

참조

[1] 웹사이트 4. The GCC low-level runtime library https://gcc.gnu.org/[...] GNU 2013-12-30
[2] 웹사이트 Other Built-in Functions Provided by GCC https://gcc.gnu.org/[...] GNU 2013-12-30
[3] 웹사이트 The C Runtime Initialization, crt0.o http://www.embecosm.[...] Embecosm 2013-12-30
[4] Microsoft Docs ENTRY (Entry-Point Symbol) https://docs.microso[...]
[5] Microsoft Docs CRT Library Features https://docs.microso[...]
[6] 문서 典型的なスタートアップルーチンとしてはcrt0がある。詳細は {{仮リンク|crt0|en|Crt0}} を参照。
[7] Android Developers ネイティブ API https://developer.an[...]
[8] URL https://gcc.gnu.org/[...]
[9] Microsoft Docs /NODEFAULTLIB (Ignore Libraries) https://docs.microso[...]
[10] URL https://github.com/l[...]
[11] Microsoft Docs Upgrade your code to the Universal CRT https://docs.microso[...]
[12] Microsoft Docs C++ binary compatibility 2015-2019 https://docs.microso[...]
[13] Microsoft Docs Potential Errors Passing CRT Objects Across DLL Boundaries https://docs.microso[...]
[14] Microsoft Docs Redistributing Visual C++ Files https://docs.microso[...]
[15] 문서 Windows での汎用の C ランタイムの更新プログラム https://support.micr[...]
[16] 웹인용 The GCC low-level runtime library http://gcc.gnu.org/o[...] gnu.org 2016-02-12
[17] 웹인용 Other Built-in Functions Provided by GCC http://gcc.gnu.org/o[...] gnu.org 2016-02-12
[18] 웹인용 The C Runtime Initialization, crt0.o http://www.embecosm.[...] embecosm.com 2016-02-12



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com