CodeBlanks Logo Icon CodeBlanks

ABI nedir?

ABI (Application Binary Interface) kavramını öğrenirsin.

ABI nedir?

ABI (Application Binary Interface, Uygulama İkili Arayüzü), derlenmiş nesne dosyalarının birbiriyle nasıl konuşacağını tanımlar. Kaynak kod sözdizimini değil, ikili uyumluluğu belirler: çağırma biçimi, yapı yerleşimi, isim mangling ve vtable.

İki derleyici aynı ABI'yi izlerse, biri derlenmiş kütüphane, diğeri ana program olabilir ve sorunsuz bağlanır. ABI farklıysa, kaynak kod aynı olsa bile sembol adları uyuşmaz ve bağlama hatası oluşur. Bu yüzden GCC ve Clang Itanium ABI'sini paylaşır; MSVC farklı bir ABI kullanır.

ABI bileşenleri

Dört temel ABI bileşeni şunlardır: çağırma biçimi (parametreler kayıtcı veya yığın üzerinden nasıl geçilir), yapı yerleşimi (üyeler bellekte nasıl sıralanır), name mangling (fonksiyon imzasının sembol adına kodlanması) ve vtable (sanal fonksiyon tablosu).

Bu dört öğeden biri değişirse ABI kırılır. Örneğin sınıfa yeni bir sanal fonksiyon eklersen vtable değişir, eski derlenmiş kod yanlış fonksiyonu çağırır. Bu yüzden kütüphane yazarları ABI'yi korumak için özenli olmalı.

Uygulama compute fonksiyonu yaz

int compute(int x) yaz; gövdesi return x * 3;. main içinde std::cout << compute(4); yaz.

Başlangıç kodu

main.cpp
#include <iostream>

// compute fonksiyonunu buraya tanımla

int main() {
    // compute'u çağır ve yazdır
    return 0;
}

Örnek çözüm

main.cpp
#include <iostream>

int compute(int x) {
    return x * 3;
}

int main() {
    std::cout << compute(4);
    return 0;
}

Beklenen çıktı

12

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 ABI neyi tanımlar?

main.cpp
g++ -c lib.cpp
clang++ main.cpp lib.o
  • Yalnızca kaynak kod sözdizimini
  • Derleyici sürüm numarasını
  • Çalıştırılabilir dosyaların ikili uyumluluğunu Doğru cevap
  • Sınıf adlandırma biçimini

Açıklama: ABI, çağırma biçimi, yerleşim ve mangling gibi ikili ayrıntıları tanımlar.

2 extern C bildirimini tamamla

Soru
extern "C" void ____();
Cevap
extern "C" void greet();

Açıklama: greet fonksiyonu extern "C" ile manglesiz bildirilir.

3 Bileşeni rolüne eşle

Kavram Anlamı
calling convention Parametre geçirme
struct layout Üye sıralama
name mangling Sembol adlandırma
vtable Sanal fonksiyon tablosu

Uzman bölümündeki tüm dersler