web-dev-qa-db-fra.com

combiner deux fichiers objet .o compilés par GCC dans un troisième fichier .o

Comment peut-on combiner deux fichiers objets .o compilés par GCC dans un troisième fichier .o?

$ 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

Si vous avez accès aux fichiers source, le -combine L'indicateur GCC fusionnera les fichiers source avant la compilation:

$ gcc -c -combine a.c b.c -o c.o

Cependant, cela ne fonctionne que pour les fichiers source et GCC n'accepte pas .o fichiers en entrée pour cette commande.

Normalement, la liaison .o les fichiers ne fonctionnent pas correctement, car vous ne pouvez pas utiliser la sortie de l'éditeur de liens comme entrée pour celui-ci. Le résultat est une bibliothèque partagée et n'est pas lié statiquement à l'exécutable résultant.

$ 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
73

Qui passe -relocatable ou -r à ld créera un objet qui convient comme entrée de ld.

$ ld -relocatable a.o b.o -o c.o
$ gcc c.o other.o -o executable
$ ./executable

Le fichier généré est du même type que l'original .o des dossiers.

$ file a.o
a.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
$ file c.o
c.o: ELF 32-bit LSB relocatable, Intel 80386, version 1 (SYSV), not stripped
89

Si vous souhaitez créer une archive de deux ou plusieurs fichiers .o (c'est-à-dire une bibliothèque statique), utilisez la commande ar:

ar rvs mylib.a file1.o file2.o
8
anon