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-gccveya 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+ hedeftegdbserver
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.
İlgili Gömülü Linux soruları
- Linux'ta user space'den GPIO kontrol etmek için sysfs mi libgpiod mu kullanılmalı? Neden?
- 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?
- 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?
- Yocto Project ile Buildroot arasındaki farklar nelerdir? Bir ürün için hangisini seçersiniz?
- 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?
- Device tree nedir, neden kullanılır? .dts, .dtsi, .dtb ve overlay kavramlarını açıklayın.
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.