bazele Linux: biblioteci statice vs. biblioteci dinamice

Erika Caoili

urmați

Dec 17, 2019 * 4 min citit

fotografie de Edwin Andrade pe Unsplash

ce este o bibliotecă în Linux?

de ce folosim bibliotecile?

cum se creează o bibliotecă statică și dinamică?

cum și de ce le folosim?

o bibliotecă în Linux

o bibliotecă este o colecție de piese de cod precompilate numite funcții. Biblioteca conține funcții comune și împreună, ele formează un pachet numit-o bibliotecă. Funcțiile sunt blocuri de cod care sunt reutilizate pe tot parcursul programului. Utilizarea pieselor de cod din nou într-un program economisește timp. Împiedică programatorul să rescrie codul de mai multe ori. Pentru programatori, Bibliotecile oferă funcții reutilizabile, structuri de date, clase și așa mai departe.

„de exemplu, dacă construiți o aplicație care trebuie să efectueze operații matematice, nu trebuie să creați o nouă funcție matematică pentru aceasta, puteți utiliza pur și simplu funcțiile existente în biblioteci pentru acel limbaj de programare.”(„Înțelegerea bibliotecilor partajate în Linux”)

o bibliotecă nu este executabilă și aceasta este o diferență cheie față de procese și aplicații. Bibliotecile își joacă rolul în timpul rulării sau în timpul compilării. În limbajul de programare C, avem două tipuri de biblioteci: biblioteci dinamice și biblioteci statice.

bibliotecile au fișiere obiect create de "-c" gcc flag și se termină în ".o" prin convenție. Ele sunt rezultatul ieșirii compilatorului și conțin definiții ale funcțiilor în formă binară.

diferențele dintre bibliotecile dinamice și statice

bibliotecile dinamice au un”*. deci „Convenția de denumire și bibliotecile statice au un”*.a”.

bibliotecile dinamice sau partajate apar ca fișiere separate în afara fișierelor executabile. Astfel, are nevoie doar de o copie a fișierelor bibliotecii în timpul rulării. La momentul compilării, bibliotecile statice rămân blocate într-un program. Conține programele fișierului care dețin o copie a fișierelor bibliotecii la momentul compilării.

când utilizați o bibliotecă dinamică, programatorul face referire la acea bibliotecă atunci când are nevoie în timpul rulării. De exemplu, pentru a accesa funcția de lungime a șirului de la standard input/output header file — o puteți accesa dinamic. Acesta va găsi referința bibliotecii programului în timpul rulării din cauza încărcătorului dinamic. Apoi încarcă funcția de lungime a șirului în memorie. Astfel, accesibilitatea dinamică a bibliotecii trebuie să fie ușor disponibilă sau devine neputincioasă.

avantajele și dezavantajele bibliotecilor dinamice

  1. are nevoie de o singură copie în timpul rulării. Depinde de aplicație și Biblioteca fiind strâns disponibile reciproc.
  2. mai multe aplicații care rulează utilizează aceeași bibliotecă fără a fi nevoie ca fiecare fișier să aibă propria copie.
  3. cu toate acestea, ce se întâmplă dacă biblioteca dinamică devine coruptă? Este posibil ca fișierul executabil să nu funcționeze, deoarece trăiește în afara executabilului și este vulnerabil la rupere.
  4. ei dețin fișiere mai mici.
  5. bibliotecile dinamice sunt legate în timpul rulării. Nu necesită recompilare și reconectare atunci când programatorul face o schimbare.

la momentul compilării, aplicațiile utilizează biblioteci statice. Toate copiile funcțiilor sunt plasate în fișierul aplicației, deoarece sunt necesare pentru a rula procesul.

avantajele și dezavantajele bibliotecilor statice

  1. bibliotecile statice rezistă vulnerabilității, deoarece trăiește în fișierul executabil.
  2. viteza la run-time apare mai repede, deoarece codul său obiect (binar) este în fișierul executabil. Astfel, apelurile efectuate către funcții sunt executate mai repede. Amintiți-vă, biblioteca dinamică trăiește în afara executabilului, astfel încât apelurile ar fi făcute din exteriorul executabilului.
  3. modificările aduse fișierelor și programului necesită reconectare și recompilare.
  4. Dimensiunea fișierului este mult mai mare.

cum creezi o bibliotecă statică și dinamică?

pentru ambele biblioteci, programul dvs. ar trebui să includă un prototype pentru fiecare dintre funcțiile care există în biblioteca dvs. Dacă utilizați un fișier antet, nu uitați să includeți header filename.

#include "<header file name>"

biblioteci dinamice

pentru a crea o bibliotecă dinamică, scrieți următoarea comandă:

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

cu "*.c" — este nevoie de toate fișierele sursă C în directorul curent și face o bibliotecă partajată numit "liball.so." -fPIC Pavilion permite următorul cod pentru a fi referire la orice adresă virtuală în timpul rulării. Reprezintă codul independent de poziție.Biblioteca nu deține date la adrese fixe, deoarece locația sa în memorie se va schimba între programe. Fișierele obiect se compilate folosind -shared flag. compiler va identifica ulterior o bibliotecă căutând fișiere care încep cu "lib" și se termină cu Convenția de denumire, .so

programul are nevoie de calea pentru a căuta fișierele bibliotecii. Deci, trebuie să tastați următoarea comandă pentru a adăuga acea locație la variabila de mediu numită LD_LIBRARY_PATH.

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

când utilizați biblioteca dinamică, tastați următoarea comandă:

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

biblioteci statice

pentru a crea o bibliotecă statică, trebuie să folosim următoarea comandă:

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

"ar" înseamnă archive și este folosit pentru a crea biblioteca statică. Toate fișierele care se termină în ".o" vor fi adăugate la liball.a library și sunt fișierele obiect în acest caz.

-rc flag va face două lucruri: înlocuiți și creați o nouă bibliotecă Dacă nu există deja. Următorul pas este indexarea, pentru a face acest lucru, tastăm:

ranlib liball.a

când utilizați biblioteca statică, tastați următoarea comandă:

gcc main.c -L -l<filename>

-L flag accesează linker astfel încât bibliotecile pot fi găsite în directorul dat. De asemenea, caută și alte locații în care compilatorul caută biblioteci de sistem.

Lasă un răspuns

Adresa ta de email nu va fi publicată.