Ich verstehe nicht, warum der ABI ein wichtiger Kontext für die Entwicklung von User-Space-Anwendungen ist. Werden die Systemaufrufe für ein Betriebssystem als ABI betrachtet? Aber wenn das so ist, sind dann nicht alle Komplexitäten bezüglich Systemaufrufen in Standardbibliotheken eingekapselt?
Also ist ABI-Kompatibilität nur relevant für die Ausführung statisch verknüpfter Anwendungen auf verschiedenen Plattformen, da die Systemaufrufe in die Binärdatei eingebettet werden?
Ein ABI definiert eine Reihe von Alignment-, Aufrufkonventions- und Datentypen, die einem System gemeinsam sind. Dies macht eine ABI sehr wichtig, wenn Sie irgendeine Art von dynamischer Verknüpfung durchführen. wie ohne es hat Code von einer Anwendung keine Möglichkeit, Code von einem anderen aufgerufen.
Also, nein. ABI-Kompatibilität ist für alle dynamischen Verknüpfungen relevant (weniger für statische).
Es lohnt sich, erneut hervorzuheben , dass der ABI eines Systems die Arbeit zwischen Anwendungen sowie die Arbeit zwischen Anwendungen und Betriebssystemen beeinflusst.
Die ABI ist mehr als das, was Systemaufrufe verfügbar sind. In der Regel wird auch beschrieben, wie Argumente an Funktionen übergeben werden und wie Strukturen und Objekte im Speicher angeordnet werden. Ohne einen konsistenten ABI könnte Code, der von verschiedenen Compilern erstellt wurde, nicht in der Lage sein, sich gegenseitig aufzurufen - wenn Sie foo (a, b) aufrufen und ein Compiler a und b auf den Stack schiebt, während ein anderer die in Registern übergibt, haben Sie ein ABI Konflikt.
"ABI" (siehe Wikipedia ) ist ein Überbegriff für alle Annahmen, die ein Betriebssystem zu Datenformaten macht. Dies beinhaltet das Layout von ausführbaren Dateien und das von jeder Datenstruktur im Speicher bei seiner C-Definition.
Der Begriff umfasst im Allgemeinen auch Formatierungsanforderungen zwischen Programmen, die in derselben Sprache geschrieben sind. Jede Sprache hat bestimmte Merkmale, die zu unterschiedlichen Konventionen innerhalb ausführbarer Formate und Speicherstrukturen führen können, aber alle müssen schließlich ausführbare Dateien erzeugen, die mit dem Betriebssystem kompatibel sind, und Datenstrukturen, die mit dem Befehlssatz des Prozessors kompatibel sind.
ABI spielt keine Rolle, wenn Sie nur an der Erstellung von standardkonformem Code interessiert sind. Es spielt eine Rolle, wenn du gegen den Standard verstößt und unportable Dinge wie das Umwandeln von char *
in long *
macht. Es ist noch wichtiger beim Schreiben einer großen Menge von Assembler-Code. Wenn man etwas wie einen Linker oder einen Debugger schreibt, kann es den Großteil der Arbeit ausmachen.
Inkompatible ABI ist der Grund, warum OSX, Linux, Solaris, Windows und * BSD alle auf Intel x86-CPUs laufen, einem einfachen POSIX-Programm, das auf einem Betriebssystem kompiliert wurde und keine herstellerspezifischen oder proprietären Systemaufrufe verwendet / oder Bibliotheken können normalerweise nicht auf einem Betriebssystem ausgeführt werden, wenn sie für ein anderes Betriebssystem * kompiliert wurden.
ABI ist nicht wirklich wichtig für Programmierer als solche, weil wir bereits instinktiv wissen, dass Sie keine Windows-App auf Macs ausführen können. Selbst Nicht-Programmierer (außer Hollywood-Drehbuchautoren) wissen das. Es ist wichtig, Compiler-Autoren, wenn sie eine bestimmte Umgebung ansprechen müssen.
* Hinweis: Einige Betriebssysteme wie Linux und BSD unterstützen Fremd-ABI, so dass ein einfaches Linux-Befehlszeilenprogramm manchmal ohne Änderung auf BSD ausgeführt werden kann. Und es gibt natürlich Emulationsschichten wie Wein.
Vergessen Sie nicht in C ++, wie der Name Mangling als Teil des ABI implementiert wird
Nur wenn Sie möchten, dass Ihre Binärdatei in einer anderen Umgebung ohne Neukompilierung ausgeführt wird, gibt es einige Stellen, an denen Sie möglicherweise ABI berücksichtigen müssen:
Sie können eine dritte Bibliothek in Ihrem Programm aufrufen, und die dritte Bibliothek kann in verschiedenen Umgebungen variieren. (also nur der ABI, dem du vertrauen kannst)
der Systemaufruf an os. (Wenn Sie den Syscall statisch an Ihre Binärdatei gebunden haben, verknüpfen Sie diese dynamisch mit libc)
Tatsächlich müssen die meisten Entwickler ABI nicht berücksichtigen, nur der Entwickler des Binärladeprogramms / Tools muss mehr darüber wissen.
Systemaufrufe folgen auch einem ABI - die Syscall-Schnittstelle unterscheidet sich vom Betriebssystem zum Betriebssystem.
Durch das statische Verknüpfen Ihrer Anwendung mit der Standardbibliothek wird diese in einen syscall ABI eingebunden. Zum Beispiel erlaubt FreeBSD die Verwendung des Linux syscall ABI nur über ein Emulationsmodul.
Tags und Links c c++ operating-system abi binary-compatibility