2010-06-05 9 views
67

Come si combinano due file oggetto .o compilati GCC in un terzo file .o?combina due file oggetto .o compilati GCC in un terzo file .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 

Se si ha accesso alla fonte dei file bandiera -combine GCC unire i file di origine prima della compilazione:

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

Tuttavia questo funziona solo per i file di origine, e GCC non accetta .o file come input per questo comando.

In genere, il collegamento dei file .o non funziona correttamente, poiché non è possibile utilizzare l'output del linker come input per tale file. Il risultato è una libreria condivisa e non è collegata staticamente all'eseguibile risultante. (. cioè una libreria statica)

$ 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 

risposta

78

Passing -r (o --relocatable) per ld creerà un oggetto adatto come input di ld.

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

Il file generato è dello stesso tipo dei .o file originali.

$ 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

È possibile eseguire l'operazione inversa? cioè a.o e b.o da c.o? –

+5

@BertRegelink no, perché non esiste alcuna inversa univoca, In termini matematici, non forma gruppo: P –

+2

Avviso: '--relocatable' sembra essere meno portabile. Il ld che viene fornito con Android NDK riconosce solo '-relocatable'. Se hai bisogno di portabilità, rimani a '-r'. –

6

Se si desidera creare un archivio di due o più file .o utilizzare il comando ar:

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

@Lucian Ma perché vorresti farlo? Una libreria statica è molto più comoda da collegare rispetto a un file .o. –

+1

Ho bisogno di eseguire 'objcopy' sul file risultante e rendere alcuni tipi di simboli locali al file in modo che non siano visibili esternamente. Alcuni dei simboli che devono essere localizzati sono referenziati tra i file 'a.o' e' b.o'. Non riesco a localizzare i singoli file - poiché i simboli non si trovano al momento del linker - e non riesco a localizzare i simboli dall'archivio statico. –