Wie kombiniert man zwei GCC-kompilierte .o-Objektdateien zu einer dritten .o-Datei?
$ gcc -c a.c -o a.o
$ gcc -c b.c -o b.o
$ ??? a.o b.o -o c.o
$ gcc c.o other.o -o executable
Wenn Sie Zugriff auf die Quelldateien haben, -combine
werden die Quelldateien vor dem Kompilieren mit dem GCC-Flag zusammengeführt:
$ gcc -c -combine a.c b.c -o c.o
Dies funktioniert jedoch nur für Quelldateien und GCC akzeptiert dies nicht .o
Dateien als Eingabe für diesen Befehl.
Normalerweise .o
funktioniert das Verknüpfen von Dateien nicht ordnungsgemäß, da Sie die Ausgabe des Linkers nicht als Eingabe dafür verwenden können. Das Ergebnis ist eine gemeinsam genutzte Bibliothek und nicht statisch mit der resultierenden ausführbaren Datei verknüpft.
$ gcc -shared a.o b.o -o c.o
$ gcc c.o other.o -o executable
$ ./executable
./executable: error while loading shared libraries: c.o: cannot open shared object file: No such file or directory
$ file c.o
c.o: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped
$ file a.o
a.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
gcc
compiler-construction
linker
ld
object-files
Lucian Adrian Grijincu
quelle
quelle
-combine
Option. Es existiert in gcc 4.1.2 und existiert nicht in gcc 6.3.0 (jemand anderes kann herausfinden, wann es entfernt wurde).Antworten:
Durch Übergeben von
-relocatable
oder-r
anld
wird ein Objekt erstellt, das als Eingabe von geeignet istld
.Die generierte Datei ist vom gleichen Typ wie die Originaldateien
.o
.quelle
--relocatable
scheint weniger tragbar zu sein. Das mit Android NDK gelieferte ld erkennt nur-relocatable
. Wenn Sie Portabilität benötigen, bleiben Sie bei-r
.-relocatable
und-r
, aber nicht--relocatable
. Danke fürs klarstellen!Wenn Sie ein Archiv mit zwei oder mehr O-Dateien (dh einer statischen Bibliothek) erstellen möchten, verwenden Sie den folgenden
ar
Befehl:quelle
objcopy
die resultierende Datei ausführen und einige Arten von Symbolen lokal für die Datei erstellen, damit sie extern nicht sichtbar sind. Einige der Symbole, die lokalisiert werden müssen, werden zwischen den Dateiena.o
und referenziertb.o
. Ich kann einzelne Dateien nicht lokalisieren, da die Symbole zum Zeitpunkt des Linkers nicht gefunden würden, und ich kann auch keine Symbole aus dem statischen Archiv lokalisieren.