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
Est-il possible de faire l'opération inverse? c'est-à-dire produire a.o et b.o à partir de c.o? –
@BertRegelink non, car il n'y a pas d'inverse unique, En termes de maths, ne forme pas un groupe: P –
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'. –