Linux Nozioni di base: le Librerie Statiche vs Librerie Dinamiche

Erika Caoili

Seguire

Dec 17, 2019 · 4 min leggere

Foto di Edwin Andrade su Unsplash

che Cosa è una biblioteca in Linux?

Perché usiamo le librerie?

Come creare una libreria statica e dinamica?

Come e perché li usiamo?

Una libreria in Linux

Una libreria è una raccolta di pezzi di codice precompilati chiamati funzioni. La libreria contiene funzioni comuni e insieme formano un pacchetto chiamato libreria. Le funzioni sono blocchi di codice che vengono riutilizzati in tutto il programma. Utilizzando i pezzi di codice di nuovo in un programma consente di risparmiare tempo. Impedisce al programmatore di riscrivere il codice più volte. Per i programmatori, le librerie forniscono funzioni riutilizzabili, strutture dati, classi e così via.

“Ad esempio, se si sta creando un’applicazione che deve eseguire operazioni matematiche, non è necessario creare una nuova funzione matematica per questo, è sufficiente utilizzare le funzioni esistenti nelle librerie per quel linguaggio di programmazione.”(“Comprendere le librerie condivise in Linux”)

Una libreria non è eseguibile e questa è una differenza fondamentale rispetto ai processi e alle applicazioni. Le librerie svolgono il loro ruolo in fase di esecuzione o di compilazione. Nel linguaggio di programmazione C, abbiamo due tipi di librerie: librerie dinamiche e librerie statiche.

Le librerie hanno file oggetto creati da "-c" gcc flag e terminano in ".o" per convenzione. Sono il risultato dell’output del compilatore e contengono definizioni di funzioni in forma binaria.

Differenze tra librerie dinamiche e statiche

Le librerie dinamiche hanno un”*. so “convenzione di denominazione e le librerie statiche hanno un”*.un”.

Le librerie dinamiche o condivise si verificano come file separati al di fuori dei file eseguibili. Pertanto, è necessaria solo una copia dei file della libreria in fase di esecuzione. Al momento della compilazione, le librerie statiche rimangono bloccate in un programma. Contiene i programmi del file che contengono una copia dei file della libreria in fase di compilazione.

Quando si utilizza una libreria dinamica, il programmatore fa riferimento a tale libreria quando è necessario in fase di runtime. Ad esempio, per accedere alla funzione lunghezza stringa da standard input/output header file, è possibile accedervi dinamicamente. Troverà il riferimento alla libreria del programma in fase di esecuzione a causa del caricatore dinamico. Quindi carica quella funzione di lunghezza della stringa in memoria. Pertanto, l’accessibilità della libreria dinamica deve essere prontamente disponibile o diventa impotente.

Vantaggi e svantaggi delle librerie dinamiche

  1. È necessaria solo una copia in fase di esecuzione. Dipende dall’applicazione e dalla libreria che sono strettamente disponibili l’una all’altra.
  2. Più applicazioni in esecuzione utilizzano la stessa libreria senza la necessità che ogni file abbia una propria copia.
  3. Tuttavia, cosa succede se la libreria dinamica viene danneggiata? Il file eseguibile potrebbe non funzionare perché vive al di fuori dell’eseguibile ed è vulnerabile alla rottura.
  4. Contengono file più piccoli.
  5. Le librerie dinamiche sono collegate in fase di esecuzione. Non richiede ricompilazione e ricollegamento quando il programmatore apporta una modifica.

Al momento della compilazione, le applicazioni utilizzano librerie statiche. Tutte le copie delle funzioni vengono inserite nel file dell’applicazione perché sono necessarie per eseguire il processo.

Vantaggi e svantaggi delle librerie statiche

  1. Le librerie statiche resistono alla vulnerabilità perché vivono all’interno del file eseguibile.
  2. La velocità in fase di esecuzione si verifica più velocemente perché il suo codice oggetto (binario) si trova nel file eseguibile. Pertanto, le chiamate effettuate alle funzioni vengono eseguite più rapidamente. Ricorda, la libreria dinamica vive al di fuori dell’eseguibile, quindi le chiamate verrebbero effettuate dall’esterno dell’eseguibile.
  3. Le modifiche apportate ai file e al programma richiedono il ricollegamento e la ricompilazione.
  4. La dimensione del file è molto più grande.

Come si crea una libreria statica e dinamica?

Per entrambe le librerie, il programma dovrebbe includere un prototype per ciascuna delle funzioni esistenti nella libreria. Se si utilizza un file di intestazione, non dimenticare di includere header filename.

#include "<header file name>"

Librerie Dinamiche

Per creare una libreria dinamica, scrivere il seguente comando:

gcc -g -fPIC -Wall -Werror -Wextra -pedantic *.c -shared -o liball.so

Con il "*.c" — abbiamo bisogno di tutti i file di origine C nella directory corrente e rende una libreria condivisa denominata "liball.so." Il -fPIC flag, il seguente codice per fare riferimento a qualsiasi indirizzo virtuale in fase di runtime. Sta per Position Independent Code.La libreria non contiene dati a indirizzi fissi perché la sua posizione in memoria cambierà tra i programmi. I file oggetto vengono compilati utilizzando -shared flag. compiler identificherà successivamente una libreria cercando i file che iniziano con "lib" e terminano con la convenzione di denominazione, .so

Il programma ha bisogno del percorso per cercare i file della libreria. Pertanto, è necessario digitare il seguente comando per aggiungere tale posizione alla variabile di ambiente chiamata LD_LIBRARY_PATH.

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

Quando si utilizza la libreria dinamica, digitare il seguente comando:

gcc -g -wall -o app app.c liball.so

Librerie statiche

Per creare una libreria statica, è necessario utilizzare il seguente comando:

ar rc liball.a dog.o cat.o bird.o

"ar" sta per archive e viene utilizzato per creare la libreria statica. Tutti i file che terminano in ".o" verranno aggiunti a liball.a library e in questo caso sono i file oggetto.

Il -rc flag farà due cose: sostituire e creare una nuova libreria se non esiste già. Il prossimo passo è l’indicizzazione, per farlo, digitiamo:

ranlib liball.a

Quando si utilizza la libreria statica, digitare il seguente comando:

gcc main.c -L -l<filename>

-L flag accede a linker in modo che le librerie possano essere trovate nella directory specificata. Inoltre, cerca anche altre posizioni in cui il compilatore cerca le librerie di sistema.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.