98 votes

combiner deux fichiers objets .o compilés par GCC en un troisième fichier .o

Comment combiner deux fichiers objets .o compilés par GCC en 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 sources, l -combine Le drapeau GCC fusionnera les fichiers sources 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 comme entrée pour cette commande.

Normalement, la liaison .o ne fonctionne 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 dans 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

2 votes

Gcc ne dispose pas actuellement d'un -combine option. Elle existe dans gcc 4.1.2 et n'existe pas dans gcc 6.3.0 (quelqu'un d'autre peut trouver quand elle a été supprimée).

115voto

Passing -relocatable o -r a ld créera un objet qui conviendra 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 le fichier original. .o des fichiers.

$ 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

2 votes

Est-il possible de faire l'opération inverse ? c'est-à-dire de produire a.o et b.o à partir de c.o ?

9 votes

@BertRegelink non, parce qu'il n'y a pas d'inverse unique, En termes de maths, ne forme pas de groupe :P

7 votes

Attention : --relocatable semble être moins portable. Le LD qui est livré avec Android NDK reconnaît seulement -relocatable . Si vous avez besoin d'être mobile, optez pour -r .

10voto

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

ar rvs mylib.a file1.o file2.o

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X