Arch Linux AUR 의존성 지옥: ICU 76~78 마이그레이션 디버깅
I’m happy to translate the article for you, but I’ll need the full text of the post (the portion you want translated). Could you please paste the article’s content here? Once I have it, I’ll provide a Korean translation while preserving the original formatting, markdown, and code blocks.
문제
최근 Arch 기반 시스템(EndeavourOS)에서 Notepadqq를 실행하려고 할 때 좌절스러운 문제를 겪었습니다:
$ notepadqq
/usr/bin/../lib/notepadqq/notepadqq-bin: error while loading shared libraries:
libicui18n.so.76: cannot open shared object file: No such file or directory
이는 롤링 릴리스 배포판인 Arch Linux와 같은 시스템에서 특히 흔히 발생하는 전형적인 공유 라이브러리 의존성 문제입니다.
근본 원인 이해
ICU란?
ICU(International Components for Unicode)는 Unicode와 국제화 지원을 제공하는 성숙하고 널리 사용되는 C/C++ 라이브러리 집합입니다. Qt의 WebEngine 컴포넌트를 포함한 많은 애플리케이션이 이를 사용합니다.
롤링 릴리스 도전 과제
이 문제는 공식 Arch 저장소와 AUR 패키지 간의 중요한 버전 불일치에서 비롯되었습니다:
| 무슨 일이 있었나요 | 세부 사항 |
|---|---|
| Arch 업스트림 | 공식 저장소에서 ICU 78 로 업데이트됨 |
| Notepadqq (AUR) | 여전히 ICU 76 로 컴파일됨 |
| Qt5WebEngine | 공식 저장소에서 제거되었지만 시스템에 남아 있으며 여전히 ICU 76 와 연결됨 |
핵심 문제: Notepadqq는 2018년 이후 활발히 유지 관리되지 않았습니다. AUR 패키지이기 때문에 Arch가 ICU와 같은 시스템 라이브러리를 업데이트해도 자동으로 재빌드되지 않습니다. 이로 인해 다음 사이에 동기화 불일치가 발생했습니다:
- 공식 저장소 패키지 (ICU 78)
- 오래된 AUR 바이너리 (ICU 76을 기대)
- 고아가 된 저장소 패키지 (ICU 76 연동을 가진 Qt5WebEngine)
공식 패키지와 유지 관리되지 않는 AUR 소프트웨어를 혼합할 때 흔히 발생하는 연쇄적인 의존성 불일치 함정입니다.
진단 단계
1. 현재 ICU 버전 확인
$ ls /usr/lib/libicui18n.so*
/usr/lib/libicui18n.so
/usr/lib/libicui18n.so.78
/usr/lib/libicui18n.so.78.1
이 결과로 나는 ICU 78을 사용하고 있음을 확인했으며, 애플리케이션은 버전 76을 기대하고 있었다.
2. 패키지 출처 파악
$ pacman -Ss notepadqq
# (no output)
$ yay notepadqq
1 aur/notepadqq 2.0.0beta-3 (+1 0.32) (Installed)
Notepadqq는 AUR에서 설치된 것이므로 시스템 라이브러리가 변경될 때 자동으로 재빌드되지 않는다.
3. 재빌드 시도
$ yay -S notepadqq --rebuild
링커 오류가 발생했다:
/usr/bin/ld: /usr/lib/libQt5WebEngineCore.so: undefined reference to `icu_76::Normalizer::normalize(...)'
/usr/bin/ld: /usr/lib/libQt5WebEngineCore.so: undefined reference to `ucnv_open_76'
4. 실제 원인 발견
$ pacman -Qo /usr/lib/libQt5WebEngineCore.so
/usr/lib/libQt5WebEngineCore.so is owned by qt5-webengine 5.15.19-4
qt5-webengine 자체가 오래된 ICU 버전에 맞춰 컴파일되어 있었다.
5. 저장소 조사
$ sudo pacman -Syu qt5-webengine
error: target not found: qt5-webengine
핵심 발견: qt5-webengine이 공식 Arch 저장소에서 제거되었지만, 시스템에는 고아 패키지로 남아 있었다.
해결책
1. 충돌하는 패키지 제거
sudo pacman -Rns qt5-webengine notepadqq
제거된 패키지
qt5-webengine(~ 159 MiB)notepadqq(~ 5.9 MiB)- 관련 의존성 (
qt5-location,qt5-webchannel,qt5-websockets)
총 확보 용량: ≈ 174.9 MiB
2. AUR에서 qt5-webengine 재빌드
yay -S qt5-webengine
패키지는 소스에서 컴파일되며 현재 ICU 78 라이브러리에 링크됩니다.
3. notepadqq 재빌드
yay -S notepadqq
qt5-webengine이 이제 ICU 78에 올바르게 링크되었으므로 Notepadqq가 오류 없이 빌드됩니다.
4. 링크 확인
ldd /usr/bin/notepadqq | grep icu
출력:
libicui18n.so.78 => /usr/lib/libicui18n.so.78
libicuuc.so.78 => /usr/lib/libicuuc.so.78
애플리케이션이 이제 올바른 ICU 버전에 링크되었습니다. 🎉
주요 교훈
-
AUR 패키지는 시스템 라이브러리와 자동으로 업데이트되지 않는다
- Arch가 핵심 라이브러리(예: ICU)를 업데이트하면 공식 패키지는 자동으로 재빌드된다.
- AUR 패키지는 그렇지 않다; 사용자가 직접 혹은 유지관리자가 수동으로 재빌드해야 한다.
- Notepadqq의 마지막 업스트림 업데이트는 2018년에 있었으며, 따라서 ICU 76, 77, 78에 대한 재빌드가 전혀 이루어지지 않아 ICU가 변경될 때마다 패키지가 깨졌다.
-
부분 업그레이드는 위험하다
- 시스템 업데이트를 자주 하더라도 바이너리 호환성 문제가 디스크에 남아 있을 수 있다.
- 재부팅만으로는 ABI 불일치를 해결할 수 없다.
-
롤링 릴리스는 패키지 일관성을 요구한다
- ICU와 같은 라이브러리는 자주 업데이트되므로, 모든 의존 패키지는 동기화하여 재빌드되거나 업데이트되어야 한다.
- 제거된 저장소에서 남은 고아 패키지는 숨겨진 문제를 일으킬 수 있다.
-
ABI 호환성은 중요하다
- 공유 라이브러리 이름에 포함된 버전 번호(
libicui18n.so.76vs.libicui18n.so.78)는 ABI가 깨졌음을 나타낸다. - 한 버전을 다른 버전으로 심볼릭 링크하는 것은 안전하지 않으며, 충돌이나 정의되지 않은 동작을 초래할 수 있다.
- 공유 라이브러리 이름에 포함된 버전 번호(
ABI 파손 분석
왜 이것이 단순히 심볼릭 링크가 없어서 생긴 문제라고 생각하지 않았나요?
-
라이브러리 파일명에 포함된 버전
libicui18n.so.76 vs libicui18n.so.78.76과.78은 SONAME 메이저 버전입니다.- 메이저 버전이 다르면 ABI 호환성이 의도적으로 깨진 것입니다.
-
링커 오류에 나타나는 버전이 포함된 심볼
icu_76::Normalizer::normalize ← 심볼 이름에 버전이 고정됨 ucnv_open_76 ← 함수 이름에 버전이 포함됨- 라이브러리는
icu_78::심볼을 제공하지만, 바이너리는icu_76::심볼을 필요로 합니다. - 심볼릭 링크를 아무리 만들어도 이 불일치를 해결할 수 없습니다.
- 라이브러리는
-
심볼릭 링크가 실패하는 이유
심볼릭 링크를 만든다고 해도:
sudo ln -s libicui18n.so.78 libicui18n.so.76- 바이너리는 로드되지만
icu_76::함수를 호출하려 시도합니다. - 라이브러리는
icu_78::함수만 제공하므로, - 결과: 즉시 크래시하거나 정의되지 않은 동작이 발생합니다.
- 바이너리는 로드되지만
의존성 체인은 깊게 얽혀 있다
단순해 보였던 Notepadqq 문제는 실제로 다음 작업을 필요로 했습니다:
- ICU 버전 불일치 진단.
qt5‑webengine의존성 발견.- 고아가 된 저장소 패키지 식별.
- 전체 의존성 체인 재빌드.
하지 말아야 할 것
❌ 심볼릭 링크 만들기
# DON'T DO THIS
sudo ln -s /usr/lib/libicui18n.so.78 /usr/lib/libicui18n.so.76
이렇게 하면 프로그램이 시작될 수 있지만, 다음과 같은 문제가 발생할 수 있습니다:
- 런타임 충돌
- 정의되지 않은 동작
- 데이터 손상
- 디버깅이 어려운 문제
❌ 업데이트 오류 무시
정기적으로 pacman -Syu를 실행하는 것은 좋지만, 다음도 수행해야 합니다:
- 고아 패키지 확인:
pacman -Qtdq - 시스템 라이브러리 업데이트 후 AUR 패키지 검증
- 실패한 트랜잭션 로그 검토
예방 전략
1. 정기적인 고아 패키지 정리
pacman -Qtdq | pacman -Rns -
2. AUR 패키지 빌드 실패 모니터링
시스템 라이브러리가 업데이트될 때, 영향을 받은 AUR 패키지를 즉시 재빌드합니다:
yay -S --rebuild
중요: 유지 관리되지 않는 AUR 패키지(예: Notepadqq, 마지막 업데이트 2018)는 시스템 라이브러리 업데이트 후 항상 수동 재빌드가 필요합니다. 다음을 고려하세요:
- 활발히 유지 관리되는 대안을 찾기.
- 직접 AUR 패키지를 유지 관리하기.
- 종속성을 포함하는 AppImage/Flatpak 버전 사용하기.
3. 바이너리 패키지 대안 사용
안정성이 중요한 애플리케이션의 경우, 종속성을 모두 포함하는 AUR의 -bin 패키지를 고려하세요(디스크 사용량이 증가하는 단점이 있습니다).
4. 라이브러리 종속성 확인
주요 라이브러리 업데이트 후, 필요한 라이브러리가 누락되지 않았는지 확인합니다:
ldd /usr/bin/<binary> | grep "not found"
<binary>를 검사하려는 실행 파일 이름으로 교체하십시오.
결론
이 문제는 Arch Linux(및 그 파생 배포판)가 “고급” 배포판으로 여겨지는 이유를 완벽하게 보여줍니다. 롤링‑릴리스 모델은 최신 패키지를 제공하지만 사용자가 다음을 이해해야 합니다:
- 공유 라이브러리 버전 관리(ABI 호환성)
- 의존성 체인
- 공식 저장소와 AUR 간의 관계
- 패키지를 재빌드할지 재설치할지 판단하는 시점
해결책은 빠른 수정이 아니라 의존성 체인의 체계적인 진단 및 재빌드였습니다. 순간적으로는 답답했지만, 이러한 문제를 겪음으로써 Linux 시스템이 근본적으로 어떻게 동작하는지에 대한 이해가 깊어집니다.
여러분도 Arch에서 비슷한 의존성 문제를 겪어본 적이 있나요?
라이브러리 버전 불일치를 어떻게 처리하시나요? 댓글로 경험을 공유해 주세요!
시스템 정보
- 배포판: EndeavourOS (Arch 기반)
- 패키지 관리자:
pacman+yay - 영향받은 버전: ICU 76 → 78, Qt5WebEngine 5.15.19‑4