Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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

Cross-compilation

  • 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.

Musl vs glibc

  • 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).

Tối ưu binary

  • Dùng --release, bật LTO, tối ưu cấp độ z hoặc s.
  • 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

  1. Basic: Build binary hello-dp cho musl, kiểm tra kích thước bằng ls -lh target/....
  2. Intermediate: So sánh kích thước giữa build với và không có strip.
  3. Challenge: Build cho ARMv7 và copy qua thiết bị thật để chạy thử.

📊 Binary Size Optimization Cheatsheet

TechniqueCargo configDescription
Release build--releaseBật tối ưu hóa compiler
Link Time Optimizationlto = trueGộp tối ưu hóa toàn bộ crate
Optimize for sizeopt-level = "z"Ưu tiên kích thước nhỏ
Panic abortpanic = 'abort'Không giữ backtrace, giảm ~100KB
Stripstrip = trueBỏ debug symbols
One codegen unitcodegen-units = 1Tăng tối ưu hóa toàn cục
Static link (musl)--target x86_64-unknown-linux-muslTạo binary tự chạy

🔧 Real-world Tips

  • Dùng du -h hoặc file để 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 scratch hoặc FROM alpine để có image cực nhẹ.

  • Dùng strip thủ 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ùng musl.

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

Key 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

Đạo Đức Kinh — Chương 48

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.