2009-06-20 17 views

risposta

10

Sì, sono necessarie librerie statiche per creare un eseguibile collegato in modo statico.

Le librerie statiche sono pacchetti di oggetti compilati. Quando si collega staticamente alla libreria, è effettivamente uguale a prendere i risultati della compilazione di quella libreria, decomprimerli nel progetto corrente e usarli come se fossero oggetti personali.

Le librerie dinamiche sono già collegate. Ciò significa che alcune informazioni come le delocalizzazioni sono già state risolte e eliminate.

Inoltre, le librerie dinamiche devono essere compilate come codice indipendente dalla posizione. Questa non è una restrizione sulle librerie statiche e si traduce in una differenza significativa nelle prestazioni su alcune piattaforme comuni (come x86).

Esistono strumenti come ELF Statifier che tentano di raggruppare le librerie collegate dinamicamente in un eseguibile collegato dinamicamente, ma è molto difficile generare un risultato correttamente funzionante in tutte le circostanze.

+1

Grazie per l'ottima risposta. Ma perché è così difficile? –

+2

Statfier ELF carica l'eseguibile e tutte le sue librerie, quindi acquisisce un'istantanea della memoria del processo. Quando viene eseguita l'immagine di output, qualsiasi cosa che possa causare il cambiamento del layout della memoria (ad esempio VDSO randomizzato) causerà un funzionamento errato. Qualsiasi altro approccio richiede la reinvenzione del linker dinamico. – ephemient

+1

Perché sarebbe difficile reimplementare il linker dinamico? Non ci sono solo due tabelle delle importazioni e delle esportazioni della biblioteca, da spostare? È il linker, quindi sta già implementando un linker statico e conosce il formato del file dell'eseguibile e della libreria dinamica, ecc. – ChrisW

6

Non esiste la compilazione statica, solo il collegamento statico. E per questo, hai bisogno di librerie statiche. La differenza tra il collegamento statico e dinamico è che con il primo i nomi vengono risolti al momento del collegamento (subito dopo la compilazione), mentre con quest'ultimo, vengono risolti proprio mentre il programma inizia a funzionare.

Le librerie statiche e dinamiche possono o meno contenere le stesse informazioni, a seconda di molti fattori. La decisione se collegare in modo statico o dinamico il tuo codice è importante e spesso influenzerà l'architettura dell'applicazione.

+0

Grazie, corretto 'compilare' in 'collegamento'. –

2

Tutte le librerie collegate a un programma collegato in modo statico devono essere la variante statica. Mentre le librerie dinamiche (libfoo.so) e statiche (libfoo.a) hanno in sé le stesse funzioni, sono file di formato diversi e quindi è necessario il tipo corrispondente per il proprio programma.

1

Un'altra opzione è Ermine (http://magicErmine.com) È come un indicatore, ma in grado di gestire la randomizzazione della memoria.

+0

Ottimo prodotto, grazie. –

Problemi correlati