Was ist der Unterschied zwischen .o-, .a- und .so-Dateien?

Lesezeit: 4 Minuten

Benutzeravatar von Utkarsh Srivastav
Utkarsh Srivastav

Ich weiss .o sind Objektdateien, .a sind statische Bibliotheken und .so sind dynamische Bibliotheken? Was ist ihre physikalische Bedeutung? Wann kann ich welche verwenden und wann nicht?

Benutzeravatar von Clifford
Clifford

.a ist ein “Archiv”. Obwohl ein Archiv jede Art von Datei enthalten kann, ist es im Kontext der GNU-Toolchain eine Bibliothek von Objektdateien (andere Toolchains, insbesondere unter Windows, verwenden .lib für den gleichen Zweck, aber das Format dieser ist normalerweise kein Allzweckarchiv und oft spezifisch für die Toolchain). Es ist möglich, einzelne Objektdateien aus einem Archiv zu extrahieren, was im Wesentlichen der Linker tut, wenn er die Bibliothek verwendet.

.o ist eine Objektdatei. Dies ist Code, der in Maschinencode kompiliert, aber (normalerweise) nicht vollständig verknüpft ist – er kann nicht aufgelöste Verweise auf Symbole enthalten, die in anderen Objektdateien (in einer Bibliothek oder einzeln) definiert sind, die durch separate Kompilierung generiert wurden. Objektdateien enthalten Metadaten zur Unterstützung der Verknüpfung mit anderen Modulen und optional auch für das symbolische Debugging auf Quellebene (z. B. in GDB). Andere Toolchains, wiederum typischerweise unter Windows, verwenden die Erweiterung .obj statt .o.

.so ist eine gemeinsam genutzte Objektbibliothek (oder nur gemeinsam genutzte Bibliothek). Dies wird dynamisch mit einer ausführbaren Datei verknüpft, wenn ein Programm gestartet wird, und nicht zur Erstellungszeit statisch verknüpft. Es ermöglicht kleinere ausführbare Dateien und eine einzelne Objektbibliotheksinstanz, die von mehreren ausführbaren Dateien verwendet werden kann. Betriebssystem-APIs sind typischerweise gemeinsam genutzte Bibliotheken, und sie werden häufig auch in GNU aus Lizenzgründen verwendet, um beispielsweise LGPL-Code von proprietärem Closed-Source-Code zu trennen (ich bin kein Anwalt – ich erhebe keinen Anspruch auf die Legitimität dieses Ansatzes in jede besondere Situation). nicht wie .o oder .a Dateien, .so Dateien, die von einer Anwendung verwendet werden, müssen auf dem Laufzeitsystem verfügbar sein. Andere Systeme (wieder typischerweise Windows) verwenden .dll (Dynamic Link Library) für den gleichen Zweck.

Es ist vielleicht nützlich, das zu verstehen .o Dateien sind verlinkt Vor Objektcode ein .a Dateien so, dass, wenn eine Symbolauflösung erfüllt ist durch a .o -Datei wird keine Bibliotheksimplementierung verknüpft – was es Ihnen ermöglicht, Bibliotheksimplementierungen im Wesentlichen durch Ihre eigenen zu ersetzen, und auch für Bibliotheksimplementierungen, um benutzerdefinierten Code aufzurufen – beispielsweise könnte ein GUI-Framework einen Anwendungseinstiegspunkt aufrufen.

  • Bezüglich “.o-Dateien werden vor dem Objektcode in .a gelinkt“, meinst du das geschieht unabhängig von der von dir angegebenen Reihenfolge?

    – Schrittmacher

    3. März 2017 um 18:40 Uhr

  • @Pacerier: Ja. In jeder Werkzeugkette, die mir je begegnet ist. Es ist möglicherweise nicht narrensicher. Wenn Sie sagen, Sie haben Code, der auf Symbole verweist a und b und Ihre definieren a in einem .o, um eine Bibliotheksimplementierung zu überschreiben, aber in der Bibliothek beides a und b werden in demselben Objektmodul definiert und verknüpfen dann das aufzulösende Bibliotheksobjekt b wird einziehen a widerspricht der bisherigen Definition. Wenn der Bibliotheksdesigner beabsichtigt die Symbole, die überschrieben werden sollen, dann sollten die Symbole deklariert werden weak um solche Probleme zu überwinden. Alternativ nur ein externes Symbol pro Objektmodul.

    – Clifford

    1. September 2021 um 18:38 Uhr

Benutzeravatar von Parvin Kumar
Parvin Kumar

Statische Bibliotheken sind Archive, die den Objektcode für die Bibliothek enthalten. Wenn dieser Code in eine Anwendung eingebunden wird, wird er in die ausführbare Datei kompiliert.

Gemeinsam genutzte Bibliotheken unterscheiden sich darin, dass sie nicht in die ausführbare Datei kompiliert werden. Stattdessen durchsucht der dynamische Linker einige Verzeichnisse nach den benötigten Bibliotheken und lädt diese dann in den Speicher. Mehr als eine ausführbare Datei kann gleichzeitig dieselbe gemeinsam genutzte Bibliothek verwenden, wodurch die Speichernutzung und die Größe der ausführbaren Datei reduziert werden. Allerdings gibt es dann weitere Dateien, die mit der ausführbaren Datei verteilt werden müssen. Sie müssen sicherstellen, dass die Bibliothek irgendwo auf dem System des Benutzers installiert ist, wo der Linker sie finden kann. Statisches Linken beseitigt dieses Problem, führt jedoch zu einer größeren ausführbaren Datei.

  • However, there are then more files to distribute with the executable. Im Idealfall ist genau das Gegenteil der Fall. Binäre Pakete auf zB Linux tragen offensichtlich nicht herum und versuchen immer wieder, Duplikate gängiger Bibliotheken zu installieren. Sie markieren eine Abhängigkeit und verpflichten den Benutzer, sie zu installieren. Selbst bei der Verteilung außerhalb eines Paketmanagers kann man oft davon ausgehen, dass entweder das System des Benutzers bereits über die erforderlichen Bibliotheken verfügt oder der Benutzer sie erwerben kann. Meistens ist es Windows, das die Dinge oft so schwierig macht, dass wir alle DLLs abgeben und neu verteilen. Was, äh … irgendwie den Punkt der dynamischen Verknüpfung zunichte macht

    – Unterstrich_d

    23. Oktober 2016 um 9:47 Uhr

.so sind gemeinsam genutzte Bibliotheksdateien. .a sind statische Bibliotheksdateien.

Sie können .a-Bibliotheken statisch verknüpfen und .so-Dateien zur Laufzeit dynamisch verknüpfen und laden, vorausgesetzt, Sie kompilieren und verknüpfen auf diese Weise.

.o sind Objektdateien (sie werden aus *.c-Dateien kompiliert und können verknüpft werden, um ausführbare Dateien, .a- oder .so-Bibliotheken zu erstellen. Lesen Sie mehr darüber hier

  • Gibt es nicht auch eine Möglichkeit, .a-Bibliotheken zur Laufzeit zu laden?

    – Schrittmacher

    3. März 2017 um 18:41 Uhr

1413550cookie-checkWas ist der Unterschied zwischen .o-, .a- und .so-Dateien?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy