Lesson 10 — Cross-compilation & Binary Optimization
🎯 Learning Objectives
- Hiểu cơ chế cross-compilation trong Rust và cách build cho nhiều kiến trúc (x86, ARM, musl,…).
- Biết tối ưu kích thước binary (binary size) và hiệu năng runtime.
- Nắm được cách sử dụng
cargo,target, và các công cụ nhưstrip,musl,cross.
✅ Explanation & Key Concepts
- Là quá trình biên dịch code trên một máy (host) cho một kiến trúc khác (target).
- Ví dụ: build trên x86_64 cho thiết bị ARMv7.
- glibc: chuẩn phổ biến cho Linux, hỗ trợ đầy đủ nhưng cần shared libs.
- musl: nhỏ, static link, chạy độc lập (thích hợp cho embedded, docker minimal).
- Dùng
--release, bật LTO, tối ưu cấp độzhoặcs. - Dùng
stripđể bỏ symbol/debug info. - Có thể bật
panic = abortđể giảm kích thước.
💻 Example Implementation
Cargo.toml
[package]
name = "lesson10_cross_compile"
version = "0.1.0"
edition = "2024"
[profile.release]
lto = true
opt-level = "z"
codegen-units = 1
strip = true
panic = 'abort'
src/main.rs
// cargo-deps: fn main() { println!("Hi, dp — lightweight binary demo!"); }
Using cross:
- Need stable CI/CD, team collaboration, and many C
- Want to bundle all dependencies inside a Docker image and run anywhere
cargo install cross
rustup toolchain install stable-x86_64-unknown-linux-gnu --profile minimal --force-non-host
cross build --release --target x86_64-unknown-linux-musl
Using zig:
- Need to build fast, developing solo on macOS
- Want static MUSL binaries, no Docker involved
brew install zig
cargo install cargo-zigbuild
rustup target add x86_64-unknown-linux-musl
cargo zigbuild --release --target x86_64-unknown-linux-musl
🛠️ Hands-on Exercises
- Basic: Build binary
hello-dpcho musl, kiểm tra kích thước bằngls -lh target/.... - Intermediate: So sánh kích thước giữa build với và không có
strip. - Challenge: Build cho ARMv7 và copy qua thiết bị thật để chạy thử.
📊 Binary Size Optimization Cheatsheet
| Technique | Cargo config | Description |
|---|---|---|
| Release build | --release | Bật tối ưu hóa compiler |
| Link Time Optimization | lto = true | Gộp tối ưu hóa toàn bộ crate |
| Optimize for size | opt-level = "z" | Ưu tiên kích thước nhỏ |
| Panic abort | panic = 'abort' | Không giữ backtrace, giảm ~100KB |
| Strip | strip = true | Bỏ debug symbols |
| One codegen unit | codegen-units = 1 | Tăng tối ưu hóa toàn cục |
| Static link (musl) | --target x86_64-unknown-linux-musl | Tạo binary tự chạy |
🔧 Real-world Tips
-
Dùng
du -hhoặcfileđể xác minh loại binary (statically linked). -
Kiểm tra bằng
ldd— nếu báo not a dynamic executable → thành công. -
Với container: dùng
FROM scratchhoặcFROM alpineđể có image cực nhẹ. -
Dùng
stripthủ công nếu không bật trong Cargo.toml:strip target/release/your_app
📚 References
❓ Q & A — Câu hỏi thường gặp
Q1. Cross-compilation là gì?
- Là việc biên dịch trên một máy (host) để chạy trên kiến trúc khác (target), ví dụ build trên x86_64 cho ARM.
Q2. Khi nào nên dùng musl thay vì glibc?
- Khi cần binary nhỏ, static link, chạy độc lập (thích hợp cho container, thiết bị IoT, edge device).
Q3. Làm sao giảm kích thước binary hiệu quả nhất?
- Bật
--release,lto = true,opt-level = "z",panic = 'abort', vàstrip = true. Nếu cần nhỏ hơn nữa, dùngmusl.
Q4. Có nên luôn bật panic = abort?
- Có nếu bạn không cần backtrace chi tiết — giúp giảm kích thước đáng kể.
📖 Glossary of Terms
- Cross-compilation: biên dịch từ host sang kiến trúc khác.
- Target triple: chuỗi mô tả kiến trúc (vd:
x86_64-unknown-linux-musl). - Musl: libc nhỏ, hỗ trợ static linking.
- Strip: lệnh gỡ symbol/debug khỏi binary.
- LTO: Link Time Optimization.
🌿 Wisdom Note
Vi học nhật ích, vi đạo nhật tổn.
In pursuit of knowledge, one adds every day; in pursuit of the Way, one removes every day.
Tối ưu binary cũng vậy — loại bỏ điều thừa để giữ tinh hoa.