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

Verwenden Sie Linuxs ar Befehl zum Erstellen von Funktionsbibliotheken beim Entwickeln von Software. Dieses Tutorial zeigt Ihnen, wie Sie eine statische Bibliothek erstellen, ändern und in einem Programm verwenden, einschließlich Beispielcode.

Die ar Command ist ein echter Veteran—es gibt es schon seit 1971. Der Name ar verweist auf den ursprünglichen Verwendungszweck des Werkzeugs, 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. Leute, die nach dieser Art von Funktionalität suchen, wenden sich nicht mehr an ar. Diese Rolle wurde von anderen Versorgungsunternehmen übernommen, wie z tar.

Die ar Der Befehl 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.

So komprimieren und extrahieren Sie Dateien mit dem tar-Befehl unter Linux

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 cipher_encode() Funktion:

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

} // end of cipher_encode

Die entsprechende cipher_decode() Die Funktion 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 -c (kompilieren, kein Link) Option sagt gcc um die Dateien zu kompilieren und dann zu stoppen. Es erzeugt aus jeder Quellcodedatei eine Zwischendatei, die als Objektdatei bezeichnet wird. Die gcc linker nimmt normalerweise alle Objektdateien und verknüpft sie zu einem ausführbaren Programm. Wir überspringen diesen Schritt, indem wir die -c Möglichkeit. Wir brauchen nur die Objektdateien.


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. Lass uns verwenden gcc um sie zu Objektdateien zu kompilieren.

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

Es sollte keine Ausgabe von gcc 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 -c (Erstellen) Option zum Erstellen der Bibliotheksdatei, die -r (Hinzufügen mit Ersetzen) Option, um die Dateien zur Bibliotheksdatei hinzuzufügen, und die -s (index) Option, um einen Index der Dateien in der Bibliotheksdatei zu erstellen.


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 verwenden -t (Tabelle) Option mit ar Wir können 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 <stdio.h>
#include <stdlib.h>

#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

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 „How-To Geek loves Linux“.
  • Es gibt diese Zeichenfolge auf dem Bildschirm aus.
  • es ruft die cipher_encode() -Funktion zum Kodieren der Zeichenfolge und gibt die kodierte Zeichenfolge auf dem Bildschirm aus.
  • Es ruft cipher_decode() um den String zu dekodieren und gibt den dekodierten String auf dem Bildschirm aus.

Um die . zu generieren test Programm müssen wir das Programm test.c kompilieren und in die Bibliothek einbinden. Die -o (Ausgabe) Option sagt gcc was das ausführbare Programm nennen soll, das es generiert.

gcc test.c libcipher.a -o test

Wenn gcc bringt Sie stillschweigend zur Eingabeaufforderung zurück, alles ist gut. Jetzt testen wir unser Programm. Moment der Wahrheit:

./test

Und wir sehen die erwartete Leistung. Die test Programm 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 <stdio.h>

void cipher_version(void)
{
 puts("How-To Geek :: 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 -v (ausführliche) Option macht das normalerweise stumm ar Sagen Sie uns, 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 das gebrauchen -t (Tabelle) Option, 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, das aufruft, eine neue Zeile hinzufügen cipher_version() Funktion. Wir werden das vor dem ersten platzieren puts(text); Leitung.

#include <stdio.h>
#include <stdlib.h> 

#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

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 Version von ausführen test:

Die neue Funktion funktioniert. Wir sehen die Version der Bibliothek am Anfang der Ausgabe von test.

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 hatte keine cipher_version() Funktion darin. Dieser tut es. Dies sollte also die Version „0.0.2“ sein. Wir müssen die ersetzen cipher_version() Funktion in der Bibliothek mit einer korrigierten.

Gott sei Dank, ar macht das ganz 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 <stdio.h>

void cipher_version(void)
{
 puts("How-To Geek :: 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 die benutzt -r (Hinzufügen mit ersetzen) Option vor, um der Bibliothek neue Module hinzuzufügen. Wenn wir es mit einem Modul verwenden, das bereits in der Bibliothek vorhanden ist, ar ersetzt die alte Version durch die neue. Die -s (index) Option aktualisiert den Bibliotheksindex und die -v (ausführliche) Option macht ar Sagen Sie uns, was es getan hat.

ar -rsv libcipher.a cipher_version.o

Diesmal ar meldet, 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 -d (löschen) Option. Wir werden auch die verwenden -v (ausführliche) Option, damit ar sagt uns, was es getan hat. Wir werden auch die -s (index) Option, 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 fragen ar Um 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.

Linux-Befehle
DateienTeer · pv · Katze · tac · chmod · grep · unterschied · sed · Mit · Mann · geschoben · popd · fsck · Testdisk · seq · fd · pandoc · CD · $PFAD · awk · beitreten · jq · falten · einzigartig · Journalctl · Schwanz · stat · ls · fstab · Echo · weniger · chgrp · chown · rev · aussehen · Saiten · Typ · umbenennen · Postleitzahl · entpacken · montieren · ummount · Installieren · fdisk · mkfs · rm · rmdir · rsync · df · gpg · wir · Nano · mkdir · von · ln · Patch · Konvertieren · rclon · Fetzen · srm
Prozessealias · Bildschirm · oben · nett · renice · Fortschritt · strace · System · tmux · chsh · Geschichte · bei · Charge · kostenlos · welcher · dmesg · chfn · Benutzermod · ps · chroot · xargs · tty · kleiner Finger · lsof · vmstat · Auszeit · Mauer · Jawohl · töten · Schlaf · sudo · es ist · Zeit · groupadd · Benutzermod · Gruppen · lshw · abschalten · neu starten · Halt · ausschalten · passwd · lscpu · crontab · Datum · bg · fg
Vernetzungnetstat · Klingeln · Traceroute · ip · ss · Wer ist · fail2ban · bmon · Sie · Finger · nmap · ftp · curl · wget · Wer · Wer bin ich · w · iptables · ssh-keygen · ufw

Beste Linux-Laptops für Entwickler und Enthusiasten

Related Posts