So verwenden Sie den ar-Befehl von Linux zum Erstellen statischer Bibliotheken

Verwenden Sie den ar-Befehl von Linux, um Funktionsbibliotheken zu erstellen, wenn Sie Software entwickeln. Dieses Tutorial zeigt Ihnen, wie Sie eine statische Bibliothek erstellen, ändern und in einem Programm verwenden, einschließlich Beispielcode.

Der Befehl ar ist ein echter Veteran – es gibt ihn seit 1971. Der Name ar bezieht sich auf den ursprünglichen Verwendungszweck des Tools, der Archivdateien erstellen. Eine Archivdatei ist eine einzelne Datei, die als Container für andere Dateien fungiert. Manchmal für viele andere Dateien. Dateien können dem Archiv hinzugefügt, entfernt oder daraus extrahiert werden. Menschen, die nach dieser Art von Funktionalität suchen, wenden sich nicht mehr an ar. Diese Rolle wurde von anderen Dienstprogrammen wie tar übernommen.

Der Befehl ar wird jedoch immer noch für einige spezielle Zwecke verwendet. ar wird verwendet, um statische Bibliotheken zu erstellen. Diese werden in der Softwareentwicklung verwendet. Und ar wird auch verwendet, um Paketdateien wie die „.deb“-Dateien zu erstellen, die in der Debian-Linux-Distribution und ihren Derivaten wie Ubuntu verwendet werden.

Wir führen die Schritte durch, die zum Erstellen und Ändern einer statischen Bibliothek erforderlich sind, und zeigen, wie die Bibliothek in einem Programm verwendet wird. Dazu benötigen wir eine Anforderung, die die statische Bibliothek erfüllen muss. Der Zweck dieser Bibliothek besteht darin, Textstrings zu codieren und codierten Text zu decodieren.

Bitte beachten Sie, dass dies ein schneller und schmutziger Hack zu Demonstrationszwecken ist. Verwenden Sie diese Verschlüsselung nicht für Wertgegenstände. Es ist das einfachste der Welt Ersatzchiffre, wobei A zu B wird, aus B zu C wird und so weiter.

Die Funktionen cipher_encode() und cipher_decode()

Wir werden in einem Verzeichnis namens „library“ arbeiten und später ein Unterverzeichnis namens „test“ erstellen.

Wir haben zwei Dateien in diesem Verzeichnis. In einer Textdatei namens cipher_encode.c haben wir die Funktion cipher_encode():

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

} // end of cipher_encode

Die entsprechende Funktion cipher_decode() befindet sich in einer Textdatei namens cipher_decode.c:

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

} // end of cipher_decode

Dateien, die Programmieranweisungen enthalten, werden Quellcodedateien genannt. Wir werden eine Bibliotheksdatei namens libcipher.a erstellen. Es enthält die kompilierten Versionen dieser beiden Quellcodedateien. Wir erstellen auch eine kurze Textdatei namens libcipher.h. Dies ist eine Header-Datei, die die Definitionen der beiden Funktionen in unserer neuen Bibliothek enthält.

Jeder, der die Bibliothek und die Header-Datei besitzt, kann die beiden Funktionen in seinen eigenen Programmen verwenden. Sie müssen das Rad nicht neu erfinden und die Funktionen neu schreiben; sie nutzen einfach die Exemplare unserer Bibliothek.

Kompilieren der Dateien cipher_encode.c und cipher_decode.c

Um die Quellcodedateien zu kompilieren, verwenden wir gcc, das Standard-GNU-Compiler. Die Option -c (compile, no link) weist gcc an, die Dateien zu kompilieren und dann zu stoppen. Es erzeugt aus jeder Quellcodedatei eine Zwischendatei, die als Objektdatei bezeichnet wird. Der gcc-Linker nimmt normalerweise alle Objektdateien und verknüpft sie zu einem ausführbaren Programm. Wir überspringen diesen Schritt, indem wir die Option -c verwenden. Wir brauchen nur die Objektdateien.

  So greifen Sie unter Linux auf Google Drive zu

Lassen Sie uns überprüfen, ob wir die Dateien haben, von denen wir glauben, dass wir sie haben.

ls -l

Die beiden Quellcodedateien sind in diesem Verzeichnis vorhanden. Lassen Sie uns gcc verwenden, um sie in Objektdateien zu kompilieren.

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

Es sollte keine Ausgabe von gcc geben, wenn alles gut geht.

Dadurch werden zwei Objektdateien mit demselben Namen wie die Quellcodedateien generiert, jedoch mit der Erweiterung „.o“. Dies sind die Dateien, die wir der Bibliotheksdatei hinzufügen müssen.

ls -l

Erstellen der Bibliothek libcipher.a

Um die Bibliotheksdatei zu erstellen – die eigentlich eine Archivdatei ist – verwenden wir ar.

Wir verwenden die Option -c (create), um die Bibliotheksdatei zu erstellen, die Option -r (add with replace), um die Dateien zur Bibliotheksdatei hinzuzufügen, und die Option -s (index), um einen Index der darin enthaltenen Dateien zu erstellen die Bibliotheksdatei.

Wir werden die Bibliotheksdatei libcipher.a aufrufen. Wir geben diesen Namen in der Befehlszeile zusammen mit den Namen der Objektdateien an, die wir der Bibliothek hinzufügen werden.

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

Wenn wir die Dateien im Verzeichnis auflisten, sehen wir, dass wir jetzt eine Datei libcipher.a haben.

ls -l

Wenn wir die Option -t (Tabelle) mit ar verwenden, können wir die Module in der Bibliotheksdatei sehen.

ar -t libcipher.a

Erstellen der Header-Datei libcipher.h

Die Datei libcipher.h wird in jedes Programm aufgenommen, das die Bibliothek libcipher.a verwendet. Die Datei libcipher.h muss die Definition der Funktionen enthalten, die sich in der Bibliothek befinden.

Um die Header-Datei zu erstellen, müssen wir die Funktionsdefinitionen in einen Texteditor wie gedit eingeben. Benennen Sie die Datei „libcipher.h“ und speichern Sie sie im selben Verzeichnis wie die Datei libcipher.a.

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

Verwenden der libcipher-Bibliothek

Der einzig sichere Weg, unsere neue Bibliothek zu testen, besteht darin, ein kleines Programm zu schreiben, um sie zu verwenden. Zuerst erstellen wir ein Verzeichnis namens test.

mkdir test

Wir kopieren die Bibliotheks- und Header-Dateien in das neue Verzeichnis.

cp libcipher.* ./test

Wir wechseln in das neue Verzeichnis.

cd test

Lassen Sie uns überprüfen, ob unsere beiden Dateien hier sind.

ls -l

Wir müssen ein kleines Programm erstellen, das die Bibliothek verwenden und beweisen kann, dass es wie erwartet funktioniert. Geben Sie die folgenden Textzeilen in einen Editor ein. Speichern Sie den Inhalt des Editors in einer Datei namens „test.c“ im Testverzeichnis.

#include 
#include 

#include "libcipher.h"

int main(int argc, char *argv[])
{
 char text[]="1techpc.de loves Linux";

 puts(text);

 cipher_encode(text);
 puts(text);

 cipher_decode(text);
 puts(text);

 exit (0);

} // end of main

Der Programmablauf ist ganz einfach:

Es enthält die Datei libcipher.h, damit es die Definitionen der Bibliotheksfunktionen sehen kann.
Es erstellt einen String namens „text“ und speichert darin die Worte „1techpc.de loves Linux“.
Es gibt diese Zeichenfolge auf dem Bildschirm aus.
Es ruft die Funktion cipher_encode() auf, um die Zeichenfolge zu kodieren, und gibt die kodierte Zeichenfolge auf dem Bildschirm aus.
Es ruft cipher_decode() auf, um den String zu dekodieren und gibt den dekodierten String auf dem Bildschirm aus.

  So installieren Sie Solus Linux

Um das Testprogramm zu generieren, müssen wir das Programm test.c kompilieren und in die Bibliothek einbinden. Die Option -o (Ausgabe) teilt gcc mit, wie das von ihm generierte ausführbare Programm aufgerufen werden soll.

gcc test.c libcipher.a -o test

Wenn gcc Sie stillschweigend zur Eingabeaufforderung zurückführt, ist alles in Ordnung. Jetzt testen wir unser Programm. Moment der Wahrheit:

./test

Und wir sehen die erwartete Leistung. Das Testprogramm druckt den Klartext, druckt den verschlüsselten Text und druckt dann den entschlüsselten Text. Es verwendet die Funktionen unserer neuen Bibliothek. Unsere Bibliothek arbeitet.

Erfolg. Aber warum hier aufhören?

Ein weiteres Modul zur Bibliothek hinzufügen

Fügen wir der Bibliothek eine weitere Funktion hinzu. Wir fügen eine Funktion hinzu, die der Programmierer verwenden kann, um die Version der Bibliothek anzuzeigen, die er verwendet. Wir müssen die neue Funktion erstellen, kompilieren und die neue Objektdatei zur vorhandenen Bibliotheksdatei hinzufügen.

Geben Sie die folgenden Zeilen in einen Editor ein. Speichern Sie den Inhalt des Editors in einer Datei namens cipher_version.c im Bibliotheksverzeichnis.

#include 

void cipher_version(void)
{
 puts("1techpc.de :: VERY INSECURE Cipher Library");
 puts("Version 0.0.1 Alphan");

} // end of cipher_version

Wir müssen die Definition der neuen Funktion zur Header-Datei libcipher.h hinzufügen. Fügen Sie am Ende dieser Datei eine neue Zeile hinzu, sodass sie wie folgt aussieht:

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

Speichern Sie die geänderte Datei libcipher.h.

Wir müssen die Datei cipher_version.c kompilieren, damit wir eine Objektdatei cipher_version.o haben.

gcc -c cipher_version.c

Dadurch wird eine Datei cipher_version.o erstellt. Wir können die neue Objektdatei mit dem folgenden Befehl zur Bibliothek libcipher.a hinzufügen. Die Option -v (ausführlich) lässt das normalerweise stille ar uns sagen, was es getan hat.

ar -rsv libcipher.a cipher_version.o

Die neue Objektdatei wird der Bibliotheksdatei hinzugefügt. ar druckt eine Bestätigung aus. Das „a“ bedeutet „hinzugefügt“.

Wir können die Option -t (Tabelle) verwenden, um zu sehen, welche Module sich in der Bibliotheksdatei befinden.

ar -t libcipher.a

Es gibt jetzt drei Module in unserer Bibliotheksdatei. Nutzen wir die neue Funktion.

Verwenden der Funktion cipher_version().

Entfernen wir die alte Bibliothek und Header-Datei aus dem Testverzeichnis, kopieren die neuen Dateien hinein und wechseln dann wieder in das Testverzeichnis.

Wir werden die alten Versionen der Dateien löschen.

rm ./test/libcipher.*

Wir kopieren die neuen Versionen in das Testverzeichnis.

cp libcipher.* ./test

Wir wechseln in das Testverzeichnis.

cd test

Und jetzt können wir das Programm test.c so modifizieren, dass es die neue Bibliotheksfunktion verwendet.

Wir müssen dem Programm test.c eine neue Zeile hinzufügen, die die Funktion cipher_version() aufruft. Wir platzieren dies vor dem ersten puts(text); Linie.

#include 
#include  

#include "libcipher.h" 

int main(int argc, char *argv[]) 
{
 char text[]="1techpc.de 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

Speichern Sie dies als test.c. Wir können es jetzt kompilieren und testen, ob die neue Funktion betriebsbereit ist.

gcc test.c libcipher.a -o test

Lassen Sie uns die neue Testversion ausführen:

  So führen Sie Linux auf Android mit Linux Deploy aus

Die neue Funktion funktioniert. Wir können die Version der Bibliothek zu Beginn der Ausgabe von test sehen.

Aber es kann ein Problem geben.

Ersetzen eines Moduls in der Bibliothek

Dies ist nicht die erste Version der Bibliothek; es ist das zweite. Unsere Versionsnummer ist falsch. Die erste Version enthielt keine Funktion cipher_version(). Dieser tut es. Dies sollte also die Version „0.0.2“ sein. Wir müssen die Funktion cipher_version() in der Bibliothek durch eine korrigierte ersetzen.

Zum Glück macht ar das sehr einfach.

Bearbeiten wir zunächst die Datei cipher_version.c im Bibliotheksverzeichnis. Ändern Sie den Text „Version 0.0.1 Alpha“ in „Version 0.0.2 Alpha“. Es sollte so aussehen:

#include 

void cipher_version(void)
{
 puts("1techpc.de :: VERY INSECURE Cipher Library");  
 puts("Version 0.0.2 Alphan"); 

} // end of cipher_version

Speichern Sie diese Datei. Wir müssen es erneut kompilieren, um eine neue Objektdatei cipher_version.o zu erstellen.

gcc -c cipher_version.c

Jetzt werden wir das vorhandene cipher_version.o-Objekt in der Bibliothek durch unsere neu kompilierte Version ersetzen.

Wir haben zuvor die Option -r (add with replace) verwendet, um der Bibliothek neue Module hinzuzufügen. Wenn wir es mit einem Modul verwenden, das bereits in der Bibliothek vorhanden ist, ersetzt ar die alte Version durch die neue. Die Option -s (index) aktualisiert den Bibliotheksindex und die Option -v (verbose) lässt uns sagen, was es getan hat.

ar -rsv libcipher.a cipher_version.o

Diesmal meldet ar, dass es das Modul cipher_version.o ersetzt hat. Das „r“ bedeutet ersetzt.

Verwenden der aktualisierten cipher_version()-Funktion

Wir sollten unsere modifizierte Bibliothek verwenden und überprüfen, ob sie funktioniert.

Wir werden die Bibliotheksdateien in das Testverzeichnis kopieren.

cp libcipher.* ./test

Wir wechseln in das Testverzeichnis.

cd ./test

Wir müssen unser Testprogramm mit unserer neuen Bibliothek neu kompilieren.

gcc test.c libcipher.a -o test

Und jetzt können wir unser Programm testen.

./test

Die Ausgabe des Testprogramms entspricht unseren Erwartungen. Die korrekte Versionsnummer wird in der Versionszeichenfolge angezeigt und die Verschlüsselungs- und Entschlüsselungsroutinen funktionieren.

Löschen von Modulen aus einer Bibliothek

Es scheint nach all dem eine Schande, aber löschen wir die Datei cipher_version.o aus der Bibliotheksdatei.

Dazu verwenden wir die Option -d (delete). Wir verwenden auch die Option -v (ausführlich), damit ar uns mitteilt, was es getan hat. Wir fügen auch die Option -s (index) hinzu, um den Index in der Bibliotheksdatei zu aktualisieren.

ar -dsv libcipher.a cipher_version.o

ar meldet, dass das Modul entfernt wurde. Das „d“ bedeutet „gelöscht“.

Wenn wir ar bitten, die Module in der Bibliotheksdatei aufzulisten, sehen wir, dass wir wieder bei zwei Modulen sind.

ar -t libcipher.a

Wenn Sie Module aus Ihrer Bibliothek löschen möchten, denken Sie daran, deren Definition aus der Headerdatei der Bibliothek zu entfernen.

Teile deinen Code

Bibliotheken machen Code auf praktische, aber private Weise gemeinsam nutzbar. Jeder, dem Sie die Bibliotheksdatei und die Headerdatei überlassen, kann Ihre Bibliothek verwenden, aber Ihr eigentlicher Quellcode bleibt privat.