<colcolor=#fff><bgcolor=#a32d2a> GNU C Library | |
| |
<colbgcolor=#a32d2a> 종류 | C 표준 라이브러리 |
최초 개발자 | 롤랜드 맥그래스 |
개발 | GNU |
출시 | 1987년 |
언어 | C |
플랫폼 | GNU/Linux 커널 |
안정 버전 | v2.41(2025년 1월 30일) |
라이선스 | LGPL (v2.0 이상) |
링크 |
[clearfix]
1. 개요
GNU의 Linux 커널 시스템 콜 기반 C 표준 라이브러리 구현체.자유 소프트웨어 재단에서 완전한 자유 소프트웨어 기반 운영체제를 제작한다는 모토 아래 롤랜드 맥그래스를 주축으로 개발되기 시작하였고, 이후 이 목적에 정확히 들어맞는 GNU/Linux가 GNU 프로젝트로 편입되면서 덩달아 GNU의 주력 프로젝트로 떠올랐다. 현재는 리눅스의 syscall API를 기반으로 멀티프로세싱, 멀티스레딩, 파일 입출력 등 수많은 고수준 API를 제공하는 레이어로 리눅스 생태계의 수많은 배포판과 응용 프로그램들의 종속 라이브러리로 쓰이고 있다.
2. 기능
2.1. 구현 표준 및 호환 플랫폼
- ISO C 표준 라이브러리
- ISO/IEC 9899:1990 (C90 libc)
- ISO/IEC 9899:1999 (C99 libc)
- ISO/IEC 9899:2011 (C11 libc) - 표준
<threads.h>
라이브러리가 추가된 바로 그 버전. glibc구현상 POSIX thread API와 C11 thread API를 모두 지원하지만 이것도 내부적으로는 pthreads로 구현되어 있다.# - ISO/IEC 9899:2018 (C18 libc)
- POSIX(Portable Operating System Interface)
- ISO/IEC 9945-1:1996 (POSIX.1)
- ISO/IEC 9945-2:1993 (POSIX.2)
- Berkeley UNIX 확장 - glibc가 BSD를 지원하는 건 아니지만 호환성 목적으로
siginterrupt
등 몇몇 BSD식 시그널 핸들러 함수를 제공하고 있다. 단, glibc가 BSD libc를 전부 구현하는 건 아니다. - BSD 4.2 및 이에 기반한 SunOS (UNIX System V 확장)
- BSD 4.3
- BSD 4.4
- SVID(System V Interface Description)
- XPG(X/Open Portability Guide) 및 모든 XSI(X/Open System Interface) 호환 확장
2.2. 비표준 확장
위 표준들 외에도 glibc자체적으로 구현된 독자적인 함수들도 있다. glibc 문서나 man page를 보다 보면 'This variable/function is a GNU extension ...' 이라고 쓰인 항목들이 바로 그것. 대부분 유틸리니 함수들이거나 suffix 형태의 보완 확장인 경우가 대부분이라 써도 큰 문제는 없지만, 호환성을 아주 중요하게 생각한한다면 자주 사용하는 것은 피하는 게 좋다.- NSS(Name Service Switch) - 정확히는 모듈의 형태로, glibc 사용 프로그램들이 개별 서비스를
/etc/nsswitch.conf
에 등록하고 조회할 수 있도록 통합한 API라고 볼 수 있으며 개별 모듈은 동적 라이브러리 형태로/lib
하위로 들어간다. POSIX 표준은 아니고 glibc 독자 구현으로, 따라서 BSD 등의 운영체제에선 전혀 다른 API를 사용한다. musl 구현에도 포함되어 있지 않다. - Obstack 확장 - (아레나 형식이 아닌) 유사-스택(stack-like) 메모리 할당 방식 구현체.
- ifunc (Indirect Function) - 실행중인 프로세서에 맞게 최적화된 서브루틴을 실행시키는 런타임 확장. 예를 들어 SSE2, AVX2로 각각 구현된 함수가 있다고 하였을 때, SSE2 지원, AVX2 지원 프로세서에서 위 하드웨어 가속 코드를 실행하기 위해선 프로그램 차원에서 CPUID를 읽어 Feature Extension 지원 유무를 판별 한 후, Thunk 함수나, vtable을 구현해야 하는데 GNU ifunc는 이 작업을 런타임 환경에서 자동화 해 준다.
3. 파생 소프트웨어
3.1. eglibc
#임베디드 환경 지원을 위한 glibc의 포크로, glibc와 100% 호환되는 것을 목표로 한다.[1][2]
2009년, Debian 및 Ubuntu를 포함한 몇몇 데비안 파생 배포판들이 기본 표준 라이브러리를 eglibc로 바꾸기로 결정했다.[3] 다만 eglibc의 코드가 2014년 glibc 2.20 버전에서 병합되었고 결국 데비안도 Jessie 릴리즈부터 다시 glibc로 돌아가며 개발이 중단되었다.
4. 대체재
가장 유명한 대체재로는 musl libc가 있는데, dynamic linking 위주로 활용되는 glibc에 비해 static linking 방식으로 자주 쓰인다. NSS등 무겁고 복잡한 GNU 확장이 이것저것 붙은 glibc에 비해 크기가 작아 주로 경량 배포판이나 컨테이너 용도로 활용된다. Alpine Linux나 coreutils의 대체재인 BusyBox등이 대표적인 예시.5. 기타
6. 관련 문서
[1] EGLIBC strives to be source- and binary-compatible with GLIBC. In default configuration EGLIBC is fully GLIBC-compatible. #[2] Dangers of compiling with GNU Libc and running on eglibc in Linux?[3] Debian is switching to EGLIBC