리눅스/LFS

[LFS5] M4와 Ncurses 빌드 중 지속되는 트러블슈팅과 그것을 해결하기 위한 여정

sik13579 2026. 1. 31. 08:06

1. 헤더 에러 전쟁의 시작

Glibc라는 거대한 산을 넘고 순항할 줄 알았으나, 시스템 유틸리티 빌드 단계에서 예상치 못한 복병들을 만났습니다.

오늘은 M4 빌드 시 발생한 헤더 정의 문제와 Ncurses 빌드 중 겪은 버전 불일치 문제를 해결하며 툴체인을 더욱 견고하게 다진 기록을 남깁니다.

 

2. M4 빌드와 MB_LEN_MAX 오류!

M4는 매크로 프로세서로, 앞으로의 빌드 설정을 자동화하는 데 필수적인 도구입니다. 하지만 컴파일 도중  
Assuemed value of MB_LEN_MAX wrong이라는 에러를 마주했습니다.

Glibc는 MB_LEN_MAX 가 16 이상길 기대하지만, GCC가 호스트의 불완전한 헤더를 참조로 하여 1로 인식하며 빌드 중단되었습니다. 이것을 해결하기 위해 GCC 내부 헤더를 강제로 수정하였습니다.

GCC 소스 폴더에서 여러 파편화된 헤더들을 하나로 합쳐 limits.h를 직접 생성했습니다.

cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
  `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/install-tools/include/limits.h

이 과정을 통해 컴파일러가 호스트 시스템의 영향에서 벗어나 독자적인 정의를 갖게 되었습니다.

 

3. Ncurses와 15.2.0 vs 14.2.0의 함정

 터미널 UI를 담당하는 Ncurses 빌드 중 당혹스럽게 fatal error : exception: No such file or directory를 겪었습니다.

원인 분석은 가이드를 따라 Libstdc++를 14.2.0 경로에 설치했는데 현재 사용 중인 GCC 버전은 15.2.0이었고,

컴파일러는 본인 버전인 15.2.0 폴더에서 헤더를 찾았지만, 파일은 14.2.0에 숨어 있어 찾기 못했던 것입니다.

 

 이것을 해결하기 위해 아래와 같은 과정을 수행하였습니다.
1. 헤더 파일 위치 확인 
표준 헤더가 실제로 어디에 설치되었는지 찾아보았습니다.

find $LFS -name exception

/mnt/lfs/tools/x86_64-lfs-linux-gnu/include/c++/14.2.0/exception 파일 자체는 정확한 위치에 잘 생성된 상태

 

2. 컴파일러가 실제로 어디를 찾고 있는지 확인해 보았습니다.

$LFS_TGT-g++ -v -E - < /dev/null 2>&1 | grep -A 5 "search starts here"

버전이 14.2.0이 아닌 15.2.0!

 원인 분석중 2번째 과정에서 원인을 발견하였습니다.

컴파일러(GCC)는 15.2.0 버전인데, 5.6. Libstdc++ 빌드 설정 시 폴더명을 14.2.0으로 고정해서 설치했기 때문에 경로가 어긋났습니다.

따라서, $LFS_TGT-g++는 자신의 버전인 15.2.0 폴더 안을 뒤지지만, 그 안에는 아무것도 없는 상태였던 것입니다.

 

 이 원인을 해결하기 위해 15.2.0 이름의 폴더가 14.2.0을 가리키도록 심볼릭 링크를 만드는 것입니다.

아래 명령어를 입력하여, 심볼릭 링크를 만들어줍시다.

cd $LFS/tools/$LFS_TGT/include/c++
ln -sv 14.2.0 15.2.0

 

설정을 바꿨으니 기존의 꼬인 빌드 기록을 완전히 지우고 다시 시작해야 합니다.

cd $LFS/sources/ncurses-6.6
make distclean   # 이전 실패 기록 삭제

./configure --prefix=/usr                \
            --host=$LFS_TGT              \
            --build=$(./config.guess)    \
            --mandir=/usr/share/man      \
            --with-manpage-format=normal \
            --with-shared                \
            --without-normal             \
            --with-cxx-shared            \
            --without-debug              \
            --without-ada                \
            --disable-stripping          \
            --enable-widec

make

 

  • Wide Character 지원: --enable-widec 옵션을 통해 유니코드 지원을 활성화했습니다.
  • 라이브러리 연결: 표준 ncurses를 호출할 때 widec 버전이 응답하도록 libncurses.so에 INPUT(-lncursesw) 설정을 추가했습니다.

마지막 단계로 Ncurses를 설치하고 마무리해 봅시다.

# 1. 설치
make DESTDIR=$LFS TIC_PATH=$(which tic) install

# 2. 라이브러리 연결 (표준 ncurses를 찾을 때 widec 버전을 사용하도록 유도)
echo "INPUT(-lncursesw)" > $LFS/usr/lib/libncurses.so

# 3. 소스 폴더 정리
cd $LFS/sources
rm -rf ncurses-6.6

 

 

4. 더 단단해진 툴체인

이번 트러블슈팅을 통해 리눅스 빌드 시스템이 버전 숫자 하나, 헤더 파일 정의한 줄에 얼마나 민감하게 반응하는지 체감할 수 있었습니다. 이제 우리 시스템은 텍스트 UI를 그릴 수 있는 능력(Ncurses)과 매크로를 처리하는 능력(M4)을 갖췄습니다.

다음 편에서는 드디어 시스템의 '입' 역할을 할 Bash 쉘 빌드로 이어집니다!  감사합니다.