2017-08-04 4 views
3

Sind gcc und clang so entworfen, dass sie das gleiche Speicherlayout für eine gegebene Strukturdefinition erzeugen?Erzeugen clamg und gcc dasselbe Speicherlayout für eine gegebene Strukturdefinition?

Offensichtlich ist das genaue Speicherlayout von Strukturen nicht vom C-Standard vorgeschrieben, aber gcc und clang können aus anderen Gründen immer noch das gleiche Speicherlayout erzeugen. Vielleicht wurde clang explizit dafür entworfen, um mit gcc kompatibel zu sein. Vielleicht gibt es einen anderen Standard, der beiden ähnlich ist, ähnlich der Situation mit dem Namen Mangling und dem Itanium ABI.

+2

Hm. Würde "Nein" als Antwort gelten? –

+2

Ja. Wenn die Antwort nein ist, dann würde ein einfaches Gegenbeispiel genügen. (Noch besser wäre eine allgemeine Beschreibung, wenn sie es nicht tun, aber das ist nur für extra Kredit.) – Praxeolitic

+1

Ziemlich sicher, dass dies ein Teil der ABI ist; Andernfalls könnte Code, der von verschiedenen Compilern erzeugt wird, keine Strukturen hin- und hergeben. – melpomene

Antwort

0

Ja, Sie können sich darauf verlassen, dass Clang und GCC dasselbe Layout für identische Strukturen erstellen. Ich kann nicht herausfinden, welche Schicht des Plattformstapels das Strukturlayout gerade definiert, aber es ist ein erklärtes Ziel von Clang unter Linux, mit Bibliotheken zu verlinken, die mit GCC kompiliert wurden.

Sie können sich auf die list of incompatibilities between Clang and GCC beziehen.

+0

Während ich denke, dass "Ja" die Antwort ist, weiß ich nicht, ob verschiedene Strukturlayouts als eine Inkompatibilität betrachtet würden. (Huh ... habe gerade bemerkt, dass ich "kompatibel" in meiner Frage verwendet habe ...) Es sieht so aus, als ob diese Liste für Inkompatibilitäten in was clang und gcc akzeptieren und kompilieren. – Praxeolitic

+0

Diese Antwort wäre besser, wenn sie klingende Dokumentation zitiert, um sie zu unterstützen. Die Liste der Inkompatibilitäten, die verknüpft ist, scheint über die * Sprach * -Kompatibilität zu bestehen, nicht über die Binärkompatibilität, und insofern das Strukturlayout implementierungsabhängig ist, handelt es sich um ein Binärkompatibilitätsinteresse. –

+1

Wenn wir uns https://github.com/hjl-tools/x86-psABI/wiki/x86-64-psABI-r252.pdf auf Seite 15 ansehen, werden die Ausrichtung und das Auffüllen zwar vorgeschrieben, aber nicht vorgeschrieben Inhalt der Auffüllung. –

0

Für die einfachen Fälle (keine Bitfelder, keine Übergabe von Strukturen durch Wert oder Rückgabe von ihnen, kein C++) und die gleiche Architektur, das Layout ist das gleiche. Für die komplexen Angelegenheiten (Bitfelder, Aufrufkonventionen) gibt es einige Unterschiede, aber sie sind nicht größer als die zwischen verschiedenen Versionen von GCC, und beide Compiler versuchen, ihre jeweiligen ABIs auszurichten.

Während die C- und C++ - Standards keine ABI definieren, gibt es separate ABI-Standards für diese Sprachen, z. B. das System V psABI und seine Architekturergänzungen und das Itanium C++ ABI (was nur ein historischer Name ist der Standard Clang/GCC C++ ABI).

1

Es ist ein grundsätzlich unvereinbar Fall: auf Windows, da MinGW (GCC) und MSVC nicht kompatibel ist, Klappern können nur mit einem von ihnen zu einer Zeit (wenn auch mit vieler Arbeit kompatibel sein, ist es möglich zu Lass sie kommunizieren).

+0

Interessant. Quelle? – Praxeolitic

+0

Meistens ist es "Allgemeinwissen" unter Compiler-Nerds ... gibt es https://clang.llvm.org/docs/UsersManual.html#operating-system-features-and-limitations und https://clang.llvm.org /doxygen/ToolChains_8h_source.html (separate Klassen) – o11c

+0

Allgemeine Informationen und Problemumgehungen finden Sie z http://www.mingw.org/wiki/Interoperability_of_Libraries_Created_by_Different_Compiler_Brands – o11c

Verwandte Themen