Unterschied zwischen .a .o und .lo Datei

Antworten:

46

Die '.lo'-Datei ist ein Bibliotheksobjekt , das in eine gemeinsam genutzte Bibliothek integriert werden kann, und die' .o'-Datei ist eine Standardobjektdatei

Die .lo-Datei ist das libtool-Objekt , mit dem Libtool bestimmt, welche Objektdatei in eine gemeinsam genutzte Bibliothek integriert werden kann

DumbCoder
quelle
3
Bedeutet das, dass .o-Dateien NICHT in eine gemeinsam genutzte Bibliothek integriert werden können?
Raj
1
@ Raj Kumar - stackoverflow.com/questions/2583770/…
DumbCoder
8
Möchten Sie wirklich, dass alle Ihre Antworten in Form von Links vorliegen?
Fixee
@ Raj nein, das tut es nicht, diese Benennung ist Bequemlichkeit, keine Voraussetzung.
Slava
91

Unterschied zwischen .o, .a, .lo und .so.

Zusammenfassung

  • .o ist normalerweise eine Nicht-PIC-Objektdatei, die vom Compiler ausgegeben wird (vor der Linker-Phase). Bei Verknüpfung mit einer Exe wird der Code in die ausführbare Datei aufgenommen - wir binden zum Zeitpunkt der Verknüpfung.
  • .a ist normalerweise eine Archivbibliothek, die eine oder mehrere .o- Dateien [Nicht-PIC] enthält. Bei Verknüpfung mit einer Exe werden die bestimmten "* .o" -Dateien im Archiv in die ausführbare Datei eingefügt.
  • .lo ist im Allgemeinen ein "Bibliotheksobjekt", das PIC-Code enthält, unabhängig davon, ob es manuell mit gcc -fPIC oder mit libtool kompiliert wurde .
  • .so- Dateien sind "Shared Object" -Dateien. Sie enthalten PIC-Objekte.

Hinweis:

  • Wenn Sie statische ausführbare Dateien benötigen, verwenden Sie die Dateien ".o" und ".a".
  • Wenn Sie dynamische ausführbare Dateien benötigen / möchten, die zur Laufzeit an Bibliotheken gebunden werden , verwenden Sie die Dateien .lo und .so .

Einführung

Die obigen Antworten gefallen mir zwar, sie decken jedoch nicht das Formular .a / archive library ab. Hier werde ich alle drei mit dem Bonus ansprechen, auch in einem .so-Bibliotheksformat hinzuzufügen. Außerdem werde ich im Sinne von Stackexchange mehr Text verwenden, falls Links beschädigt werden (beachten Sie, dass ich für diesen Link keine Referenzlinks benötigte).

Dateityp .o

Beim Kompilieren einer O- Datei handelt es sich um eine Objektdatei, die den vom Compiler ausgegebenen Objektcode für die Zielplattform enthält. So erstellen Sie eine O- Datei:

gcc -c filename.c     <==== creates filename.o

Beachten Sie, dass in diesem Beispiel kein positionsunabhängiger Code (PIC) erstellt wurde. Wir betrachten dies als ein Objekt für die mögliche Aufnahme in eine statische Bibliothek oder ausführbare Datei. Das heißt, wenn wir eine ausführbare Datei mit einer .o- Datei verknüpfen , wird der Code in der .o-Datei in die ausführbare Datei eingefügt - er wird zur Erstellungszeit und nicht zur Laufzeit gebunden. Das heißt, die ausführbare Datei kann ohne Einbeziehung der O-Datei neu verteilt werden. Vorsichtsmaßnahme: Es ist üblich, dass die .o- Datei als Nicht-PIC betrachtet wird. Wir benennen normalerweise PIC-Objektdateien mit der Erweiterung .lo .

Dateityp .a

Der Dateityp .a ist eine " Archiv " -Bibliothek. Es enthält eine oder mehrere O-Dateien und wird normalerweise zum Erstellen statischer ausführbarer Dateien verwendet.

Wir verwenden den Befehl ar , um Archivbibliotheken zu bearbeiten. Unten in einem Beispiel, das (1) eine Archivbibliothek aus .o- Dateien erstellt, listet (2) den Inhalt einer auf.

Erstellen Sie die Bibliothek

$ ls *.o
a.o  b.o  c.o                 <=== the files going in the archive

$ ar q libmyStuff.a *.o       <=== put *.o files in an archive (or new one)
ar: creating libmyStuff.a    

$ ls *.a                      <=== just show the library created
libmyStuff.a

Zeigen Sie den Inhalt einer Archivbibliothek an

$ ar t libmyStuff.a
a.o
b.o
c.o

Dateityp .lo

Die Verwendung von .lo ist eine Konvention, die häufig für positionsunabhängige Objektdateien verwendet wird. Im aktuellen Verzeichnis erstellt der Befehl libtool compile sowohl eine .lo- Datei als auch eine .o- Datei, eine mit PIC-Code und eine ohne PIC-Code. Siehe die Ausgabe unten:

$ libtool compile gcc -c a.c
libtool: compile:  gcc -c a.c  -fPIC -DPIC -o .libs/a.o  <== PIC code
libtool: compile:  gcc -c a.c -o a.o >/dev/null 2>&1     <== Not-PIC code

$ ls a.lo a.o
a.lo  a.o       <=== a.lo contains the PIC code.

Beachten Sie auch, dass das Unterverzeichnis .libs mit ao darin erstellt wurde. Diese Datei ist trotz des Namens PIC-Code. Libtool hat diese Datei in das aktuelle Verzeichnis verschoben und die Erweiterung in .lo geändert .

Sie können .lo- Dateien jederzeit manuell erstellen , indem Sie beim Kompilieren die PIC-Option (en) für gcc verwenden. Verschieben Sie die resultierenden .o- Dateien in die Erweiterung .lo .

Dateityp .so

Konventionell impliziert .so eine Bibliotheksdatei "Shared Object". Wir legen PIC-Objektdateien in gemeinsam genutzten Bibliotheken ab. Im Vertrag mit .o und .a Dateien ist der Code nicht in der resultierenden kompilierten Datei enthalten , wenn wir mit .so Dateien verknüpfen . Das heißt, wir verwenden die Laufzeitbindung (wie im Fall .lo ). Es gibt mehr als eine Form der Laufzeitbindung, aber darauf werden wir hier nicht eingehen.

uDude
quelle
3
Gibt es ein Buch, das die Art von Informationen behandelt, die Sie in Ihrer Antwort erklärt haben? Ich kann nur nützliche praktische Informationen wie Ihren Beitrag in Foren usw. finden. Das Wissen ist fragmentiert und wird nie als kohärente Berichterstattung darüber dargestellt, wie Programme erstellt und ausgeführt werden.
Wandadars
1
Nee. * .lo-Dateien sind lesbare Nur-Text-Dateien, die den Namen des Bildobjekts und des Nicht-Bildobjekts enthalten. PIC-Code ist normalerweise in .libs/a.ound und Nicht- PIC ist in a.o. Libtool erstellt also 3 Dateien: 2 Objektdateien ( .o), eine PIC- und eine Nicht + .lo-Datei, die beschreibt, wo sich die Dateien befinden.
Łukasz Daniluk
1
@wandadars: Schauen Sie sich "Linkers and Loaders" von John R. Levine an linker.iecc.com
Heinrich Hartmann
Dies ist eine Antwort von viel höherer Qualität und sollte akzeptiert werden.
Mayank Sharma
4

Die .loDatei ist ein Bibliotheksobjekt, das in eine gemeinsam genutzte Bibliothek integriert werden kann, und die .oDatei ist eine Standardobjektdatei. Weitere Informationen: Wie installiere und verwende ich die gemeinsam genutzte Bibliothek von libtool (.lo-Dateien)?

Nav
quelle
1
Bedeutet das, dass .o-Dateien NICHT in eine gemeinsam genutzte Bibliothek integriert werden können?
Raj
5
Der wichtigste technische Unterschied besteht darin, dass eine .lo-Datei verschiebbaren Code (-fPIC in GCC) enthalten sollte, eine .o-Datei jedoch möglicherweise nicht.
Kusma