pulse.huny.dev
HunyDev
Cross-Compiling for AWS Graviton: A Practical Smoke-Testing Workflow on x86 Hosts

Cross-Compiling for AWS Graviton: A Practical Smoke-Testing Workflow on x86 Hosts

배포 전에 amd64 머신에서 arm64(Graviton)용 빌드 스모크 테스트를 돌리는 쉬운 방법을 정리

Hun Jang
Hun Jang Dec 2, 2025

x86에서 ARM64 실행환경 사전검증하기

배포 전에 amd64 머신에서 arm64(Graviton)용 빌드 스모크 테스트를 돌리는 쉬운 방법을 정리했다. 핵심은 **QEMU + binfmt_misc**로 “로제타처럼” arm64 바이너리를 x86_64에서 바로 실행해, SONAME/rpath, 동적 링크, 런타임 로더 경로가 Lambda/AL2023의 arm64 환경과 같은 방식으로 풀리는지 즉석에서 검증하는 것이다.

왜 필요한가

  • 크로스 컴파일은 되는데, 실행은 배포 후에야 가능한 경우가 많아(특히 Lambda arm64).
  • 이때 잘못된 SONAME 심볼릭 링크, 빠진 DT_NEEDED, rpath/RUNPATH 누락, glibc/OpenMP/OMP_NUM_THREADS 관련 런타임 충돌이 뒤늦게 터짐.
  • binfmt_misc로 미리 실행해보면, 실제 arm64 로더(ld-linux-aarch64.so.1) + 동적 링커 동작까지 같이 검증됨.

기본 셋업 (Docker 권장)

컨테이너 안에서:

ldd는 컨테이너 안(arm64 루트fs) 에서 실행해야 의미가 있어. 호스트가 amd64여도 --platform=linux/arm64 컨테이너 안이면 arm64 런타임 관점에서 평가됨.

Lambda(Linux/arm64) 근접 스모크 테스트

SONAME / rpath 체크리스트

  • libfoo.so.1(SONAME) ↔ libfoo.so.1 -> libfoo.so.1.2.3 심볼릭 링크가 모두 존재하는가.
  • Wl,-soname,libfoo.so.1 로 빌드했는가.
  • 런타임 탐색 경로:
    • 번들 배포: Wl,-rpath,'$ORIGIN' 또는 '$ORIGIN/../lib' 형태를 사용(심볼릭 링크 포함).
    • 시스템 so 사용: AL2023에 실제 패키지가 있는지 확인(dnf provides */libfoo.so.1).
  • patchelf --print-rpath ./your_binary 로 최종 rpath 재확인.

Make/CMake 스니펫

CMake:

Makefile (심볼릭 링크 생성 규범화):

Docker 멀티스테이지로 “빌드→스모크” 자동화

CI에서:

Lambda 레이어/패키징 팁

  • 레이어 구조: /opt/lib에 so 배치 → rpath에 '$ORIGIN/../lib' 또는 '/opt/lib' 포함.
  • SnapStart/Provisioned Concurrency 사용 시, 초기화 시 로딩되는 so 경로가 그대로 스냅샷됨 → 스모크 단계에서 동일 경로로 검증할 것.
  • OpenMP 사용 시 libgomp 의존을 명확히: ldd로 확인하고 필요 시 함께 번들.

흔한 함정

  • amd64 호스트에서 ldd만 돌려보고 “정상”이라 착각(실제 배포 후 arm64에서 실패).
  • RUNPATH만 있고 RPATH가 없어 하위 의존이 못 잡히는 케이스.
  • SONAME 누락으로 DT_NEEDED 해석 실패.
  • Zig/musl로 빌드했는데 런타임은 glibc 전제일 때의 미묘한 충돌.

You might also like

BlogPro logo
Made with BlogPro

Tags