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
È possibile eseguire l'operazione inversa? cioè a.o e b.o da c.o? –
@BertRegelink no, perché non esiste alcuna inversa univoca, In termini matematici, non forma gruppo: P –
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'. –