16.2. 정적 및 동적 연결
개발자는 완전히 컴파일된 언어로 애플리케이션을 빌드할 때 정적 또는 동적 연결을 사용할 수 있습니다. 이 섹션에는 특히 Red Hat Enterprise Linux에서 C 및 C++ 언어 사용의 차이점이 설명되어 있습니다. 요약하자면, Red Hat은 Red Hat Enterprise Linux의 애플리케이션에서 정적 링크 사용을 권장하지 않습니다.
정적 및 동적 연결 비교
정적 연결은 라이브러리가 결과 실행 파일의 일부로 만듭니다. 동적 연결은 이러한 라이브러리를 별도의 파일로 유지합니다.
동적 및 정적 연결은 다음과 같은 여러 방법으로 비교할 수 있습니다.
- 리소스 사용
정적 연결로 더 많은 코드가 포함된 실행 파일이 더 커집니다. 라이브러리에서 제공하는 이 추가 코드는 시스템의 여러 프로그램에서 공유할 수 없으므로 런타임에 파일 시스템 사용과 메모리 사용량이 증가합니다. 정적으로 연결된 동일한 프로그램을 실행하는 여러 프로세스가 여전히 코드를 공유합니다.
반면, 정적 애플리케이션에는 더 적은 가동 시간 재배치가 필요하므로 시작 시간이 줄어들고RSS(개인 상주 설정 크기) 메모리가 줄어듭니다. 정적 연결을 위한 생성된 코드는 PoC(위치 종속 코드)에서 도입한 오버헤드로 인해 동적 연결보다 효율적일 수 있습니다.
- 보안
ABI 호환성을 제공하는 동적으로 연결된 라이브러리는 이러한 라이브러리에 따라 실행 파일을 변경하지 않고 업데이트할 수 있습니다. 이는 Red Hat이 보안 업데이트를 제공하는 Red Hat Enterprise Linux의 일부로 Red Hat에서 제공하는 라이브러리에 특히 중요합니다. 이러한 라이브러리에 대한 정적 연결은 권장되지 않습니다.
또한 로드 주소 임의화와 같은 보안 조치를 정적으로 연결된 실행 파일과 함께 사용할 수 없습니다. 이렇게 하면 결과 애플리케이션의 보안이 더욱 감소합니다.
- 호환성
정적 연결은 운영 체제에서 제공하는 라이브러리 버전과 관계없이 실행 파일을 제공하는 것으로 나타납니다. 그러나 대부분의 라이브러리는 다른 라이브러리에 의존합니다. 정적 연결을 사용하면 이 종속성이 유연해지므로 정방향 및 이전 버전과의 호환성이 모두 손실됩니다. 정적 연결은 실행 파일이 빌드된 시스템에서만 작동하도록 보장됩니다.
주의GNU C 라이브러리(glibc)에서 정적 라이브러리를 연결하는 애플리케이션에는 여전히 시스템에 glibc 가 동적 라이브러리로 있어야 합니다. 또한 애플리케이션의 런타임에 사용 가능한 glibc 의 동적 라이브러리 변형은 애플리케이션을 연결하는 동안 존재하는 것과 약간 동일한 버전이어야 합니다. 따라서 정적 연결은 실행 파일이 빌드된 시스템에서만 작동할 수 있습니다.
- 지원 범위
- Red Hat에서 제공하는 대부분의 정적 라이브러리는 선택적 채널에 있으며 Red Hat에서 지원하지 않습니다.
- 기능
일부 라이브러리, 특히 GNU C 라이브러리(glibc)는 정적으로 연결될 때 축소된 기능을 제공합니다.
예를 들어, 정적으로 연결된 경우 glibc 는 스레드를 지원하지 않으며 동일한 프로그램에서
dlopen()
함수에 대한 호출 형식을 지원합니다.
나열된 단점으로 인해 특히 전체 애플리케이션 및 glibc 및 libstdc++ 라이브러리의 경우 정적 연결을 피할 수 있습니다.
compat-glibc 패키지는 Red Hat Enterprise Linux 7에 포함되어 있지만 런타임 패키지는 아니므로 아무것도 실행하지 않아도 됩니다. 연결을 위한 헤더 파일 및 더미 라이브러리가 포함된 개발 패키지일 뿐입니다. 따라서 이전 Red Hat Enterprise Linux 버전에서 컴파일 및 연결(해당 헤더 및 라이브러리에 대해 compat-gcc-\* 사용)을 실행할 수 있습니다. 이 패키지 사용에 대한 자세한 내용은 rpm -qpi compat-glibc-*
.
정적 연결 이유
다음과 같은 일부 경우 정적 연결이 합리적인 선택이 될 수 있습니다.
- 동적 연결에 사용할 수 없는 라이브러리
-
빈 chroot 환경 또는 컨테이너에서 코드를 실행하려면 완전히 정적 연결이 필요할 수 있습니다. 그러나 Red Hat에서는
glibc-static
패키지를 사용한 정적 연결은 지원되지 않습니다.