Cross-Compiling for AWS AL2023 ARM64 Using Zig
ARM64(특히 AWS Lambda/AL2023)용 바이너리를 Zig 크로스컴파일로 빌드하면, gcc/musl 불일치와 런타임 의존성 꼬임을 피하고 완전 재현 가능한 결과물을 얻을 수 있다.
Zig와 AL2023으로 ARM64 크로스컴파일 정리하기
ARM64(특히 AWS Lambda/AL2023)용 바이너리를 Zig 크로스컴파일로 빌드하면, gcc/musl 불일치와 런타임 의존성 꼬임을 피하고 완전 재현 가능한 결과물을 얻을 수 있다. 아래 레시피만 따르면 ad‑hoc 툴체인 없이도 예측 가능해진다.
왜 Zig인가?
- 올인원 크로스툴체인: 별도 크로스 gcc 설치 불필요.
- 고정 sysroot 사용: AL2023 sysroot로 링크 대상이 일정 → “빌드됨=동일 동작”.
- 정적/부분정적 링크 쉬움: Lambda 배포 시
glibc/musl지옥 탈출.
기본 개념 정리
- AL2023: Amazon Linux 2023. Lambda의 런타임 기반(arm64/AMD64).
- sysroot: 빌드시 참조할 표준 라이브러리/헤더 세트. “대상 리눅스의 파일시스템 축약판”.
- triple:
aarch64-linux-musl또는aarch64-linux-gnu같은 타깃 표기.
설치
AL2023 sysroot 준비 (권장: 도커로 추출)
- musl 타깃을 원하면 컨테이너 내에
musl패키지를 설치해 동일하게 추출.
- 결과적으로
sysroots/al2023-aarch64에include/,lib64/가 존재.
C/C++ 프로젝트 빌드 예시
1) 단일 파일
gnu는 glibc,musl은 musl. Lambda는 둘 다 가능하지만 musl 정적 링크가 배포 편함.
- 너무 공격적 정적 링크가 필요 없다면
static빼고 진행.
2) Makefile 스니펫
3) C++ (libstdc++ 의존 최소화 권장)
Lambda 배포 팁
- 바이너리 검사:
file out/app_arm64→ELF 64-bit LSB pie executable, ARM aarch64.
- 런타임 의존성 확인:
ldd가 정적으로 뜨면 OK. 동적이면libstdc++.so/libgcc_s.so누락 주의.
- 레이어 구성:
bootstrap(orapp)만 두고 환경 깨끗하게.
흔한 문제 & 해결
- AL2023 GLIBC 버전 미스매치
→ 빌드 시 꼭 AL2023에서 뽑은 sysroot 사용.
- libz, OpenSSL 등 네이티브 라이브러리
→ 해당 dev 패키지를 컨테이너에서 설치 후 sysroot로 같이 추출.
- C++ ABI 차이
→ 가능하면 -static -static-libstdc++ -static-libgcc로 봉인, 아니면 동일 sysroot의 libstdc++.so를 포함.
- 성능 플래그
→ -O3 -ffast-math(필요 시), OpenMP는 musl 정적 링크 시 주의.
Docker 기반 완전 재현 빌드 예시
언제 musl, 언제 glibc?
- musl: 단일 정적 바이너리 선호, 이식성/크기/배포 단순화가 목표일 때.
- glibc: 특정 glibc 기능/호환성이 필요하거나, 동적 로딩·지역화 등 라이브러리 생태계 의존 시.
체크리스트 (요약)
AL2023 컨테이너에서 dev/static 패키지 설치 후 sysroot 추출
zig cc -target aarch64-linux-(musl|gnu) --sysroot ...로 빌드
정적 링크 선호 시 static -static-libstdc++ -static-libgcc
file/ldd로 산출물 확인, Lambda 핸들러로 교체/압축 배포