Cross-compilation nedir? Bir cross toolchain hangi bileşenlerden oluşur ve sysroot ne işe yarar?

Cevap

Cross-compilation, kodu bir mimaride (host, ör. x86_64 PC) derleyip başka bir mimaride (target, ör. ARM Cortex-A) çalıştırmaktır. Gömülü hedefler genellikle derleme için yavaş ve kaynakları kısıtlı olduğu için bu yöntem standarttır.

Toolchain bileşenleri

  • Derleyici: arm-linux-gnueabihf-gcc, aarch64-linux-gnu-gcc veya Clang (--target=)
  • binutils: assembler (as), linker (ld), objcopy, objdump, readelf, strip
  • C kütüphanesi: glibc, musl veya uClibc-ng (bare-metal için newlib)
  • Kernel header'ları: user space'in sistem çağrısı arayüzü
  • Debugger: gdb + hedefte gdbserver

Target triplet

aarch64-linux-gnu = mimari - işletim sistemi - ABI/libc. arm-none-eabi ise işletim sistemi olmayan (bare-metal) Cortex-M hedefidir.

Sysroot

Sysroot, hedef sistemin header ve kütüphanelerinin host üzerindeki kopyasıdır. Derleyici #include ve -l aramalarını host'un /usr dizinine değil buraya yapar. Böylece yanlışlıkla x86 kütüphanesine link edilmez.

aarch64-linux-gnu-gcc --sysroot=/opt/sdk/sysroots/aarch64 \
    -O2 -o app main.c -lgpiod
file app
# app: ELF 64-bit LSB executable, ARM aarch64 ...

CMake ile CMAKE_SYSTEM_NAME, CMAKE_C_COMPILER ve CMAKE_SYSROOT değerlerini içeren bir toolchain dosyası kullanılır. Yocto'nun populate_sdk çıktısı veya Buildroot'un output/host dizini bu ayarları hazır olarak verir.

Sık hata: hedefteki glibc sürümünden daha yeni bir glibc ile link etmek. Program hedefte GLIBC_2.xx not found hatası verir.

  1. Linux'ta user space'den GPIO kontrol etmek için sysfs mi libgpiod mu kullanılmalı? Neden?KolayGömülü LinuxEmbedded
  2. User space'den /dev/mem ve mmap ile donanım register'larına erişmek nasıl yapılır? Riskleri ve daha iyi alternatifleri nelerdir?ZorGömülü LinuxEmbedded
  3. Linux kernel'de kesme işleme neden top half ve bottom half olarak ikiye ayrılır? Softirq, tasklet, workqueue ve threaded IRQ arasındaki farklar nelerdir?ZorGömülü LinuxEmbedded
  4. Yocto Project ile Buildroot arasındaki farklar nelerdir? Bir ürün için hangisini seçersiniz?OrtaGömülü LinuxEmbedded
  5. Bir donanım için kernel modülü (kernel space driver) mi yoksa user space driver mı yazarsınız? Artıları ve eksileri nelerdir?OrtaGömülü LinuxEmbedded
  6. Device tree nedir, neden kullanılır? .dts, .dtsi, .dtb ve overlay kavramlarını açıklayın.OrtaGömülü LinuxEmbedded

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle