Linux Basics: statiska bibliotek vs. dynamiska bibliotek

Erika Caoili

följ

Dec 17, 2019 * 4 min läs

foto av Edwin Andrade på Unsplash

vad är ett bibliotek i Linux?

Varför använder vi bibliotek?

Hur skapar man ett statiskt och dynamiskt bibliotek?

hur och varför använder vi dem?

ett bibliotek i Linux

ett bibliotek är en samling förkompilerade kodstycken som kallas funktioner. Biblioteket innehåller gemensamma funktioner och tillsammans bildar de ett paket som heter — ett bibliotek. Funktioner är kodblock som återanvänds i hela programmet. Att använda kodbitarna igen i ett program sparar tid. Det hindrar programmeraren från att skriva om koden flera gånger. För programmerare tillhandahåller bibliotek återanvändbara funktioner, datastrukturer, klasser och så vidare.

”om du till exempel bygger en applikation som behöver utföra matematiska operationer behöver du inte skapa en ny matematikfunktion för det, du kan helt enkelt använda befintliga funktioner i bibliotek för det programmeringsspråket.”(”Förstå delade bibliotek i Linux”)

ett bibliotek är inte körbart och det är en viktig skillnad från processer och applikationer. Bibliotek spelar sin roll vid körning eller kompilering. I programmeringsspråket C har vi två typer av bibliotek: dynamiska bibliotek och statiska bibliotek.

bibliotek har objektfiler som skapats av "-c" gcc flag och slutar i ".o" enligt konvention. De är resultatet av kompilatorns utgång och innehåller funktionsdefinitioner i binär form.

skillnader mellan dynamiska och statiska bibliotek

dynamiska bibliotek har en”*. so ”namnkonvention och statiska bibliotek har en”*.en”.

dynamiska eller delade bibliotek förekommer som separata filer utanför de körbara filerna. Således behöver den bara en kopia av bibliotekets filer vid körning. Vid kompileringstiden förblir statiska bibliotek låsta i ett program. Den innehåller filens program som innehåller en kopia av bibliotekets filer vid kompileringstiden.

när du använder ett dynamiskt bibliotek refererar programmeraren till det biblioteket när det behövs vid körning. Till exempel, för att komma åt stränglängdsfunktionen från standard input/output header file — kan du komma åt den dynamiskt. Det kommer att hitta programmets bibliotek referens vid körning på grund av den dynamiska loader. Den laddar sedan den stränglängdsfunktionen i minnet. Således måste den dynamiska bibliotekets tillgänglighet vara lättillgänglig eller den blir maktlös.

fördelar och nackdelar med dynamiska bibliotek

  1. det behöver bara en kopia vid körning. Det är beroende av att applikationen och biblioteket är nära tillgängliga för varandra.
  2. flera program som körs använder samma bibliotek utan att varje fil behöver ha sin egen kopia.
  3. men vad händer om det dynamiska biblioteket blir korrupt? Den körbara filen kanske inte fungerar eftersom den lever utanför den körbara och är sårbar för att bryta.
  4. de har mindre filer.
  5. dynamiska bibliotek är länkade vid körning. Det kräver inte omkompilering och omlänkning när programmeraren gör en förändring.

vid kompilering använder applikationer statiska bibliotek. Alla kopior av funktionerna placeras i programfilen eftersom de behövs för att köra processen.

fördelar och nackdelar med statiska bibliotek

  1. statiska bibliotek motstår sårbarhet eftersom den lever i den körbara filen.
  2. hastigheten vid körning sker snabbare eftersom dess objektkod (binär) finns i den körbara filen. Således blir samtal som görs till funktionerna exekverade snabbare. Kom ihåg att det dynamiska biblioteket bor utanför den körbara, så samtal skulle göras från utsidan av den körbara.
  3. ändringar som görs i filerna och programmet kräver omlänkning och omkompilering.
  4. filstorleken är mycket större.

Hur skapar du ett statiskt och dynamiskt bibliotek?

för båda biblioteken bör ditt program innehålla en prototype för var och en av de funktioner som finns i ditt bibliotek. Om du använder en rubrikfil, glöm inte att inkludera header filename.

#include "<header file name>"

dynamiska bibliotek

för att skapa ett dynamiskt bibliotek, skriv följande kommando:

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

med "*.c" — det tar alla C-källfilerna i den aktuella katalogen och gör ett delat bibliotek som heter"liball.so." -fPIC flaggan tillåter följande kod att refereras vid vilken virtuell adress som helst vid körning. Det står för Position Independent Code.Biblioteket lagrar inte data på fasta adresser eftersom dess plats i minnet ändras mellan program. Objektfiler kompileras med hjälp av -shared flag. compiler identifierar senare ett bibliotek genom att söka efter filer som börjar med "lib" och slutar med namnkonventionen, .so

programmet behöver sökvägen för att leta efter biblioteksfilerna. Så du måste skriva följande kommando för att lägga till den platsen i miljövariabeln som heter LD_LIBRARY_PATH.

export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH

när du använder det dynamiska biblioteket skriver du följande kommando:

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

statiska bibliotek

för att skapa ett statiskt bibliotek måste vi använda följande kommando:

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

"ar" står för archive och används för att skapa det statiska biblioteket. Alla filer som slutar i ".o" kommer att läggas till i liball.a library och de är objektfilerna i det här fallet.

-rc flag kommer att göra två saker: Ersätt och skapa ett nytt bibliotek om det inte redan finns. Nästa steg är indexering, för att göra det skriver vi:

ranlib liball.a

när du använder det statiska biblioteket skriver du följande kommando:

gcc main.c -L -l<filename>

-L flag öppnar linker så att biblioteken kan hittas i den angivna katalogen. Det söker också efter andra platser där kompilatorn letar efter systembibliotek.

Lämna ett svar

Din e-postadress kommer inte publiceras.