Domanda

Sto cercando di risparmiare spazio nella mia eseguibile e ho notato che diverse funzioni sono stati aggiunti nei miei file oggetto, anche se non ho mai li chiamo (il codice è da una libreria).

C'è un modo per dire gcc per rimuovere queste funzioni automaticamente o devo rimuovere manualmente?

È stato utile?

Soluzione 4

Da quando ho fatto questa domanda, GCC 4.5 è stato rilasciato, che include un'opzione per unire tutti i file in modo che sembra che è solo 1 file sorgente gigantesca. Utilizzando questa opzione, è possibile togliere facilmente le funzioni inutilizzate.

qui

Altri suggerimenti

Se si compila in file oggetto (non eseguibili), poi un compilatore non potrà mai togliere qualunque funzioni non static, dal momento che è sempre possibile si collegare il file oggetto contro un altro file oggetto che chiamerà quella funzione. Quindi, il primo passo dovrebbe essere dichiarato come molte funzioni possibili static.

In secondo luogo, l'unico modo per un compilatore per rimuovere le funzioni inutilizzate sarebbe quello di collegare in modo statico il vostro eseguibile. In tal caso, esiste almeno la possibilità che un programma potrebbe venire avanti e figura fuori dalle funzioni utilizzate e quali non vengono utilizzati.

Il problema è, io non credo che gcc in realtà fa questo tipo di ottimizzazione cross-modulo. La cosa migliore è la bandiera -Os per ottimizzare la dimensione del codice, ma anche allora, se si dispone di un file oggetto abc.o che ha alcune funzioni non statici inutilizzati e si collega staticamente contro alcuni def.exe eseguibile, non credo che gcc andrà a nudo fuori il codice per le funzioni non utilizzate.

Se veramente un disperato bisogno di questo per essere fatto, penso che potrebbe essere necessario #include in realtà i file insieme in modo che dopo il passo preprocessore, si traduce in un unico file .c in fase di compilazione. Con gcc compilazione di un singolo file sorgente jumbo mostruosa, vi levate in piedi le migliori possibilità di funzioni non utilizzate essere eliminato.

Hai guardato a chiamare gcc con -Os (massima dimensione.) Non sono sicuro se le strisce di codice non raggiunti, ma sarebbe abbastanza semplice da test. Si potrebbe anche, dopo aver ottenuto la schiena eseguibile, 'strip' esso. Sono sicuro che c'è un gcc-riga di comando arg a fare la stessa cosa -? E '--dead_strip

Oltre a -Os di ottimizzare per dimensione, questo link può essere di aiuto.

IIRC il linker di default fa ciò che si vuole in di alcuni casi specifici. Il corto di esso è che i file di libreria contengono un gruppo di file di oggetti e file solo referenziati sono collegati. Se si riesce a capire come ottenere GCC di emettere ogni funzione in esso il proprio file oggetto e poi costruire questo in una libreria si dovrebbe ottenere quello che stai cercando.

So solo di un compilatore che può effettivamente fare questo: qui (sguardo alla bandiera -LIB)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top