2016-05-17 10 views
5

Mi chiedo se le opzioni di gcc linker (ad esempio: -Wl, opzioni) possono modificare le istruzioni di assembler nell'eseguibile compilato, come questo accade se si utilizzano determinate opzioni di ottimizzazione di gcc? La differenza tra l'utilizzo di un'opzione linker e il non utilizzo può essere vista quando si confrontano i file binari compilati (ad esempio confrontando le firme)?Le opzioni di gcc linker possono modificare le istruzioni dell'assembler nel file binario compilato?

UPDATE

Per essere più precisi voglio capire se FLIRT firme cambiano quando uso alcune opzioni di collegamento durante il processo di compilazione. Queste firme usano solo le funzioni di libreria per creare le firme.

+1

Vedere ad es. '--wrap'. – Phillip

+0

@Phillip puoi spiegarlo più precisamente? – Maximilian

+0

La pagina man ha dettagli sull'opzione; può essere usato per sovrascrivere i simboli, che, almeno per i file oggetto C, possono anche cambiare la firma della funzione. – Phillip

risposta

4

Per alcune opzioni del linker, i cambiamenti possono essere visti nel binario prodotto, ad esempio:

  • Opzioni sbarazzarsi di/mantenere i simboli di debug (--strip-all, --strip-debug, --discard-all)
  • Opzioni di sbarazzarsi di/mantenere sezioni inutilizzate, ad es una sezione contenente una funzione che non viene mai citata in altre sezioni. Queste sezioni possono essere facilmente rimosse. O per mantenere sezioni/contenuti di delocalizzazione. (--as-needed, --emit-relocs)
  • opzioni per includere una libreria statica o altro compatibile (ad esempio versione della libreria x.0 vs versione x.1)
  • L'ordine in cui oggetti e librerie statiche sono posizionati sulla riga di comando. Per esempio ld -o foo a.obj b.obj c.obj e ld -o foo a.obj c.obj b.obj sarà probabilmente produrre un binario diverso se una chiamata da una a una funzione in c viene risolto (l'offset per il codice c.obj e quindi l'indirizzo della funzione in c sarà probabilmente essere differente

Ma anche dopo il collegamento, la firma di un file binario potrebbe cambiare. Ad esempio in Linux, quando si ottimizza il tempo di avvio binario eseguendo prelink

+0

attualmente sono interessato solo ai cambiamenti nel binario sul livello di funzione. Se vengono modificati specifici simboli di debug, questo non cambierà il codice assembly delle funzioni. Potete immaginare uno scenario in cui il codice assembly sulla base delle funzioni cambia utilizzando le opzioni del linker? – Maximilian

+3

Sì, le chiamate ad altri oggetti possono essere risolte in offset/indirizzi diversi in base all'ordine o all'ordine delle librerie statiche o alle diverse versioni di una libreria. – Elijan9

+0

ma le funzioni all'interno di una libreria statica rimarranno intatte, giusto? – Maximilian

1

Sì, verrà visualizzato un checksum differente su due file binari collegati con diverse opzioni del linker, a meno che l'opzione non abbia avuto alcun effetto, ad esempio quando si specifica un valore predefinito opzione o un'opzione che non cambia il binario (-print-map).

Cosa stai cercando di capire esattamente? Sembra che tu stia avendo problemi quando specifichi determinate opzioni di linker e stai cercando di capire perché. Dicci di più e forse possiamo dare una migliore assistenza.

+0

vedi aggiornamento sopra – Maximilian

Problemi correlati