2010-04-09 10 views
9

Per un motivo voglio decomprimere una lib statica (libx.a) in singoli file oggetto (ao bo co) e specificare questi file oggetto (ao bo co) nell'input del linker elenca invece di libx.a, con le altre opzioni del linker che rimangono le stesse.collegamento con libreria statica rispetto a singoli file oggetto

Tuttavia, ho notato che il cambiamento sopra riportato ha prodotto alcune differenze nell'eseguibile di output. Fondamentalmente, il metodo (a.o b.o c.o) si tradurrà in una maggiore dimensione di output.

Quindi qual è la differenza tra i due metodi (libx.a e singoli file oggetto)? E c'è un modo per aggirare?

Il binutil GNU (e ar ld) versione che sto utilizzando è 2.16.1

Grazie.

+0

Che cosa stai cercando di ottenere dividendo i singoli file oggetto? –

+0

Il motivo originale era che volevo specificare la sezione di output per una lib statica nello script del linker. E per qualche ragione, la sintassi dell'archivio (libx.a: *. O (.text)) non funziona, probabilmente a causa della versione binutil scaduta nella mia catena di strumenti. Poiché non è stato possibile aggiornare la catena di strumenti, ho dovuto decomprimere la libreria e utilizzare i file oggetto in modo semplice. Ed è così che mi sono imbattuto in questo problema. – user313031

risposta

10

Ld rimuove le parti inutilizzate degli archivi .lib collegati (come le variabili con collegamento globale). Questa ottimizzazione non può avvenire quando i file oggetto vengono passati direttamente, poiché il linker non è in grado di determinare se alcuni elementi non referenziati di un file .o sono necessari da qualche parte sconosciuta in seguito (ad esempio perché sarebbe esternamente visibile dall'elenco di esportazione del modulo) o può essere rimosso completamente. Quando un .lib viene messo in atto nel processo di collegamento, il linker sa per certo che può eliminare elementi non necessari.

+0

Non dubito che quello che dici sia vero, ma deve essere qquirk di ld specificamente. Per quanto posso vedere, a condizione che tu sia nella fase di collegamento finale, ld dovrebbe essere in grado di fare lo stesso codice morto con i file .o come con un file .a. –

+0

La differenza tra i file .lib e .o è che ld tratta i file .o non presenti nei file .lib come discardabili, mentre tutti i file .o vengono inclusi nell'output. Questo perché esistono simboli speciali (ad esempio costruttori C++) che vengono raggruppati in sezioni speciali da ld (anche quando non sono referenziali) per eseguire funzioni speciali. Esiste anche un interruttore (--whole-archive) per istanziare ogni file .o senza riferimento dai file .lib, ma non so se c'è un passaggio per rilasciare file .o non necessari. – Rudi

+0

Grazie a tutti. È bello saperlo. Ma questo significa che se collego sempre i singoli file oggetto a una libreria statica prima di collegare l'eseguibile finale, è più probabile che ottenga un output più piccolo (se ci fosse codice/dati non referenziati)? E se ciò è vero, può essere una tecnica utile (sembra però controintuitiva). E torna al mio problema originale (non posso specificare output seciton per le librerie statiche nello script linker), c'è un modo per aggirare il problema? Grazie. – user313031

Problemi correlati