glibc

glibc는 GNU C Library라는 C 라이브러리 구현이다. printf 같은 ISO C 함수와 POSIX 인터페이스, GNU 확장 기능을 제공한다. Linux 커널 자체가 아니며 모든 Linux 프로그램이 glibc에 의존하는 것도 아니다. 다른 libc를 사용하거나 정적으로 링크한 프로그램도 있다.

함수 호출과 시스템 호출 구분하기

C 코드에서 printf를 호출했다고 매번 커널에 시스템 호출이 발생하는 것은 아니다. 표준 입출력 버퍼에 모았다가 내보낼 수 있다. malloc 역시 매 호출마다 커널에서 메모리를 새로 얻는다고 가정하면 안 된다. 라이브러리가 기존 영역을 재사용할 수 있다.

반대로 파일 읽기 같은 기능은 라이브러리의 래퍼를 통해 커널에 요청할 수 있다. 어떤 함수가 어떤 시스템 호출로 구현되는지는 라이브러리·아키텍처·버전에 영향을 받는다. 시스템 호출 관찰에서 strace 예제로 이 경계를 확인할 수 있다.

GLIBC 버전 오류를 만났을 때

GLIBC_2.xx not found 오류는 프로그램이나 의존 라이브러리가 요구하는 심볼 버전을 현재 환경에서 제공하지 못한다는 단서다. 커널 버전만 올리면 해결된다고 단정하지 않는다.

getconf GNU_LIBC_VERSION

이 명령은 glibc 환경에서 버전을 확인하는 방법이다. musl 등 다른 libc 환경에서는 지원되지 않을 수 있다. 대상 프로그램이 실제로 무엇에 링크됐는지는 별도로 조사한다.

해결할 때는 지원할 배포 환경에 맞춰 빌드하거나 적합한 실행 이미지를 고른다. 시스템의 libc 파일 하나만 임의로 교체하면 다른 프로그램까지 영향을 받을 수 있다.

표준과 확장은 구분해서 사용하기

헤더 앞의 _POSIX_C_SOURCE나 _GNU_SOURCE는 선언을 노출할 범위를 조절한다. 컴파일이 됐다는 사실만으로 해당 바이너리를 다른 libc에 그대로 옮길 수 있는 것은 아니다. 필요한 API와 실행 환경을 빌드 설정에 함께 기록한다.

자료: glibc 소개, Feature Test Macros