Cum să utilizați comanda ar de la Linux pentru a crea biblioteci statice

Utilizați comanda ar de la Linux pentru a crea biblioteci de funcții atunci când dezvoltați software. Acest tutorial vă va arăta cum să creați o bibliotecă statică, să o modificați și să o utilizați într-un program, complet cu exemplu de cod.

Comanda ar este un adevărat veteran — există din 1971. Numele ar face referire la utilizarea inițială intenționată a instrumentului, care a fost pentru a crea fișiere de arhivă. Un fișier arhivă este un singur fișier care acționează ca un container pentru alte fișiere. Uneori pentru multe alte fișiere. Fișierele pot fi adăugate, eliminate sau extrase din arhivă. Oamenii care caută acest tip de funcționalitate nu mai apelează la ar. Acest rol a fost preluat de alte utilități precum tar.

Comanda ar este încă folosită în câteva scopuri de specialitate, totuși. ar este folosit pentru a crea biblioteci statice. Acestea sunt folosite în dezvoltarea de software. Și ar este, de asemenea, folosit pentru a crea fișiere pachet, cum ar fi fișierele „.deb” utilizate în distribuția Debian Linux și derivatele sale, cum ar fi Ubuntu.

Vom parcurge pașii necesari pentru a crea și modifica o bibliotecă statică și vom demonstra cum să folosiți biblioteca într-un program. Pentru a face acest lucru, avem nevoie de o cerință pe care să o îndeplinească biblioteca statică. Scopul acestei biblioteci este de a codifica șiruri de text și de a decoda textul codificat.

Vă rugăm să rețineți că acesta este un hack rapid și murdar în scop demonstrativ. Nu utilizați această criptare pentru nimic care are valoare. Este cel mai simplu din lume cifr de substituție, unde A devine B, B devine C și așa mai departe.

Funcțiile cipher_encode() și cipher_decode().

Vom lucra într-un director numit „bibliotecă”, iar mai târziu vom crea un subdirector numit „test”.

Avem două fișiere în acest director. Într-un fișier text numit cipher_encode.c avem funcția cipher_encode():

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

} // end of cipher_encode

Funcția corespunzătoare cipher_decode() este într-un fișier text numit cipher_decode.c:

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

} // end of cipher_decode

Fișierele care conțin instrucțiuni de programare sunt numite fișiere de cod sursă. Vom face un fișier de bibliotecă numit libcipher.a. Acesta va conține versiunile compilate ale acestor două fișiere de cod sursă. De asemenea, vom crea un fișier text scurt numit libcipher.h. Acesta este un fișier antet care conține definițiile celor două funcții din noua noastră bibliotecă.

Oricine are biblioteca și fișierul antet va putea folosi cele două funcții în propriile programe. Nu trebuie să reinventeze roata și să rescrie funcțiile; pur și simplu folosesc copiile din biblioteca noastră.

Compilarea fișierelor cipher_encode.c și cipher_decode.c

Pentru a compila fișierele codului sursă, vom folosi gcc, the compilator standard GNU. Opțiunea -c (compilare, fără legătură) îi spune gcc să compileze fișierele și apoi să se oprească. Produce un fișier intermediar din fiecare fișier de cod sursă numit fișier obiect. Linkerul gcc preia de obicei toate fișierele obiect și le conectează pentru a crea un program executabil. Omitem acest pas folosind opțiunea -c. Avem nevoie doar de fișierele obiect.

Să verificăm că avem fișierele pe care credem că le avem.

ls -l

Cele două fișiere de cod sursă sunt prezente în acest director. Să folosim gcc pentru a le compila în fișiere obiect.

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

Nu ar trebui să existe nicio ieșire de la gcc dacă totul merge bine.

Aceasta generează două fișiere obiect cu același nume ca fișierele de cod sursă, dar cu extensii „.o”. Acestea sunt fișierele pe care trebuie să le adăugăm la fișierul bibliotecă.

ls -l

Crearea bibliotecii libcipher.a

Pentru a crea fișierul bibliotecă – care este de fapt un fișier arhivă – vom folosi ar.

Folosim opțiunea -c (creare) pentru a crea fișierul bibliotecă, opțiunea -r (adăugare cu înlocuire) pentru a adăuga fișierele în fișierul bibliotecă și opțiunea -s (index) pentru a crea un index al fișierelor din interior dosarul bibliotecii.

Vom apela fișierul bibliotecă libcipher.a. Furnizăm acel nume pe linia de comandă, împreună cu numele fișierelor obiect pe care urmează să le adăugăm în bibliotecă.

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

Dacă listăm fișierele din director, vom vedea că acum avem un fișier libcipher.a.

ls -l

Dacă folosim opțiunea -t (tabel) cu ar putem vedea modulele din fișierul bibliotecă.

ar -t libcipher.a

Crearea fișierului antet libcipher.h

Fișierul libcipher.h va fi inclus în orice program care utilizează biblioteca libcipher.a. Fișierul libcipher.h trebuie să conțină definiția funcțiilor care se află în bibliotecă.

Pentru a crea fișierul antet, trebuie să introducem definițiile funcției într-un editor de text, cum ar fi gedit. Denumiți fișierul „libcipher.h” și salvați-l în același director ca și fișierul libcipher.a.

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

Folosind biblioteca libcipher

Singura modalitate sigură de a testa noua noastră bibliotecă este să scriem un mic program care să o folosească. Mai întâi, vom crea un director numit test.

mkdir test

Vom copia biblioteca și fișierele antet în noul director.

cp libcipher.* ./test

Ne vom schimba în noul director.

cd test

Să verificăm dacă cele două fișiere ale noastre sunt aici.

ls -l

Trebuie să creăm un mic program care să poată folosi biblioteca și să dovedească că funcționează conform așteptărilor. Introduceți următoarele rânduri de text într-un editor. Salvați conținutul editorului într-un fișier numit „test.c” în directorul de testare.

#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

Fluxul programului este foarte simplu:

Include fișierul libcipher.h, astfel încât să poată vedea definițiile funcției de bibliotecă.
Acesta creează un șir numit „text” și stochează cuvintele „How-To Geek loves Linux” în el.
Tipărește acel șir pe ecran.
apelează funcția cipher_encode() pentru a codifica șirul și tipărește șirul codificat pe ecran.
Apelează cipher_decode() pentru a decoda șirul și tipărește șirul decodat pe ecran.

Pentru a genera programul de testare, trebuie să compilam programul test.c și să facem legătura în bibliotecă. Opțiunea -o (ieșire) îi spune gcc cum să numească programul executabil pe care îl generează.

gcc test.c libcipher.a -o test

Dacă gcc vă întoarce în tăcere la promptul de comandă, totul este bine. Acum să testăm programul nostru. Momentul adevarului:

./test

Și vedem rezultatul așteptat. Programul de testare tipărește textul simplu, tipărește textul criptat și apoi tipărește textul decriptat. Utilizează funcțiile din noua noastră bibliotecă. Biblioteca noastră funcționează.

Succes. Dar de ce să ne oprim aici?

Adăugarea unui alt modul la bibliotecă

Să adăugăm o altă funcție la bibliotecă. Vom adăuga o funcție pe care programatorul o poate folosi pentru a afișa versiunea bibliotecii pe care o folosește. Va trebui să creăm noua funcție, să o compilam și să adăugăm noul fișier obiect la fișierul de bibliotecă existent.

Introduceți următoarele rânduri într-un editor. Salvați conținutul editorului într-un fișier numit cipher_version.c, în directorul bibliotecii.

#include 

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

} // end of cipher_version

Trebuie să adăugăm definiția noii funcție în fișierul antet libcipher.h. Adăugați o nouă linie în partea de jos a acelui fișier, astfel încât să arate astfel:

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

Salvați fișierul modificat libcipher.h.

Trebuie să compilam fișierul cipher_version.c astfel încât să avem un fișier obiect cipher_version.o.

gcc -c cipher_version.c

Aceasta creează un fișier cipher_version.o. Putem adăuga noul fișier obiect în biblioteca libcipher.a cu următoarea comandă. Opțiunea -v (verboză) face ca de obicei ar silențios să ne spună ce a făcut.

ar -rsv libcipher.a cipher_version.o

Noul fișier obiect este adăugat la fișierul bibliotecă. ar imprimă confirmarea. „a” înseamnă „adăugat”.

Putem folosi opțiunea -t (tabel) pentru a vedea ce module sunt în fișierul bibliotecă.

ar -t libcipher.a

Acum există trei module în fișierul bibliotecii noastre. Să folosim noua funcție.

Folosind funcția cipher_version().

Să eliminăm vechea bibliotecă și fișierul antet din directorul de testare, să copiem fișierele noi și apoi să ne schimbăm înapoi în directorul de testare.

Vom șterge versiunile vechi ale fișierelor.

rm ./test/libcipher.*

Vom copia noile versiuni în directorul de testare.

cp libcipher.* ./test

Ne vom schimba în directorul de testare.

cd test

Și acum putem modifica programul test.c astfel încât să folosească noua funcție de bibliotecă.

Trebuie să adăugăm o nouă linie la programul test.c care apelează funcția cipher_version(). Vom plasa acest lucru înainte de primul put(text); linia.

#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

Salvați acest lucru ca test.c. Acum îl putem compila și testa dacă noua funcție este operațională.

gcc test.c libcipher.a -o test

Să rulăm noua versiune de test:

Noua funcție funcționează. Putem vedea versiunea bibliotecii la începutul ieșirii din test.

Dar poate fi o problemă.

Înlocuirea unui modul în bibliotecă

Aceasta nu este prima versiune a bibliotecii; este al doilea. Numărul nostru de versiune este incorect. Prima versiune nu avea nicio funcție cipher_version() în ea. Acesta face. Deci, aceasta ar trebui să fie versiunea „0.0.2”. Trebuie să înlocuim funcția cipher_version() din bibliotecă cu una corectată.

Din fericire, ar face asta foarte ușor de făcut.

Mai întâi, să edităm fișierul cipher_version.c din directorul bibliotecii. Schimbați textul „Versiunea 0.0.1 Alpha” în „Versiunea 0.0.2 Alpha”. Ar trebui să arate așa:

#include 

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

} // end of cipher_version

Salvați acest fișier. Trebuie să-l compilam din nou pentru a crea un nou fișier obiect cipher_version.o.

gcc -c cipher_version.c

Acum vom înlocui obiectul cipher_version.o existent din bibliotecă cu noua noastră versiune compilată.

Am folosit înainte opțiunea -r (adăugați cu înlocuire), pentru a adăuga module noi în bibliotecă. Când îl folosim cu un modul care există deja în bibliotecă, ar va înlocui versiunea veche cu cea nouă. Opțiunea -s (index) va actualiza indexul bibliotecii, iar opțiunea -v (verboză) va face să ne spună ce a făcut.

ar -rsv libcipher.a cipher_version.o

De data aceasta, ar raportează că a înlocuit modulul cipher_version.o. „r” înseamnă înlocuit.

Folosind funcția Updated cipher_version()

Ar trebui să folosim biblioteca noastră modificată și să verificăm dacă funcționează.

Vom copia fișierele bibliotecii în directorul de testare.

cp libcipher.* ./test

Ne vom schimba în directorul de testare.

cd ./test

Trebuie să compilam din nou programul nostru de testare cu noua noastră bibliotecă.

gcc test.c libcipher.a -o test

Și acum putem testa programul nostru.

./test

Rezultatul din programul de testare este ceea ce ne așteptam. Numărul corect al versiunii este afișat în șirul de versiuni, iar rutinele de criptare și decriptare funcționează.

Ștergerea modulelor dintr-o bibliotecă

Pare păcat după toate acestea, dar haideți să ștergem fișierul cipher_version.o din fișierul bibliotecă.

Pentru a face acest lucru, vom folosi opțiunea -d (ștergere). Vom folosi și opțiunea -v (verboză), astfel încât ar să ne spună ce a făcut. Vom include, de asemenea, opțiunea -s (index) pentru a actualiza indexul în fișierul bibliotecă.

ar -dsv libcipher.a cipher_version.o

ar raportează că a eliminat modulul. „d” înseamnă „șters”.

Dacă îi cerem lui ar să listeze modulele din fișierul bibliotecii, vom vedea că ne întoarcem la două module.

ar -t libcipher.a

Dacă intenționați să ștergeți module din bibliotecă, amintiți-vă să eliminați definiția acestora din fișierul antet al bibliotecii.

Distribuiți codul dvs

Bibliotecile fac codul care poate fi partajat într-un mod practic, dar privat. Oricine îi oferiți fișierul bibliotecă și fișierul antet poate folosi biblioteca dvs., dar codul sursă real rămâne privat.