Building Linux Binaries That Run Everywhere: A Practical Guide to manylinux2014
리눅스용 배포 바이너리(특히 파이썬/네이티브 .so)를 “오래된 배포판에서도 잘 돌아가게” 만들려면 manylinux2014(CentOS 7, glibc 2.17) 같은 오래된 glibc 기반 환경에서 빌드하는 게 안전합니다.
Hun Jang Dec 5, 2025
하위 glibc 지원을 위한 빌드 전략
glibc가 “구버전→신버전” 방향의 강한 하위호환은 보장하지만, 신버전 glibc로 빌드한 바이너리는 구버전에서 안 돌아갈 수 있다. (GitHub)
핵심만 짚자
- 권장 빌드 베이스: manylinux2014 = CentOS 7 / glibc 2.17. 이렇게 빌드한 휠·공유라이브러리는 glibc 2.17 이상의 배포판(Debian 8+, Ubuntu 13.10+, RHEL 7+ 등)에서 동작하도록 설계되었습니다. (GitHub)
- 왜 효과가 있나: glibc는 심볼 버전닝으로 옛 glibc용 바이너리가 새 glibc에서 계속 동작하게 설계되어 있습니다(하위호환). 반대(새 glibc로 빌드 → 옛 glibc에서 실행)는 보장되지 않습니다. (Red Hat Developer)
- 태그 역사/대응: manylinux2014(= manylinux_2_17)는 PEP 599로 정의되었고, 이후 glibc 버전 기반의 perennial manylinux(PEP 600) 체계가 도입되었습니다. 최근에는 glibc 2.28 기반 manylinux_2_28도 널리 쓰입니다. 프로젝트 상황에 맞춰 태그를 선택하세요. (Python Enhancement Proposals (PEPs))
- 실전 사례: 일부 프로젝트는 릴리스에서 빌드 베이스를 manylinux2014→manylinux_2_28로 전환해 더 최신 배포판과의 기본 호환을 넓히고 있습니다. (예: Maunium/synapse 릴리스 노트) (GitLab)
실무 팁
- 도커 이미지 바로 쓰기:
quay.io/pypa/manylinux2014_x86_64(또는 aarch64 등)에서 빌드 →auditwheel로 휠 수리 → 업로드. 이 이미지는 “오래된 glibc + 최신 컴파일러 조합”을 제공해 새 C++ 기능을 쓰되 libstdc++ 심볼 버전 제한을 만족하게 구성돼 있습니다. (GitHub)
- 배포 타깃이 더 새롭다면: 런타임 최소 glibc가 2.28 이상이면
manylinux_2_28를 고려하세요(예: Debian 10+, RHEL8+). 불필요한 제약을 줄이고 성능/최적 컴파일 옵션 선택 폭이 넓어집니다. (GitHub)
- AWS Lambda/AL2 계열: AL2는 glibc 2.26이라 manylinux2014 빌드물이 잘 맞는 편입니다. 타깃 런타임의 glibc를 먼저 확인하세요. (AWS Documentation)