combina due file oggetto .o compilati da GCC in un terzo file .o


84

Come si combinano due file oggetto .o compilati da GCC in un terzo file .o?

Se hai accesso ai file di origine, il -combineflag GCC unirà i file di origine prima della compilazione:

Tuttavia, questo funziona solo per i file sorgente e GCC non accetta i .ofile come input per questo comando.

Normalmente, il collegamento dei .ofile non funziona correttamente, poiché non è possibile utilizzare l'output del linker come input per esso. Il risultato è una libreria condivisa e non è collegato staticamente all'eseguibile risultante.


1
gcc attualmente non ha -combineun'opzione. Esiste in gcc 4.1.2 e non esiste in gcc 6.3.0 (qualcun altro può capire esattamente quando è stato rimosso).
Keith Thompson,

Risposte:


98

Passare -relocatableo -ra ldcreerà un oggetto adatto come input di ld.

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


2
È possibile eseguire l'operazione inversa? cioè produrre ao e bo da co?
Bert Regelink

7
@BertRegelink no, perché non esiste un inverso univoco, in termini matematici, non forma un gruppo: P
Alec Teal,

7
Attenzione: --relocatablesembra essere meno portabile. Il ld fornito con Android NDK riconosce solo -relocatable. Se hai bisogno di portabilità, attieniti a -r.
Martin Bonner sostiene Monica

3
@matthijs La parola è la stessa; la differenza è uno meno o due.
Martin Bonner supporta Monica il

1
Ah, non l'ho visto. Quindi, Android NDK riconosce solo -relocatable e -r , ma non --relocatable. Grazie per il chiarimento!
Matthijs Kooijman

10

Se vuoi creare un archivio di due o più file .o (cioè una libreria statica) usa il arcomando:


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

5
Devo eseguire objcopysul file risultante e rendere alcuni tipi di simboli locali nel file in modo che non siano visibili esternamente. Alcuni dei simboli che devono essere localizzati sono referenziati tra i file a.oe b.o. Non riesco a localizzare singoli file - poiché i simboli non verrebbero trovati al momento del linker - e non posso nemmeno localizzare simboli dall'archivio statico.
Lucian Adrian Grijincu
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.