Hogyan használjuk a Linux ar parancsát statikus könyvtárak létrehozására

Használja a Linux ar parancsát függvénykönyvtárak létrehozásához szoftverfejlesztés közben. Ez az oktatóanyag bemutatja, hogyan hozhat létre statikus könyvtárat, hogyan módosíthatja azt, és hogyan használhatja egy programban, mintakóddal kiegészítve.

Az ar parancs igazi veterán – 1971 óta létezik. Az ar név az eszköz eredeti tervezett felhasználására utal, amely archív fájlok létrehozásához. Az archív fájl egyetlen fájl, amely más fájlok tárolójaként működik. Néha sok más fájlhoz. A fájlok hozzáadhatók az archívumhoz, eltávolíthatók onnan vagy kivonhatók onnan. Az ilyen típusú funkciókat kereső emberek már nem fordulnak az ar-hez. Ezt a szerepet más segédprogramok, például a tar vették át.

Az ar parancsot azonban továbbra is használják néhány speciális célra. Az ar statikus könyvtárak létrehozására szolgál. Ezeket a szoftverfejlesztésben használják. Az ar-t csomagfájlok, például a Debian Linux disztribúcióban és származékaiban, például az Ubuntuban használt „.deb” fájlok létrehozására is használják.

Végigfutjuk a statikus könyvtár létrehozásához és módosításához szükséges lépéseket, és bemutatjuk, hogyan kell használni a könyvtárat egy programban. Ehhez szükségünk van egy követelményre, amelyet a statikus könyvtár teljesítenie kell. Ennek a könyvtárnak a célja a szöveges karakterláncok kódolása és a kódolt szöveg dekódolása.

Felhívjuk figyelmét, hogy ez egy gyors és piszkos feltörés demonstrációs céllal. Ne használja ezt a titkosítást semmire, ami értékes. Ez a világ legegyszerűbbje helyettesítő titkosítás, ahol A-ból B, B-ből C lesz, és így tovább.

A cipher_encode() és cipher_decode() függvények

Egy „könyvtár” nevű könyvtárban fogunk dolgozni, később pedig létrehozunk egy „teszt” nevű alkönyvtárat.

Két fájl van ebben a könyvtárban. A cipher_encode.c nevű szövegfájlban van a cipher_encode() függvény:

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

} // end of cipher_encode

A megfelelő cipher_decode() függvény egy cipher_decode.c nevű szövegfájlban található:

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

} // end of cipher_decode

A programozási utasításokat tartalmazó fájlokat forráskód fájloknak nevezzük. Készítünk egy libcipher.a nevű könyvtárfájlt. Ennek a két forráskódfájlnak a lefordított verzióját fogja tartalmazni. Létrehozunk egy rövid szöveges fájlt is libcipher.h néven. Ez egy fejlécfájl, amely az új könyvtárunkban található két függvény definícióit tartalmazza.

Bárki, aki rendelkezik a könyvtárral és a fejlécfájllal, használhatja a két funkciót a saját programjaiban. Nem kell újra feltalálniuk a kereket és újraírniuk a függvényeket; egyszerűen csak felhasználják a könyvtárunkban található példányokat.

  Az Arch Linux gyorsabb telepítése a Calam Arch segítségével

A cipher_encode.c és cipher_decode.c fájlok fordítása

A forráskód fájlok fordításához a gcc-t használjuk, a szabványos GNU fordító. A -c (fordítás, nincs hivatkozás) opció arra utasítja a gcc-t, hogy fordítsa le a fájlokat, majd állítsa le. Minden forráskódfájlból egy közvetítő fájlt állít elő, amelyet objektumfájlnak neveznek. A gcc linker általában elveszi az összes objektumfájlt, és összekapcsolja őket, hogy végrehajtható programot hozzon létre. Ezt a lépést kihagyjuk a -c kapcsoló használatával. Csak az objektumfájlokra van szükségünk.

Ellenőrizzük, hogy megvannak azok a fájlok, amelyekről úgy gondoljuk, hogy vannak.

ls -l

A két forráskód fájl található ebben a könyvtárban. Használjuk a gcc-t, hogy ezeket objektumfájlokká fordítsuk.

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

Ha minden jól megy, ne legyen kimenete a gcc-nek.

Ez két objektumfájlt hoz létre, amelyek névvel megegyeznek a forráskódfájlokkal, de „.o” kiterjesztéssel. Ezeket a fájlokat kell hozzáadnunk a könyvtárfájlhoz.

ls -l

A libcipher létrehozása.a Library

A könyvtárfájl létrehozásához – amely valójában egy archív fájl – az ar-t használjuk.

A -c (create) opciót használjuk a könyvtárfájl létrehozásához, az -r (hozzáadás cserével) opciót a fájlok hozzáadásához a könyvtárfájlhoz, az -s (index) opciót pedig a benne lévő fájlok indexének létrehozásához. a könyvtári fájlt.

A könyvtár fájlt libcipher.a néven fogjuk hívni. Ezt a nevet a parancssorban adjuk meg a könyvtárhoz hozzáadni kívánt objektumfájlok nevével együtt.

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

Ha felsoroljuk a fájlokat a könyvtárban, látni fogjuk, hogy van egy libcipher.a fájlunk.

ls -l

Ha a -t (table) opciót használjuk az ar-rel, akkor láthatjuk a modulokat a könyvtárfájlban.

ar -t libcipher.a

A libcipher.h fejlécfájl létrehozása

A libcipher.h fájl minden olyan programban megtalálható lesz, amely a libcipher.a könyvtárat használja. A libcipher.h fájlnak tartalmaznia kell a könyvtárban lévő függvények definícióját.

A fejlécfájl létrehozásához be kell írnunk a függvénydefiníciókat egy szövegszerkesztőbe, például a geditbe. Nevezze el a fájlt „libcipher.h”, és mentse el ugyanabba a könyvtárba, mint a libcipher.a fájlt.

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

A libcipher Library használata

Az új könyvtárunk tesztelésének egyetlen biztos módja, ha írunk egy kis programot a használatához. Először is készítünk egy teszt nevű könyvtárat.

mkdir test

A könyvtárat és a fejléc fájlokat átmásoljuk az új könyvtárba.

cp libcipher.* ./test

Átváltunk az új könyvtárba.

cd test

Ellenőrizzük, hogy a két fájlunk itt van-e.

ls -l

Létre kell hoznunk egy kis programot, amely képes használni a könyvtárat, és bebizonyítani, hogy az elvárásoknak megfelelően működik. Írja be a következő sorokat egy szerkesztőbe. Mentse el a szerkesztő tartalmát egy „test.c” nevű fájlba a tesztkönyvtárban.

#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

A program menete nagyon egyszerű:

Tartalmazza a libcipher.h fájlt, így láthatja a függvénytárak definícióit.
Létrehoz egy „szöveg” nevű karakterláncot, és eltárolja benne a „How-To Geek loves Linux” szavakat.
Kiírja ezt a karakterláncot a képernyőre.
meghívja a cipher_encode() függvényt a karakterlánc kódolásához, és kiírja a kódolt karakterláncot a képernyőre.
Meghívja a cipher_decode()-t a karakterlánc dekódolásához, és kiírja a dekódolt karakterláncot a képernyőre.

  Hogyan lehet nyomon követni a Linux parancsok haladását (pv-vel és előrehaladással)

A tesztprogram generálásához le kell fordítanunk a test.c programot és hivatkozást a könyvtárban. Az -o (output) opció megmondja a gcc-nek, hogy minek nevezze az általa generált végrehajtható programot.

gcc test.c libcipher.a -o test

Ha a gcc csendben visszaadja a parancssorba, akkor minden rendben van. Most pedig teszteljük a programunkat. Az igazság pillanata:

./test

És látjuk a várt eredményt. A tesztprogram kiírja az egyszerű szöveget, kinyomtatja a titkosított szöveget, majd kinyomtatja a visszafejtett szöveget. Az új könyvtárunkban található funkciókat használja. Könyvtárunk működik.

Siker. De miért álljunk meg itt?

Újabb modul hozzáadása a könyvtárhoz

Adjunk hozzá még egy függvényt a könyvtárhoz. Hozzáadunk egy függvényt, amellyel a programozó megjelenítheti az általa használt könyvtár verzióját. Létre kell hoznunk az új függvényt, le kell fordítanunk, és hozzá kell adnunk az új objektumfájlt a meglévő könyvtárfájlhoz.

Írja be a következő sorokat egy szerkesztőbe. Mentse el a szerkesztő tartalmát a cipher_version.c nevű fájlba a könyvtár könyvtárában.

#include 

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

} // end of cipher_version

Az új függvény definícióját hozzá kell adnunk a libcipher.h fejlécfájlhoz. Adjon hozzá egy új sort a fájl aljához, hogy így nézzen ki:

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

Mentse el a módosított libcipher.h fájlt.

Le kell fordítanunk a cipher_version.c fájlt, hogy legyen egy cipher_version.o objektumfájlunk.

gcc -c cipher_version.c

Ezzel létrehoz egy cipher_version.o fájlt. Az új objektumfájlt a következő paranccsal adhatjuk a libcipher.a könyvtárhoz. A -v (verbose) opció arra készteti az általában néma ar-t, hogy elmondja nekünk, mit tett.

ar -rsv libcipher.a cipher_version.o

Az új objektumfájl hozzáadódik a könyvtárfájlhoz. ar kinyomtatja a megerősítést. Az „a” jelentése „hozzáadva”.

Használhatjuk a -t (tábla) opciót, hogy megnézzük, milyen modulok vannak a könyvtárfájlban.

ar -t libcipher.a

Jelenleg három modul található a könyvtári fájlunkban. Használjuk ki az új funkciót.

A cipher_version() függvény használata.

Távolítsuk el a régi könyvtárat és a fejlécfájlt a tesztkönyvtárból, másoljuk be az új fájlokat, majd térjünk vissza a tesztkönyvtárba.

Töröljük a fájlok régi verzióit.

rm ./test/libcipher.*

Az új verziókat bemásoljuk a tesztkönyvtárba.

cp libcipher.* ./test

Átváltunk a tesztkönyvtárba.

cd test

Most pedig módosíthatjuk a test.c programot úgy, hogy az az új könyvtári függvényt használja.

Hozzá kell adnunk egy új sort a test.c programhoz, amely meghívja a cipher_version() függvényt. Ezt az első puts(text) elé tesszük; vonal.

#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

Mentse el tesztként.c. Most már lefordíthatjuk és tesztelhetjük, hogy az új függvény működik-e.

gcc test.c libcipher.a -o test

Futtassuk a teszt új verzióját:

  A Linux kernel és az operációs rendszer verziójának ellenőrzése

Az új funkció működik. A könyvtár verzióját a teszt kimenetének elején láthatjuk.

De lehet, hogy baj van.

Modul cseréje a könyvtárban

Nem ez a könyvtár első verziója; ez a második. A verziószámunk hibás. Az első verzióban nem volt cipher_version() függvény. Ez igen. Tehát ennek a „0.0.2” verziónak kell lennie. A könyvtárban lévő cipher_version() függvényt ki kell cserélnünk egy javítottra.

Szerencsére az ar ezt nagyon egyszerűvé teszi.

Először szerkesszük a cipher_version.c fájlt a könyvtár könyvtárában. Módosítsa a „Version 0.0.1 Alpha” szöveget a „Version 0.0.2 Alpha” szövegre. Így kell kinéznie:

#include 

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

} // end of cipher_version

Mentse el ezt a fájlt. Újra le kell fordítanunk egy új cipher_version.o objektumfájl létrehozásához.

gcc -c cipher_version.c

Most lecseréljük a meglévő cipher_version.o objektumot a könyvtárban az újonnan lefordított verziónkra.

Korábban használtuk az -r (add with csere) opciót, hogy új modulokat adjunk a könyvtárhoz. Ha a könyvtárban már meglévő modullal használjuk, az ar lecseréli a régi verziót az újra. Az -s (index) opció frissíti a könyvtári indexet, a -v (verbose) pedig arra készteti az ar-t, hogy elmondja nekünk, mit tett.

ar -rsv libcipher.a cipher_version.o

Ezúttal az ar arról számol be, hogy lecserélte a cipher_version.o modult. Az „r” azt jelenti, hogy kicserélték.

A frissített cipher_version() függvény használata

Használnunk kell a módosított könyvtárunkat, és ellenőriznünk kell, hogy működik-e.

A könyvtár fájljait a tesztkönyvtárba másoljuk.

cp libcipher.* ./test

Átváltunk a tesztkönyvtárba.

cd ./test

Újra össze kell állítanunk tesztprogramunkat az új könyvtárunkkal.

gcc test.c libcipher.a -o test

És most tesztelhetjük a programunkat.

./test

A tesztprogram eredménye olyan, mint amire számítottunk. A helyes verziószám jelenik meg a verzió-karakterláncban, és a titkosítási és visszafejtési rutinok működnek.

Modulok törlése a könyvtárból

Ezek után szégyennek tűnik, de töröljük a cipher_version.o fájlt a könyvtárfájlból.

Ehhez a -d (delete) kapcsolót használjuk. Használjuk a -v (bőbeszédű) opciót is, hogy az ar megmondja, mit tett. A könyvtárfájlban az index frissítéséhez az -s (index) opciót is beépítjük.

ar -dsv libcipher.a cipher_version.o

Az ar jelentése szerint eltávolította a modult. A „d” jelentése „törölve”.

Ha megkérjük az ar-t, hogy sorolja fel a modulokat a könyvtárfájlban, akkor azt látjuk, hogy két modulhoz tértünk vissza.

ar -t libcipher.a

Ha törölni kíván modulokat a könyvtárából, ne felejtse el eltávolítani a definíciójukat a könyvtár fejlécfájljából.

Ossza meg kódját

A könyvtárak praktikus, de privát módon teszik megoszthatóvá a kódot. Bárki, akinek megadja a könyvtárfájlt és a fejlécfájlt, használhatja a könyvtárát, de a tényleges forráskód privát marad.