프로젝트 소개
이 저장소는 Rust 바이너리 크기를 최소화하기 위한 종합적이고 실습 중심의 가이드입니다. Rust의 기본 최적화가 실행 속도와 디버깅 편의성을 목표로 하지만, 더 작은 실행 파일이 필요한 개발자를 위해 명확하고 단계별 경로를 제공합니다.
가이드는 프로그램 동작에 영향을 주지 않는 기본 기법부터 시작합니다:
- 릴리스 모드로 빌드하면 디버그 빌드에 비해 바이너리 크기를 30% 이상 줄일 수 있습니다.
- Cargo의 `strip = true` 설정(Rust 1.59부터 사용 가능)을 사용해 바이너리에서 심볼을 자동으로 제거하거나, 이전 버전에서는 ELF 파일에 `strip`을 수동으로 실행합니다.
- `Cargo.toml`에서 `opt-level = "z"`를 설정하여 속도 대신 크기로 최적화하며, `"s"`가 때로 더 작은 결과를 낼 수 있으므로 실험이 권장됩니다.
- 링크 시간 최적화(LTO)를 활성화하여 링커가 죽은 코드를 제거하고 컴파일 단위 간 최적화를 수행하게 합니다.
- `codegen-units`를 1로 줄여 컴파일 시간을 희생하지만 더 공격적인 최적화를 가능하게 합니다.
가이드는 프로그램 동작을 변경하거나 nightly Rust가 필요한 고급 기법으로 넘어갑니다:
- `panic = "abort"`를 사용하여 unwinding 코드를 제거하고, 불안정한 `-Zlocation-detail=none` 및 `-Zfmt-debug=none` 플래그로 위치 및 포맷 세부 정보를 제거합니다.
- `build-std`로 표준 라이브러리를 소스에서 빌드하여 `libstd`를 크기로 최적화하고 불필요한 부분을 제거합니다. 여기에는 `optimize_for_size` 기능과 불안정한 `panic=immediate-abort` 옵션이 포함되어 패닉 문자열을 제거합니다.
- `#![no_std]` 및 `#![no_main]`으로 `libstd`를 완전히 제거하고, C 진입점과 수동 stdio 관리를 사용합니다. 이는 해키하고 이식성이 낮으며 의존성을 신중히 분석해야 하지만, C 프로그램만큼 작은 바이너리를 만들 수 있습니다.
가이드는 또한 다음을 다룹니다:
- 최종 바이너리를 압축하기 위해 UPX를 사용하며, 안티바이러스 오탐 가능성에 대한 경고가 포함됩니다.
- `cargo-bloat`, `momo`, WebAssembly용 Twiggy와 같은 바이너리 크기 분석 및 축소 도구.
- `rust:alpine` 이미지, 이미지 탐색용 `dive`, 최소 베이스 이미지용 `distroless`를 포함한 컨테이너 이미지 크기 축소 기법.
- 작은 Rust 바이너리, WASM 크기 축소, Rust 바이너리 크기 작업 그룹에 관한 블로그 게시물을 포함한 외부 리소스 링크.
- Rust 1.32에서 jemalloc 제거에 대한 역사적 참고 사항과 이전 버전 처리 방법.
예제 프로젝트는 `build_std` 및 `no_std` 폴더에 제공되며, 가이드는 작은 Rocket 웹 서버와 GStreamer 플러그인 같은 실제 사례 연구를 참조합니다. 각 단계가 복잡성이나 이식성을 희생하면서 추가 크기 축소를 제공하므로 기법이 누적적임을 강조합니다.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.