Sådan bruger du Linux’s ar-kommando til at oprette statiske biblioteker

Brug Linuxs ar-kommando til at oprette funktionsbiblioteker, når du udvikler software. Denne vejledning viser dig, hvordan du opretter et statisk bibliotek, ændrer det og bruger det i et program, komplet med eksempelkode.

ar-kommandoen er en rigtig veteran – den har eksisteret siden 1971. Navnet ar refererer til den oprindelige påtænkte brug for værktøjet, som var at oprette arkivfiler. En arkivfil er en enkelt fil, der fungerer som en beholder for andre filer. Nogle gange for mange andre filer. Filer kan tilføjes, fjernes fra eller udtrækkes fra arkivet. Folk, der leder efter den type funktionalitet, henvender sig ikke længere til ar. Den rolle er blevet overtaget af andre forsyningsselskaber såsom tjære.

Kommandoen ar bruges dog stadig til nogle få specialistformål. ar bruges til at skabe statiske biblioteker. Disse bruges i softwareudvikling. Og ar bruges også til at skabe pakkefiler, såsom “.deb”-filerne, der bruges i Debian Linux-distributionen og dens derivater, såsom Ubuntu.

Vi vil gennemgå de nødvendige trin for at oprette og ændre et statisk bibliotek og demonstrere, hvordan biblioteket bruges i et program. For at gøre det har vi brug for et krav, som det statiske bibliotek skal opfylde. Formålet med dette bibliotek er at indkode tekststrenge og afkode kodet tekst.

Bemærk venligst, at dette er et hurtigt og beskidt hack til demonstrationsformål. Brug ikke denne kryptering til noget, der er af værdi. Det er verdens enkleste substitutionsciffer, hvor A bliver til B, B bliver til C, og så videre.

Funktionerne cipher_encode() og cipher_decode()

Vi kommer til at arbejde i en mappe kaldet “bibliotek”, og senere vil vi oprette en undermappe kaldet “test.”

Vi har to filer i denne mappe. I en tekstfil kaldet cipher_encode.c har vi cipher_encode()-funktionen:

void cipher_encode(char *text)
{
 for (int i=0; text[i] != 0x0; i++) {
   text[i]++;
 }

} // end of cipher_encode

Den tilsvarende cipher_decode() funktion er i en tekstfil kaldet cipher_decode.c:

void cipher_decode(char *text)
{
 for (int i=0; text[i] != 0x0; i++) {
   text[i]--;
 }

} // end of cipher_decode

Filer, der indeholder programmeringsinstruktioner, kaldes kildekodefiler. Vi skal lave en biblioteksfil kaldet libcipher.a. Den vil indeholde de kompilerede versioner af disse to kildekodefiler. Vi vil også oprette en kort tekstfil kaldet libcipher.h. Dette er en header-fil, der indeholder definitionerne af de to funktioner i vores nye bibliotek.

Alle med biblioteket og header-filen vil kunne bruge de to funktioner i deres egne programmer. De behøver ikke at genopfinde hjulet og omskrive funktionerne; de gør blot brug af kopierne i vores bibliotek.

  Sådan bruger du den mindre kommando på Linux

Kompilering af filerne cipher_encode.c og cipher_decode.c

For at kompilere kildekodefilerne bruger vi gcc, den standard GNU compiler. Indstillingen -c (kompiler, intet link) fortæller gcc at kompilere filerne og derefter stoppe. Det producerer en mellemliggende fil fra hver kildekodefil kaldet en objektfil. Gcc-linkeren tager normalt alle objektfilerne og linker dem sammen for at lave et eksekverbart program. Vi springer det trin over ved at bruge -c-indstillingen. Vi mangler bare objektfilerne.

Lad os tjekke, at vi har de filer, vi tror, ​​vi har.

ls -l

De to kildekodefiler er til stede i denne mappe. Lad os bruge gcc til at kompilere dem til objektfiler.

gcc -c cipher_encode.c
gcc -c cipher_decode.c

Der bør ikke være noget output fra gcc, hvis alt går godt.

Dette genererer to objektfiler med samme navn som kildekodefilerne, men med “.o”-udvidelser. Det er de filer, vi skal tilføje til biblioteksfilen.

ls -l

Oprettelse af biblioteket libcipher.a

For at oprette biblioteksfilen – som faktisk er en arkivfil – bruger vi ar.

Vi bruger muligheden -c (opret) til at oprette biblioteksfilen, -r (tilføj med erstatning) muligheden for at tilføje filerne til biblioteksfilen, og -s (indeks) muligheden for at oprette et indeks over filerne inde biblioteksfilen.

Vi vil kalde biblioteksfilen libcipher.a. Vi angiver dette navn på kommandolinjen sammen med navnene på de objektfiler, vi vil tilføje til biblioteket.

ar -crs libcipher.a cipher_encode.o cipher_decode.o

Hvis vi viser filerne i mappen, vil vi se, at vi nu har en libcipher.a-fil.

ls -l

Hvis vi bruger muligheden -t (tabel) med ar, kan vi se modulerne inde i biblioteksfilen.

ar -t libcipher.a

Oprettelse af libcipher.h-headerfilen

Filen libcipher.h vil blive inkluderet i ethvert program, der bruger biblioteket libcipher.a. Filen libcipher.h skal indeholde definitionen af ​​de funktioner, der er i biblioteket.

For at oprette header-filen skal vi indtaste funktionsdefinitionerne i en teksteditor, såsom gedit. Navngiv filen “libcipher.h” og gem den i samme mappe som filen libcipher.a.

void cipher_encode(char *text);
void cipher_decode(char *text);

Brug af libcipher Library

Den eneste sikre måde at teste vores nye bibliotek på er at skrive et lille program til at bruge det. Først laver vi en mappe kaldet test.

mkdir test

Vi kopierer biblioteket og header-filerne til den nye mappe.

cp libcipher.* ./test

Vi skifter til den nye mappe.

cd test

Lad os tjekke, at vores to filer er her.

ls -l

Vi skal lave et lille program, der kan bruge biblioteket og bevise, at det fungerer som forventet. Indtast følgende tekstlinjer i en editor. Gem indholdet af editoren til en fil med navnet “test.c” i testmappen.

#include 
#include 

#include "libcipher.h"

int main(int argc, char *argv[])
{
 char text[]="How-To Geek loves Linux";

 puts(text);

 cipher_encode(text);
 puts(text);

 cipher_decode(text);
 puts(text);

 exit (0);

} // end of main

Programforløbet er meget enkelt:

Den inkluderer filen libcipher.h, så den kan se biblioteksfunktionsdefinitionerne.
Den opretter en streng kaldet “tekst” og gemmer ordene “How-To Geek loves Linux” i den.
Den udskriver den streng til skærmen.
den kalder cipher_encode()-funktionen for at kode strengen, og den udskriver den kodede streng på skærmen.
Den kalder cipher_decode() for at afkode strengen og udskriver den afkodede streng til skærmen.

  Sådan skifter du fra Bash til Fish Shell på Linux

For at generere testprogrammet skal vi kompilere test.c-programmet og linke i biblioteket. Indstillingen -o (output) fortæller gcc, hvad den skal kalde det eksekverbare program, som den genererer.

gcc test.c libcipher.a -o test

Hvis gcc stille vender tilbage til kommandoprompten, er alt godt. Lad os nu teste vores program. Sandhedens øjeblik:

./test

Og vi ser det forventede output. Testprogrammet udskriver den almindelige tekst, udskriver den krypterede tekst og udskriver derefter den dekrypterede tekst. Den bruger funktionerne i vores nye bibliotek. Vores bibliotek fungerer.

Succes. Men hvorfor stoppe der?

Tilføjelse af endnu et modul til biblioteket

Lad os tilføje en anden funktion til biblioteket. Vi tilføjer en funktion, som programmøren kan bruge til at vise den version af biblioteket, som de bruger. Vi bliver nødt til at oprette den nye funktion, kompilere den og tilføje den nye objektfil til den eksisterende biblioteksfil.

Indtast følgende linjer i en editor. Gem indholdet af editoren i en fil med navnet cipher_version.c i biblioteksmappen.

#include 

void cipher_version(void)
{
 puts("How-To Geek :: VERY INSECURE Cipher Library");
 puts("Version 0.0.1 Alphan");

} // end of cipher_version

Vi skal tilføje definitionen af ​​den nye funktion til libcipher.h header-filen. Tilføj en ny linje i bunden af ​​filen, så den ser sådan ud:

void cipher_encode(char *text);
void cipher_decode(char *text);
void cipher_version(void);

Gem den ændrede libcipher.h-fil.

Vi skal kompilere cipher_version.c-filen, så vi har en cipher_version.o-objektfil.

gcc -c cipher_version.c

Dette opretter en cipher_version.o fil. Vi kan tilføje den nye objektfil til biblioteket libcipher.a med følgende kommando. Indstillingen -v (verbose) får den normalt tavse ar til at fortælle os, hvad den har gjort.

ar -rsv libcipher.a cipher_version.o

Den nye objektfil tilføjes til biblioteksfilen. ar udskriver bekræftelse. “a” betyder “tilsat”.

Vi kan bruge muligheden -t (tabel) til at se hvilke moduler der er inde i biblioteksfilen.

ar -t libcipher.a

Der er nu tre moduler i vores biblioteksfil. Lad os gøre brug af den nye funktion.

Brug af cipher_version()-funktionen.

Lad os fjerne det gamle bibliotek og overskriftsfil fra testbiblioteket, kopiere de nye filer ind og derefter skifte tilbage til testbiblioteket.

Vi sletter de gamle versioner af filerne.

rm ./test/libcipher.*

Vi kopierer de nye versioner til testbiblioteket.

cp libcipher.* ./test

Vi skifter til testbiblioteket.

cd test

Og nu kan vi ændre test.c-programmet, så det bruger den nye biblioteksfunktion.

Vi skal tilføje en ny linje til test.c-programmet, der kalder cipher_version()-funktionen. Vi placerer dette før de første puts(text); linje.

#include 
#include  

#include "libcipher.h" 

int main(int argc, char *argv[]) 
{
 char text[]="How-To Geek loves Linux"; 

 // new line added here
 cipher_version(); 

 puts(text); 
 
 cipher_encode(text); 
 puts(text); 
 
 cipher_decode(text); 
 puts(text); 

 exit (0); 

} // end of main

Gem dette som test.c. Vi kan nu kompilere den og teste, at den nye funktion er operationel.

gcc test.c libcipher.a -o test

Lad os køre den nye version af testen:

  Sådan downloader du podcasts fra Linux-terminalen med Podfox

Den nye funktion virker. Vi kan se versionen af ​​biblioteket i starten af ​​output fra test.

Men der kan være et problem.

Udskiftning af et modul i biblioteket

Dette er ikke den første version af biblioteket; det er det andet. Vores versionsnummer er forkert. Den første version havde ingen cipher_version() funktion i sig. Det gør denne. Så dette burde være version “0.0.2”. Vi skal erstatte cipher_version()-funktionen i biblioteket med en rettet.

Heldigvis gør ar det meget nemt at gøre.

Lad os først redigere cipher_version.c-filen i biblioteksmappen. Skift “Version 0.0.1 Alpha”-teksten til “Version 0.0.2 Alpha”. Det skal se sådan ud:

#include 

void cipher_version(void)
{
 puts("How-To Geek :: VERY INSECURE Cipher Library");  
 puts("Version 0.0.2 Alphan"); 

} // end of cipher_version

Gem denne fil. Vi skal kompilere den igen for at oprette en ny cipher_version.o objektfil.

gcc -c cipher_version.c

Nu vil vi erstatte det eksisterende cipher_version.o objekt i biblioteket med vores nyligt kompilerede version.

Vi har brugt -r (tilføj med erstatning) mulighed før, til at tilføje nye moduler til biblioteket. Når vi bruger det med et modul, der allerede findes i biblioteket, vil ar erstatte den gamle version med den nye. Indstillingen -s (indeks) vil opdatere biblioteksindekset, og -v (verbose) muligheden vil få ar til at fortælle os, hvad den har gjort.

ar -rsv libcipher.a cipher_version.o

Denne gang rapporterer ar, at den har erstattet cipher_version.o-modulet. “r” betyder erstattet.

Brug af funktionen Updated cipher_version()

Vi bør bruge vores modificerede bibliotek og kontrollere, at det virker.

Vi kopierer biblioteksfilerne til testbiblioteket.

cp libcipher.* ./test

Vi skifter til testbiblioteket.

cd ./test

Vi skal kompilere vores testprogram igen med vores nye bibliotek.

gcc test.c libcipher.a -o test

Og nu kan vi teste vores program.

./test

Outputtet fra testprogrammet er, hvad vi havde forventet. Det korrekte versionsnummer vises i versionsstrengen, og krypterings- og dekrypteringsrutinerne virker.

Sletning af moduler fra et bibliotek

Det virker en skam efter alt det, men lad os slette filen cipher_version.o fra biblioteksfilen.

For at gøre dette bruger vi muligheden -d (slet). Vi bruger også muligheden -v (verbose), så ar fortæller os, hvad den har gjort. Vi inkluderer også muligheden -s (indeks) for at opdatere indekset i biblioteksfilen.

ar -dsv libcipher.a cipher_version.o

ar rapporterer, at det har fjernet modulet. “d” betyder “slettet”.

Hvis vi beder ar om at liste modulerne inde i biblioteksfilen, vil vi se, at vi er tilbage til to moduler.

ar -t libcipher.a

Hvis du skal slette moduler fra dit bibliotek, skal du huske at fjerne deres definition fra bibliotekets header-fil.

Del din kode

Biblioteker gør kode delbar på en praktisk, men privat måde. Enhver, som du giver biblioteksfilen og headerfilen til, kan bruge dit bibliotek, men din faktiske kildekode forbliver privat.