Domanda

Su 'C', Linux,

Sono necessarie librerie statiche per il collegamento statico o quelle condivise di cui ho bisogno? In caso contrario, perché no? (Non contengono gli stessi dati?)

È stato utile?

Soluzione

Sì, sono necessarie librerie statiche per creare un eseguibile collegato staticamente.

Le librerie statiche sono fasci di oggetti compilati. Quando si collega staticamente alla libreria, è effettivamente lo stesso che prendere i risultati della compilazione di quella libreria, decomprimerli nel progetto corrente e usarli come se fossero i propri oggetti.

Le librerie dinamiche sono già collegate. Ciò significa che alcune informazioni come i trasferimenti sono già state sistemate e eliminate.

Inoltre, le librerie dinamiche devono essere compilate come codice indipendente dalla posizione. Questa non è una limitazione per le librerie statiche e comporta una differenza significativa nelle prestazioni su alcune piattaforme comuni (come x86).

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

Altri suggerimenti

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

Le librerie statiche e dinamiche possono contenere o meno le stesse informazioni, a seconda di numerosi fattori. La decisione se collegare staticamente o dinamicamente il codice è importante e influenzerà spesso l'architettura dell'applicazione.

Tutte le librerie collegate in un programma collegato staticamente devono essere la variante statica. Mentre le librerie dinamiche (libfoo.so) e statiche (libfoo.a) hanno le stesse funzioni, sono file di formato diverso e quindi hai bisogno del tipo corrispondente per il tuo programma.

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

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