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.

2voto

rps Punkte 151

A. Eine Gemeinsamkeit zwischen einer ABI und einer API ist, dass es sich um eine Schnittstelle handelt. Ein wiederverwendbares Programm stellt eine stabile Schnittstelle (API) zur Verfügung, die zur Wiederverwendung des Programms in einem anderen Programm verwendet werden kann.

B. Eine ABI ist jedoch eine Schnittstelle, die für eine bestimmte Prozessorplattform und eine bestimmte Sprache herausgegeben wird. Alle Compiler-Anbieter, die diese Plattform für dieselbe Sprache anvisieren wollen, müssen sicherstellen, dass nicht nur der kompilierte Code in Form von verschiebbarem Objektcode mit der Schnittstelle übereinstimmt, um miteinander verknüpft und vernetzt werden zu können, sondern dass auch die ausführbaren Dateien damit übereinstimmen, damit sie überhaupt auf der Plattform ausgeführt werden können. Die ABI ist also ein viel breiterer Satz von Spezifikationen/Standards als eine typische Funktions-API. Sie kann einige API-Objekte enthalten, die den Sprachbenutzern vom Compiler auferlegt werden. Der Compiler-Anbieter muss die Unterstützung für diese Objekte in seine Distributionen aufnehmen. Es versteht sich von selbst, dass der Hersteller der Plattform die rechtmäßige Autorität ist, ABIs für seine Plattform herauszugeben. Sowohl Compiler-Anbieter als auch ABIs müssen dem entsprechenden Sprachstandard (z. B. dem ISO-Standard für C++) entsprechen.

C. A Definition einer ABI durch einen Plattformanbieter ist:

"1. die Spezifikationen, denen eine ausführbare Datei entsprechen muss, um in einer bestimmten Ausführungsumgebung ausgeführt werden zu können. Zum Beispiel die Linux ABI für die Arm-Architektur.

  1. Ein bestimmter Aspekt der Spezifikationen, dem unabhängig produzierte, verschiebbare Dateien entsprechen müssen, um statisch linkbar und ausführbar zu sein. Zum Beispiel die C++ ABI für die Arm-Architektur, die Runtime ABI für die Arm-Architektur, die C Library ABI für die Arm-Architektur.

D. Zum Beispiel. Eine generische ABI für C++, die auf der Itanium-Architektur basiert, wurde ebenfalls ausgestellt durch ein Konsortium. Inwieweit die eigenen ABIs der Plattform-Anbieter für C++ damit übereinstimmen, liegt ganz bei den Plattform-Anbietern.

E. Ein weiteres Beispiel. Die C++ ABI für die Arm-Architektur ist aquí .

F. Unter der Haube ist es jedoch die ABI einer Prozessorarchitektur, die sicherstellt, dass die API zwischen einem wiederverwendbaren Programm und einem anderen Programm, das es wiederverwendet, für diese Prozessorarchitektur funktioniert.

G. Das bringt uns zu dienstorientierten Komponenten (z.B. SOAP-basierte Webdienste). Auch hier muss eine API zwischen einem SOAP-basierten Webdienst und einem Client-Programm (z. B. einer Anwendung, einem Front-End oder einem anderen Webdienst) bestehen, damit das Client-Programm den Webdienst wiederverwenden kann. Sie ist nicht auf eine bestimmte Prozessorplattform ausgerichtet und ist daher nicht "binär" wie ABI. Ein Client-Programm auf einem beliebigen Plattformtyp und in einer beliebigen Sprache kann einen Webdienst, der in einer beliebigen anderen Sprache geschrieben wurde und auf einer völlig anderen Prozessorplattform gehostet wird, aus der Ferne wiederverwenden. Dies wird durch die Tatsache ermöglicht, dass sowohl WSDL als auch SOAP textbasierte (XML) Protokolle sind. Im Falle von RESTful-Webdiensten fungiert das Transportprotokoll http - ebenfalls ein textbasiertes Protokoll - selbst als API (CRUD-Methoden).

1voto

smwikipedia Punkte 56976

Kurz und gut, in der Philosophie sind nur Dinge mit einem freundlich können gut miteinander auskommen, und die ABI könnte als die freundlich welche Softwareprodukte zusammenarbeiten.

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