6.9. Glibc-2.31

Glibc 패키지는 메인 C 라이브러리를 포함하고 있다. 이 라이브러리는 메모리 할당, 디렉토리 검색, 파일 열기 및 닫기, 파일 읽기 및 쓰기, 문자열 처리, 패턴 대조, 산술 등의 기본 루틴을 제공한다.

예상 빌드 시간: 19 SBU
필요 디스크 공간: 5.5 GB

6.9.1. Glibc 설치

[참고]

참고

Glibc 빌드 시스템은 컴파일러 설정 파일과 링커가 여전히 /tools를 가리키고 있더라도 독립적이며 완벽하게 설치될 것이다. 컴파일러 설정들과 링커는 Glibc가 설치되기 전에는 조정할 수 없다. Glibc autoconf 테스트가 실패해서 깔끔한 빌드라는 목표를 이룰 수 없기 때문이다.

어떤 Glibc 프로그램은 FHS를 준수하지 않는 /var/db 디렉토리에 런타임 데이터를 저장한다. 다음 패치를 적용하여 그러한 프로그램의 런타임 데이터가 FHS를 준수하는 위치에 저장되도록 한다:

patch -Np1 -i ../glibc-2.31-fhs-1.patch

LSB 준수를 위한 심볼릭 링크를 생성한다. 추가로, x86_64의 경우 동적 로더가 올바르게 작동하는 데 필요한 호환성 심볼릭 링크를 생성한다:

case $(uname -m) in
    i?86)   ln -sfv ld-linux.so.2 /lib/ld-lsb.so.3
    ;;
    x86_64) ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64
            ln -sfv ../lib/ld-linux-x86-64.so.2 /lib64/ld-lsb-x86-64.so.3
    ;;
esac

Glibc 문서에서는 전용 빌드 디렉토리에서 Glibc를 빌드할 것을 권장한다:

mkdir -v build
cd       build

Glibc 컴파일을 준비한다:

CC="gcc -ffile-prefix-map=/tools=/usr" \
../configure --prefix=/usr                          \
             --disable-werror                       \
             --enable-kernel=3.2                    \
             --enable-stack-protector=strong        \
             --with-headers=/usr/include            \
             libc_cv_slibdir=/lib

옵션들과 새 Configure 매개변수들의 의미:

CC="gcc -ffile-prefix-map=/tools=/usr"

GCC가 /tools 안의 파일에 대한 모든 참조를, 파일들이 /usr에 있는 상태에서 컴파일되는 것처럼 기록하게 한다. 이는 디버깅 기호에 잘못된 경로가 들어가는 것을 방지한다.

--disable-werror

GCC에 전달된 -Werror 옵션을 비활성화한다. 테스트 스위트를 실행하는데 필요하다.

--enable-stack-protector=strong

스택 스매싱 공격과 같은 버퍼 오버플로우를 점검하기 위한 코드를 추가해서 시스템 보안을 향상시킨다.

--with-headers=/usr/include

빌드 시스템이 커널 API 헤더를 어디서 찾을지 지정한다. 기본적으로 이들 헤더는 /tools/include에서 검색된다.

libc_cv_slibdir=/lib

모든 시스템에 대해 올바른 라이브러리를 설정한다. 우리는 lib64를 사용하지 않을 것이다.

패키지를 컴파일한다:

make
[중요]

중요

이 절에서 Glibc에 대한 테스트 스위트는 매우 중요하다. 어떤 상황에서도 건너뛰지 않도록 하라.

일반적으로 몇 가지 테스트는 통과하지 못한다. 아래 나열된 테스트 실패는 보통 무시해도 무방하다.

case $(uname -m) in
  i?86)   ln -sfnv $PWD/elf/ld-linux.so.2        /lib ;;
  x86_64) ln -sfnv $PWD/elf/ld-linux-x86-64.so.2 /lib ;;
esac
[참고]

참고

위의 심볼릭 링크는 chroot 환경의 빌드 단계에서 테스트를 실행하기 위해 필요하다. 아래 과정에서 덮어쓰인다.

make check

몇 개의 테스트는 실패할 것이다. Glibc 테스트 스위트는 호스트 시스템에 다소 의존적이다. 다음은 일부 버전의 LFS에서 나타나는 가장 일반적인 문제들이다:

  • misc/tst-ttyname 은 LFS chroot 환경에서 실패한다고 알려져 있다.

  • inet/tst-idna_name_classify 은 LFS chroot 환경에서 실패한다고 알려져 있다.

  • posix/tst-getaddrinfo4posix/tst-getaddrinfo5 는 일부 아키텍쳐에서 실패할 수도 있다.

  • The nss/tst-nss-files-hosts-multi 테스트는 알려지지 않은 이유로 인해 실패할 수도 있다.

  • The rt/tst-cputimer{1,2,3} 테스트는 호스트 시스템 커널에 달려있다. 커널 4.14.91–4.14.96, 4.19.13–4.19.18, 그리고 4.20.0–4.20.5는 이 테스트들에 실패한다고 알려져 있다.

  • CPU가 비교적 새로운 인텔/AMD 프로세서가 아닌 시스템에서는 산술 테스트에 실패하는 경우가 있다.

문제되지는 않는 메시지지만, Glibc가 설치되는 도중 /etc/ld.so.conf를 찾을 수 없다는 경고가 출력될 것이다. 다음과 같이 방지하라:

touch /etc/ld.so.conf

생성된 Makefile을 수정하여 불완전한 LFS 환경에서 실패하는 불필요한 온전성 검사를 건너뛴다:

sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile

패키지를 설치한다:

make install

nscd를 위한 configuration 파일과 런타임 디렉토리를 설치한다:

cp -v ../nscd/nscd.conf /etc/nscd.conf
mkdir -pv /var/cache/nscd

다음으로 시스템이 다른 언어로 응답할 수 있도록 로케일을 설치한다. 로케일은 꼭 필요하진 않지만, 이 중 일부가 누락되면 추후에 패키지 테스트 스위트가 중요한 테스트 케이스를 생략할 수도 있다.

각각의 로케일은 localedef 프로그램을 사용하여 설치할 수 있다. 예를 들어, 아래 첫 번째 localedef 명령은 문자셋에 독립적인(charset-independent) /usr/share/i18n/locales/cs_CZ 로케일 정의를 /usr/share/i18n/charmaps/UTF-8.gz 문자셋 정의와 조합하고 그 결과를 /usr/lib/locale/locale-archive 파일에 추가한다. 다음 지침은 테스트에 필요한 최소 로케일 세트를 설치한다:

mkdir -pv /usr/lib/locale
localedef -i POSIX -f UTF-8 C.UTF-8 2> /dev/null || true
localedef -i cs_CZ -f UTF-8 cs_CZ.UTF-8
localedef -i de_DE -f UTF-8 de_DE
localedef -i de_DE@euro -f UTF-85 de_DE@euro
localedef -i de_DE -f UTF-8 de_DE.UTF-8
localedef -i el_GR -f ISO-8859-7 el_GR
localedef -i en_GB -f UTF-8 en_GB.UTF-8
localedef -i en_HK -f UTF-8 en_HK
localedef -i en_PH -f UTF-8 en_PH
localedef -i en_US -f UTF-8 en_US
localedef -i en_US -f UTF-8 en_US.UTF-8
localedef -i es_MX -f UTF-8 es_MX
localedef -i fa_IR -f UTF-8 fa_IR
localedef -i fr_FR -f UTF-8 fr_FR
localedef -i fr_FR@euro -f UTF-85 fr_FR@euro
localedef -i fr_FR -f UTF-8 fr_FR.UTF-8
localedef -i it_IT -f UTF-8 it_IT
localedef -i it_IT -f UTF-8 it_IT.UTF-8
localedef -i ja_JP -f EUC-JP ja_JP
localedef -i ja_JP -f SHIFT_JIS ja_JP.SIJS 2> /dev/null || true
localedef -i ja_JP -f UTF-8 ja_JP.UTF-8
localedef -i ru_RU -f KOI8-R ru_RU.KOI8-R
localedef -i ru_RU -f UTF-8 ru_RU.UTF-8
localedef -i tr_TR -f UTF-8 tr_TR.UTF-8
localedef -i zh_CN -f GB18030 zh_CN.GB18030
localedef -i zh_HK -f BIG5-HKSCS zh_HK.BIG5-HKSCS

추가로, 당신의 국가, 언어 및 문자 세트에 대한 로케일을 설치하라.

아니면, glibc-2.31/localedata/SUPPORTED 파일에 나열된 모든 로케일(위에 나열된 모든 로케일 포함)을 이 시간 잡아먹는 명령으로 한 번에 설치하라:

make localedata/install-locales

그런 다음, 필요하다면 localedef 명령을 사용하여 glibc-2.31/localedata/SUPPORTED 파일에 나열되지 않은 로케일을 만들고 설치하라.

[참고]

참고

Glibc는 이제 다국어화 도메인 이름을 확인할 때 libidn2를 사용한다. 이것은 런타임 의존성이다. 이 기능이 필요하다면 BLFS libidn2 페이지에 libidn2 설치 지침이 있다.

6.9.2. Glibc 구성

6.9.2.1. nsswitch.conf 추가

Glibc 기본값은 네트워크 환경에서 잘 작동하지 않기 때문에 /etc/nsswitch.conf 파일을 생성해야 한다.

다음을 실행하여 /etc/nsswitch.conf 파일을 새로 생성하라:

cat > /etc/nsswitch.conf << "EOF"
# Begin /etc/nsswitch.conf

passwd: files
group: files
shadow: files

hosts: files dns
networks: files

protocols: files
services: files
ethers: files
rpc: files

# End /etc/nsswitch.conf
EOF

6.9.2.2. 표준 시간대 데이터 추가

다음과 같이 표준 시간대 데이터를 설치하고 설정하라:

tar -xf ../../tzdata2019c.tar.gz

ZONEINFO=/usr/share/zoneinfo
mkdir -pv $ZONEINFO/{posix,right}

for tz in etcetera southamerica northamerica europe africa antarctica  \
          asia australasia backward pacificnew systemv; do
    zic -L /dev/null   -d $ZONEINFO       ${tz}
    zic -L /dev/null   -d $ZONEINFO/posix ${tz}
    zic -L leapseconds -d $ZONEINFO/right ${tz}
done

cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
zic -d $ZONEINFO -p America/New_York
unset ZONEINFO

zic 명령들의 의미:

zic -L /dev/null ...

윤초가 없는 posix 표준 시간대를 만든다. 이것들을 zoneinfozoneinfo/posix에 모두 넣는 것이 일반적이다. POSIX 표준 시간대를 zoneinfo에 넣어야 한다. 그렇지 않으면 여러 테스트 스위트가 오류를 일으킨다. 디스크 공간이 작은 임베디드 시스템에서 표준 시간대를 업데이트할 의도가 없다면 posix 디렉토리를 사용하지 않음으로써 1.9 MB를 절약할 수 있지만, 일부 응용 프로그램이나 테스트 스위트는 오작동을 일으킬 수 있다.

zic -L leapseconds ...

윤초가 포함된 정확한 표준 시간대를 만든다. 디스크 공간이 좁아 표준 시간대를 업데이트하지 않을 임베디드 시스템이나, 정확한 시간이 필요없는 경우는 right 디렉토리를 생략해서 1.9 MB를 절약할 수 있다.

zic ... -p ...

posixrules 파일을 생성한다. POSIX는 미국 규정에 따라 일광 절약 시간제(또는 섬머타임)가 필요하므로 우리는 뉴욕을 사용한다.

다음 스크립트를 실행하여 로컬 표준 시간대를 정할 수 있다:

tzselect

지역에 관한 몇 가지 질문에 답하고 나면, 스크립트는 시간대의 이름을 출력할 것이다(예: America/Edmonton). /usr/share/zoneinfo에는 Canada/Eastern이나 EST5EDT처럼 스크립트에 의해 식별되지 않지만 사용할 수 있는 시간대도 있다.

그리고나서 다음을 실행하여 /etc/localtime 파일을 생성하라:

ln -sfv /usr/share/zoneinfo/<xxx> /etc/localtime

선택한 표준 시간대의 이름으로 <xxx>를 대체하라(예: Asia/Seoul).

6.9.2.3. 동적 로더 구성

기본적으로 동적 로더(/lib/ld-linux.so.2)는 프로그램이 실행될 때 필요한 동적 라이브러리를 /lib/usr/lib에서 검색한다. 그러나 라이브러리가 /lib이나 /usr/lib 이외의 디렉토리에 있다면, 동적 로더가 찾을 수 있도록 /etc/ld.so.conf 파일에 라이브러리 위치를 추가해야 한다. 추가 라이브러리를 포함하는 디렉토리는 보편적으로 /usr/local/lib/opt/lib 이 두 디렉토리이므로, 해당 디렉토리들을 동적 로더의 검색 경로에 추가한다.

다음 명령을 실행하여 새 /etc/ld.so.conf 파일을 생성하라:

cat > /etc/ld.so.conf << "EOF"
# Begin /etc/ld.so.conf
/usr/local/lib
/opt/lib

EOF

원한다면, 동적 로더가 디렉토리를 검색하고 거기서 발견된 파일의 내용을 포함시키도록 할 수도 있다. 보통 이 include 디렉토리의 파일은 포함하려는 라이브러리 경로를 지정하는 하나의 행이다. 이 기능을 추가하려면 다음 명령을 실행하라:

cat >> /etc/ld.so.conf << "EOF"
# Add an include directory
include /etc/ld.so.conf.d/*.conf

EOF
mkdir -pv /etc/ld.so.conf.d

6.9.3. Glibc의 내용

설치된 프로그램들: catchsegv, gencat, getconf, getent, iconv, iconvconfig, ldconfig, ldd, lddlibc4, locale, localedef, makedb, mtrace, nscd, pcprofiledump, pldd, sln, sotruss, sprof, tzselect, xtrace, zdump, zic
설치된 라이브러리들: ld-2.31.so, libBrokenLocale.{a,so}, libSegFault.so, libanl.{a,so}, libc.{a,so}, libc_nonshared.a, libcrypt.{a,so}, libdl.{a,so}, libg.a, libm.{a,so}, libmcheck.a, libmemusage.so, libmvec.{a,so}, libnsl.{a,so}, libnss_compat.so, libnss_dns.so, libnss_files.so, libnss_hesiod.so, libpcprofile.so, libpthread.{a,so}, libpthread_nonshared.a, libresolv.{a,so}, librt.{a,so}, libthread_db.so, libutil.{a,so}
설치된 디렉토리들: /usr/include/arpa, /usr/include/bits, /usr/include/gnu, /usr/include/net, /usr/include/netash, /usr/include/netatalk, /usr/include/netax25, /usr/include/neteconet, /usr/include/netinet, /usr/include/netipx, /usr/include/netiucv, /usr/include/netpacket, /usr/include/netrom, /usr/include/netrose, /usr/include/nfs, /usr/include/protocols, /usr/include/rpc, /usr/include/sys, /usr/lib/audit, /usr/lib/gconv, /usr/lib/locale, /usr/libexec/getconf, /usr/share/i18n, /usr/share/zoneinfo, /var/cache/nscd, /var/lib/nss_db

요약

catchsegv

프로그램이 세그멘테이션 오류로 종료될 때 스택 기록을 만드는 데 사용

gencat

메시지 카탈로그를 생성

getconf

파일 시스템 특정 변수에 대한 시스템 구성 값 표시

getent

관리 데이터베이스로부터 항목을 수집

iconv

문자 집합 변환

iconvconfig

fastloading iconv 모듈 구성 파일 생성

ldconfig

동적 링커 런타임 바인딩 구성

ldd

지정된 각각의 프로그램이나 공유 라이브러리에 필요한 공유 라이브러리를 출력

lddlibc4

객체 파일을 사용하여 ldd를 보조

locale

현재 로케일에 대한 다양한 정보 출력

localedef

로케일 사양을 컴파일

makedb

텍스트 입력으로 단순 데이터베이스 작성

mtrace

메모리 추적 파일을 읽고 해석하며 사람이 읽을 수 있는 형식으로 표시

nscd

대부분의 보편적인 서비스 요청에 대한 캐시를 제공하는 데몬

pcprofiledump

PC 프로파일링에 의해 생성된 정보 덤프

pldd

프로세스 실행 시 사용되는 동적 공유 개체 나열

sln

정적 링크된 ln 프로그램

sotruss

지정된 명령의 공유 라이브러리 프로시저 호출 추적

sprof

공유 개체 프로파일링 데이터 읽기 및 출력

tzselect

사용자에게 시스템 위치를 묻고 해당 표준 시간대 설명을 출력

xtrace

현재 실행 중인 함수를 출력하여 프로그램 실행 추적

zdump

표준 시간대 덤퍼

zic

표준 시간대 컴파일러

ld-2.31.so

공유 라이브러리 실행 파일용 헬퍼 프로그램

libBrokenLocale

Glibc가 내부적으로 고장난 프로그램(예: 일부 Motif 응용 프로그램들)을 실행하기 위해 사용. 자세한 내용은 glibc-2.31/locale/broken_cur_max.c의 설명을 참고하라

libSegFault

catchsegv에서 사용하는 세그멘테이션 오류 신호 처리기

libanl

비동기식 이름 검색 라이브러리

libc

메인 C 라이브러리

libcrypt

암호 라이브러리

libdl

동적 링크 인터페이스 라이브러리

libg

함수가 없는 더미 라이브러리. 예전엔 g++의 런타임 라이브러리였다

libm

수학 라이브러리

libmcheck

링크되었을 때 메모리 할당 확인 활성화

libmemusage

memusage에서 프로그램의 메모리 사용에 대한 정보를 수집하는 데 사용

libnsl

네트워크 서비스 라이브러리

libnss

호스트 이름, 유저 이름, 그룹 이름, alias, 서비스, 프로토콜 등을 확인하기 위한 기능이 포함된 이름 서비스 스위치 라이브러리(The Name Service Switch libraries)

libpcprofile

실행 파일을 PC 프로필에 사전 로드 가능

libpthread

POSIX 스레드 라이브러리

libresolv

패킷을 생성하고 인터넷 도메인 네임 서버로 전송 및 해석하는 함수 내장

librt

POSIX.1b Realtime Extension에서 지정한 대부분의 인터페이스를 제공하는 함수 내장

libthread_db

다중 스레드 프로그램을 위한 디버거 구축에 유용한 함수 내장

libutil

다양한 Unix 유틸리티에 사용되는 표준 함수에 대한 코드 내장