2010-06-05 23 views
67

Comment combiner deux fichiers objet .o compilés par GCC dans un troisième fichier .o?combine deux fichiers objet .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 à la source les fichiers que le drapeau -combine 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 comme entrée pour cette commande.

Normalement, la liaison de fichiers .o ne fonctionne pas correctement, car vous ne pouvez pas utiliser la sortie de l'éditeur de liens comme entrée. Le résultat est une bibliothèque partagée et n'est pas lié statiquement dans l'exécutable résultant. (.-à-dire une bibliothèque statique)

$ 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 

Répondre

78

En passant -r (ou --relocatable) à ld va créer un objet qui convient comme entrée de ld.

$ ld -r 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 les fichiers .o d'origine.

$ 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 
+1

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

+5

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

+2

Attention: '--relocatable' semble être moins portable. Le ld qui vient avec Android NDK reconnaît seulement '-relocatable'. Si vous avez besoin de la portabilité, tenez-vous en '-r'. –

6

Si vous souhaitez créer une archive de deux ou plusieurs fichiers .o utiliser la commande ar:

ar rvs mylib.a file1.o file2.o 
+0

@Lucian Mais pourquoi voudriez-vous faire cela? Une bibliothèque statique est beaucoup plus pratique à lier qu'un fichier .o. –

+1

Je dois exécuter 'objcopy' sur le fichier résultant et rendre certains types de symboles locaux au fichier afin qu'ils ne soient pas visibles de l'extérieur. Certains des symboles qui doivent être localisés sont référencés entre les fichiers 'a.o' et' b.o'. Je ne peux pas localiser les fichiers individuels - car les symboles ne seraient pas trouvés au moment de l'éditeur de liens - et je ne peux pas non plus localiser les symboles de l'archive statique. –