829 Stimmen

Was ist ein Application Binary Interface (ABI)?

Ich habe nie genau verstanden, was ein ABI ist. Bitte verweisen Sie mich nicht auf einen Wikipedia-Artikel. Wenn ich es verstehen würde, wäre ich nicht hier und würde einen so langen Beitrag schreiben.

Das ist meine Einstellung zu verschiedenen Schnittstellen:

Eine TV-Fernbedienung ist eine Schnittstelle zwischen dem Benutzer und dem Fernsehgerät. Sie ist eine existierende Einheit, die aber an sich nutzlos ist (sie bietet keine Funktionen). Die gesamte Funktionalität für jede dieser Tasten auf der Fernbedienung ist im Fernsehgerät implementiert.

Schnittstelle: Es handelt sich um eine "existierende Entitätsebene" zwischen der functionality y consumer dieser Funktionalität. Eine Schnittstelle an sich tut nichts. Sie ruft lediglich die dahinter liegende Funktionalität auf.

Je nachdem, wer der Nutzer ist, gibt es verschiedene Arten von Schnittstellen.

Befehlszeilenschnittstelle (CLI) Die Befehle sind die vorhandenen Einheiten, der Verbraucher ist der Nutzer und die Funktionalität liegt dahinter.

functionality: meine Softwarefunktionalität, die einen Zweck erfüllt Zweck, für den wir diese Schnittstelle beschreiben.

existing entities: Befehle

consumer: Benutzer

Grafische Benutzeroberfläche (GUI) Fenster, Schaltflächen, etc. sind die bestehenden Entitäten, und auch hier ist der Verbraucher der Benutzer, und die Funktionalität liegt dahinter.

functionality: meine Softwarefunktionalität, die ein Problem löst, für das wir diese Schnittstelle beschreiben.

existing entities: Fenster, Schaltflächen usw..

consumer: Benutzer

Anwendungsprogrammierschnittstelle (API) Funktionen (oder zu sein Schnittstellen (in der schnittstellenbasierten Programmierung) sind die bestehenden Entitäten, der Verbraucher ist hier ein anderes Programm, kein Benutzer, und wieder Funktionalität liegt hinter dieser Schicht.

functionality: meine Softwarefunktionalität, die einige Probleme löst Problem löst, für das wir diese Schnittstelle beschreiben.

existing entities: Funktionen, Schnittstellen (Array von Funktionen).

consumer: ein anderes Programm/eine andere Anwendung.

Anwendungsbinäre Schnittstelle (ABI) Genau hier beginnt mein Problem.

functionality: ???

existing entities: ???

consumer: ???

  • Ich habe Software in verschiedenen Sprachen geschrieben und verschiedene Arten von Schnittstellen bereitgestellt (CLI, GUI und API), aber ich bin nicht sicher, ob ich jemals eine ABI bereitgestellt habe.

Wikipedia sagt:

ABIs umfassen Details wie

  • Datentyp, Größe und Ausrichtung;
  • die Aufrufkonvention, die steuert, wie die Argumente der Funktionen übergeben und Rückgabewerte abgerufen werden;
  • die Nummern der Systemaufrufe und wie eine Anwendung Systemaufrufe tätigen sollte an das Betriebssystem richten soll;

Andere ABIs standardisieren Details wie

  • die Verstümmelung von C++-Namen,
  • die Ausbreitung von Ausnahmen, und
  • Aufrufkonvention zwischen Compilern auf der gleichen Plattform, aber nicht keine plattformübergreifende Kompatibilität erfordern.
  • Wer braucht diese Details? Bitte sagen Sie nicht das Betriebssystem. Ich kenne Assembler-Programmierung. Ich weiß, wie Binden und Laden funktioniert. Ich weiß genau, was darin passiert.

  • Warum wurde die C++-Namensvermischung eingeführt? Ich dachte, wir sprechen auf der binären Ebene. Warum kommen Sprachen ins Spiel?

Wie auch immer, ich habe die [PDF] System V Anwendung Binäre Schnittstelle Ausgabe 4.1 (1997-03-18) um zu sehen, was genau er enthält. Nun, das meiste ergab keinen Sinn.

  • Warum enthält sie zwei Kapitel (4. und 5.), die die ELF Dateiformat? Tatsächlich sind dies die einzigen beiden wichtigen Kapitel dieser Spezifikation. Der Rest der Kapitel ist "prozessorspezifisch". Wie auch immer, ich denke, das ist ein völlig anderes Thema. Bitte sagen Sie nicht, dass die Spezifikationen des ELF-Dateiformats sind die ABI. Es qualifiziert sich nicht als ein Schnittstelle gemäß der Definition.

  • Ich weiß, da wir auf einer so niedrigen Ebene sprechen, muss es sehr spezifisch sein. Aber ich bin mir nicht sicher, wie spezifisch die "Befehlssatzarchitektur (ISA)" ist.

  • Wo kann ich das ABI von Microsoft Windows finden?

Das sind also die wichtigsten Fragen, die mich beschäftigen.

10 Stimmen

"Bitte sagen Sie nicht OS" Compiler müssen die ABI kennen. Linker müssen die ABI kennen. Der Kernel muss die ABI kennen, um das Programm im RAM einrichten zu können, damit es ordnungsgemäß läuft. Was C++ betrifft, siehe unten, so werden Bezeichnungen absichtlich in Kauderwelsch umgewandelt, weil Überladungen und private Methoden vorhanden sind, und der Linker und jeder andere Compiler müssen über eine kompatible Namensumwandlung verfügen, um damit arbeiten zu können, mit anderen Worten, über dieselbe ABI.

1 Stimmen

"Sie können eine x86-Datei nicht auf einem ARM-Prozessor ausführen, Punkt. Die auf einem x86-System verwendete ABI kann also nicht dieselbe sein, die auf einem ARM-System verwendet wird.

20 Stimmen

Ich denke, die Frage ist so klar; sie beschreibt genau, welches Antwortformat erwartet wird, und dennoch gibt es keine einzige zufriedenstellende Antwort, die akzeptiert werden kann.

5voto

plugwash Punkte 8413

Der Begriff ABI wird für zwei unterschiedliche, aber miteinander verbundene Konzepte verwendet.

Wenn von Compilern die Rede ist, sind damit die Regeln gemeint, nach denen Konstrukte auf Quellcodeebene in binäre Konstrukte übersetzt werden. Wie groß sind die Datentypen? Wie funktioniert der Stack? Wie übergebe ich Parameter an Funktionen? Welche Register sollten vom Aufrufer und welche vom Aufrufenden gespeichert werden?

Wenn von Bibliotheken die Rede ist, bezieht sich dies auf die binäre Schnittstelle, die von einer kompilierten Bibliothek bereitgestellt wird. Diese Schnittstelle ist das Ergebnis einer Reihe von Faktoren, darunter der Quellcode der Bibliothek, die vom Compiler verwendeten Regeln und in einigen Fällen Definitionen, die aus anderen Bibliotheken übernommen wurden.

Änderungen an einer Bibliothek können die ABI verändern, ohne die API zu verändern. Nehmen wir zum Beispiel eine Bibliothek mit einer Schnittstelle wie.

void initfoo(FOO * foo)
int usefoo(FOO * foo, int bar)
void cleanupfoo(FOO * foo)

und der Anwendungsprogrammierer schreibt Code wie

int dostuffwithfoo(int bar) {
  FOO foo;
  initfoo(&foo);
  int result = usefoo(&foo,bar)
  cleanupfoo(&foo);
  return result;
}

Der Anwendungsprogrammierer kümmert sich nicht um die Größe oder das Layout von FOO, aber die Anwendungsbinärdatei endet mit einer fest einkodierten Größe von foo. Wenn der Bibliotheksprogrammierer ein zusätzliches Feld zu foo hinzufügt und jemand die neue Bibliotheksbinärdatei mit der alten Anwendungsbinärdatei verwendet, kann die Bibliothek unzulässige Speicherzugriffe vornehmen.

OTOH, wenn der Autor der Bibliothek seine API wie folgt gestaltet hätte.

FOO * newfoo(void)
int usefoo(FOO * foo, int bar)
void deletefoo((FOO * foo, int bar))

und der Anwendungsprogrammierer schreibt Code wie

int dostuffwithfoo(int bar) {
  FOO * foo;
  foo = newfoo();
  int result = usefoo(foo,bar)
  deletefoo(foo);
  return result;
}

Das Anwendungsprogramm muss dann nichts über die Struktur von FOO wissen, das kann alles innerhalb der Bibliothek versteckt werden. Der Preis, den Sie dafür zahlen, ist, dass Heap-Operationen erforderlich sind.

4voto

yoAlex5 Punkte 20661

Anwendungsbinäre Schnittstelle (ABI)

ABI - Application Binary Interface geht es um eine Maschinencode-Kommunikation in Laufzeit zwischen zwei binären Teile wie - Anwendung, Bibliothek, OS... ABI beschreibt, wie Objekte im Speicher gespeichert werden, wie Funktionen aufgerufen werden( calling convention ), Verstümmelung...

Ein gutes Beispiel für API und ABI ist iOS-Ökosystem mit der Sprache Swift .

  • Application layer - Wenn Sie eine Anwendung in verschiedenen Sprachen erstellen. Sie können zum Beispiel eine Anwendung erstellen mit Swift y Objective-C [Mischen von Swift und Objective-C]

  • Application - OS layer - laufzeit - Swift runtime y standard libraries sind Teile von OS und sie sollte nicht in jedes Bundle (z. B. App, Framework) aufgenommen werden. Es ist dasselbe wie bei Objective-C verwendet

  • Library layer - Module Stability Fall - Kompilierzeit - werden Sie in der Lage sein importieren ein Framework, das mit einer anderen Version des Swift-Compilers erstellt wurde. Das bedeutet, dass es sicher ist, eine Closed-Source-(Pre-Build-)Binärdatei zu erstellen, die von einer anderen Version des Compilers verwendet werden kann ( .swiftinterface wird verwendet mit .swiftmodule [Über] ) und Sie erhalten keine

    Module compiled with _ cannot be imported by the _ compiler
    //or
    Compiled module was created by a newer version of the compiler
  • Library layer - Library Evolution Fall

    1. Kompilierzeit - wenn eine Abhängigkeit geändert wurde, muss ein Client nicht neu kompiliert werden.
    2. Laufzeit - eine Systembibliothek oder ein dynamischer Rahmen kann im laufenden Betrieb durch eine neue Bibliothek ausgetauscht werden.

[API vs. ABI]
[Stabilität von Swift-Modulen und -Bibliotheken]

4voto

Die ABI muss zwischen Aufrufer und Aufgerufenem konsistent sein, um sicher zu sein, dass der Aufruf erfolgreich ist. Stack-Verwendung, Register-Verwendung, Stack-Pop am Ende der Routine. All dies sind die wichtigsten Teile der ABI.

3voto

Chawathe Vipul S Punkte 1548

Binäre Anwendungsschnittstelle (ABI)

Funktionsweise:

  • Übersetzung vom Modell des Programmierers in den Datenbereich des zugrunde liegenden Systems Typ, Größe, Ausrichtung, die Aufrufkonvention, die steuert, wie Argumente von Funktionen übergeben und Rückgabewerte abgerufen werden; die Systemaufrufnummern und wie eine Anwendung Systemaufrufe an das an das Betriebssystem machen sollte; der Name des Hochsprachencompilers der Compiler für Hochsprachen, das Mangling-Schema, die Ausnahmefortpflanzung und die Aufrufkonvention zwischen Compilern auf derselben Plattform, erfordern aber keine plattformübergreifende Kompatibilität...

Bestehende Einrichtungen:

  • Logische Blöcke, die direkt an der Ausführung des Programms beteiligt sind: ALU, Allzweckregister, Register für die Speicher/E/A-Zuordnung von E/A usw...

Verbraucher:

  • Sprachprozessoren Linker, Assembler...

Diese werden von denjenigen benötigt, die sicherstellen müssen, dass Build-Tool-Ketten als Ganzes funktionieren. Wenn Sie ein Modul in Assembler schreiben, ein anderes in Python, und statt Ihres eigenen Bootloaders ein Betriebssystem verwenden wollen, dann arbeiten Ihre "Anwendungs"-Module über "binäre" Grenzen hinweg und erfordern die Vereinbarung einer solchen "Schnittstelle".

C++-Namensmanipulation, da Objektdateien aus verschiedenen Hochsprachen in Ihrer Anwendung gelinkt werden müssen. Erwägen Sie die Verwendung der GCC-Standardbibliothek für Systemaufrufe zu Windows, die mit Visual C++ erstellt wurden.

ELF ist eine mögliche Erwartung des Linkers aus einer Objektdatei für die Interpretation, obwohl JVM eine andere Idee haben könnte.

Für eine Windows RT Store App, versuchen Sie nach ARM ABI zu suchen, wenn Sie wirklich wollen, dass einige Build-Tool-Kette zusammen arbeiten.

3voto

blue_whale Punkte 325

Ich habe auch versucht, ABI zu verstehen, und die Antwort von JesperE war sehr hilfreich.

Aus einer sehr einfachen Perspektive können wir versuchen, ABI zu verstehen, indem wir die Binärkompatibilität betrachten.

Das KDE-Wiki definiert eine Bibliothek als binärkompatibel, "wenn ein Programm, das dynamisch mit einer früheren Version der Bibliothek gelinkt ist, mit neueren Versionen der Bibliothek weiterläuft, ohne dass es neu kompiliert werden muss." Für weitere Informationen zum dynamischen Linken, siehe Statische Verknüpfung vs. dynamische Verknüpfung

Lassen Sie uns nun versuchen, nur die grundlegendsten Aspekte zu betrachten, die für die Binärkompatibilität einer Bibliothek erforderlich sind (unter der Annahme, dass es keine Änderungen am Quellcode der Bibliothek gibt):

  1. Gleiche/abwärtskompatible Befehlssatzarchitektur (Prozessorbefehle, Registerstruktur, Stack-Organisation, Speicherzugriffstypen sowie Größe, Layout und Ausrichtung der Basisdatentypen, auf die der Prozessor direkt zugreifen kann)
  2. Gleiche Anrufkonventionen
  3. Gleiche Konvention zur Namensumwandlung (dies könnte erforderlich sein, wenn z.B. ein Fortran-Programm eine C++-Bibliotheksfunktion aufrufen muss).

Sicherlich gibt es noch viele andere Details, aber das ist es, was die ABI auch abdeckt.

Um Ihre Frage genauer zu beantworten, können wir aus dem oben Gesagten ableiten:

ABI-Funktionalität: Binärkompatibilität

bestehende Einrichtungen: bestehende Programme/Bibliotheken/OS

Verbraucher: Bibliotheken, OS

Ich hoffe, das hilft!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X