Comment utiliser la commande ar de Linux pour créer des bibliothèques statiques

Utilisez la commande ar de Linux pour créer des bibliothèques de fonctions lorsque vous développez un logiciel. Ce didacticiel vous montrera comment créer une bibliothèque statique, la modifier et l’utiliser dans un programme, avec un exemple de code.

La commande ar est un véritable vétéran – elle existe depuis 1971. Le nom ar fait référence à l’utilisation initialement prévue de l’outil, qui était pour créer des fichiers d’archive. Un fichier d’archive est un fichier unique qui agit comme un conteneur pour d’autres fichiers. Parfois pour de nombreux autres fichiers. Les fichiers peuvent être ajoutés, supprimés ou extraits de l’archive. Les personnes à la recherche de ce type de fonctionnalité ne se tournent plus vers ar. Ce rôle a été repris par d’autres utilitaires tels que tar.

La commande ar est cependant toujours utilisée à quelques fins spécialisées. ar est utilisé pour créer des bibliothèques statiques. Ceux-ci sont utilisés dans le développement de logiciels. Et ar est également utilisé pour créer des fichiers de package tels que les fichiers «.deb» utilisés dans la distribution Debian Linux et ses dérivés tels qu’Ubuntu.

Nous allons parcourir les étapes nécessaires pour créer et modifier une bibliothèque statique et montrer comment utiliser la bibliothèque dans un programme. Pour ce faire, nous avons besoin d’une exigence pour la bibliothèque statique à remplir. Le but de cette bibliothèque est d’encoder des chaînes de texte et de décoder du texte encodé.

Veuillez noter qu’il s’agit d’un hack rapide et sale à des fins de démonstration. N’utilisez pas ce cryptage pour tout ce qui a de la valeur. C’est le plus simple du monde chiffre de substitution, où A devient B, B devient C, et ainsi de suite.

Les fonctions cipher_encode () et cipher_decode ()

Nous allons travailler dans un répertoire appelé «bibliothèque», et plus tard, nous créerons un sous-répertoire appelé «test».

Nous avons deux fichiers dans ce répertoire. Dans un fichier texte appelé cipher_encode.c, nous avons la fonction cipher_encode ():

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

} // end of cipher_encode

La fonction cipher_decode () correspondante se trouve dans un fichier texte appelé cipher_decode.c:

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

} // end of cipher_decode

Les fichiers qui contiennent des instructions de programmation sont appelés fichiers de code source. Nous allons créer un fichier de bibliothèque appelé libcipher.a. Il contiendra les versions compilées de ces deux fichiers de code source. Nous allons également créer un court fichier texte appelé libcipher.h. Il s’agit d’un fichier d’en-tête contenant les définitions des deux fonctions de notre nouvelle bibliothèque.

Toute personne disposant de la bibliothèque et du fichier d’en-tête pourra utiliser les deux fonctions dans ses propres programmes. Ils n’ont pas besoin de réinventer la roue et de réécrire les fonctions; ils utilisent simplement les copies de notre bibliothèque.

  Les 6 meilleurs outils de sauvegarde système pour le bureau Linux

Compilation des fichiers cipher_encode.c et cipher_decode.c

Pour compiler les fichiers de code source, nous utiliserons gcc, le compilateur GNU standard. L’option -c (compiler, pas de lien) indique à gcc de compiler les fichiers puis de s’arrêter. Il produit un fichier intermédiaire à partir de chaque fichier de code source appelé fichier objet. L’éditeur de liens gcc prend généralement tous les fichiers objets et les lie ensemble pour créer un programme exécutable. Nous sautons cette étape en utilisant l’option -c. Nous avons juste besoin des fichiers objets.

Vérifions que nous avons les fichiers que nous pensons avoir.

ls -l

ls dans une fenêtre de terminal

Les deux fichiers de code source sont présents dans ce répertoire. Utilisons gcc pour les compiler en fichiers objets.

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

Il ne devrait y avoir aucune sortie de gcc si tout se passe bien.

sortie de gcc dans une fenêtre de terminal

Cela génère deux fichiers objets avec le même nom que les fichiers de code source, mais avec les extensions «.o». Ce sont les fichiers que nous devons ajouter au fichier de bibliothèque.

ls -l

sortie de ls -l dans une fenêtre de terminal

Création de la bibliothèque libcipher.a

Pour créer le fichier de bibliothèque – qui est en fait un fichier d’archive – nous utiliserons ar.

Nous utilisons l’option -c (créer) pour créer le fichier de bibliothèque, l’option -r (ajouter avec remplacer) pour ajouter les fichiers au fichier de bibliothèque et l’option -s (index) pour créer un index des fichiers à l’intérieur le fichier de bibliothèque.

Nous allons appeler le fichier de bibliothèque libcipher.a. Nous fournissons ce nom sur la ligne de commande, ainsi que les noms des fichiers objets que nous allons ajouter à la bibliothèque.

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

ar -crs libcipher.a cipher_encode.o cipher_decode.o dans une fenêtre de terminal

Si nous listons les fichiers dans le répertoire, nous verrons que nous avons maintenant un fichier libcipher.a.

ls -l

sortie de ls dans une fenêtre de terminal

Si nous utilisons l’option -t (table) avec ar, nous pouvons voir les modules à l’intérieur du fichier de bibliothèque.

ar -t libcipher.a

ar -t libcipher.a dans une fenêtre de terminal

Création du fichier d’en-tête libcipher.h

Le fichier libcipher.h sera inclus dans tout programme utilisant la bibliothèque libcipher.a. Le fichier libcipher.h doit contenir la définition des fonctions qui se trouvent dans la bibliothèque.

Pour créer le fichier d’en-tête, nous devons taper les définitions de fonction dans un éditeur de texte tel que gedit. Nommez le fichier «libcipher.h» et enregistrez-le dans le même répertoire que le fichier libcipher.a.

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

Utilisation de la bibliothèque libcipher

Le seul moyen sûr de tester notre nouvelle bibliothèque est d’écrire un petit programme pour l’utiliser. Tout d’abord, nous allons créer un répertoire appelé test.

mkdir test

Nous allons copier la bibliothèque et les fichiers d’en-tête dans le nouveau répertoire.

cp libcipher.* ./test

Nous allons changer dans le nouveau répertoire.

cd test

Vérifions que nos deux fichiers sont ici.

ls -l

cp libcipher. * ./test dans une fenêtre de terminal

Nous devons créer un petit programme qui peut utiliser la bibliothèque et prouver qu’elle fonctionne comme prévu. Tapez les lignes de texte suivantes dans un éditeur. Enregistrez le contenu de l’éditeur dans un fichier nommé «test.c» dans le répertoire de test.

#include 
#include 

#include "libcipher.h"

int main(int argc, char *argv[])
{
 char text[]="toptips.fr loves Linux";

 puts(text);

 cipher_encode(text);
 puts(text);

 cipher_decode(text);
 puts(text);

 exit (0);

} // end of main

Le déroulement du programme est très simple:

  Comment créer un filigrane discret sur les photos pour éviter le vol sous Windows 10

Il inclut le fichier libcipher.h afin qu’il puisse voir les définitions des fonctions de la bibliothèque.
Il crée une chaîne appelée «texte» et y stocke les mots «toptips.fr aime Linux».
Il imprime cette chaîne à l’écran.
il appelle la fonction cipher_encode () pour encoder la chaîne, et il imprime la chaîne encodée à l’écran.
Il appelle cipher_decode () pour décoder la chaîne et affiche la chaîne décodée à l’écran.

Pour générer le programme de test, nous devons compiler le programme test.c et créer un lien dans la bibliothèque. L’option -o (sortie) indique à gcc comment appeler le programme exécutable qu’il génère.

gcc test.c libcipher.a -o test

gcc test.c libcipher.a -o test dans une fenêtre de terminal

Si gcc vous renvoie silencieusement à l’invite de commande, tout va bien. Testons maintenant notre programme. Moment de vérité:

./test

./test dans une fenêtre de terminal

Et nous voyons la sortie attendue. Le programme de test imprime le texte brut imprime le texte crypté puis imprime le texte décrypté. Il utilise les fonctions de notre nouvelle bibliothèque. Notre bibliothèque fonctionne.

sortie du programme de test dans une fenêtre de terminal

Succès. Mais pourquoi s’arrêter là?

Ajout d’un autre module à la bibliothèque

Ajoutons une autre fonction à la bibliothèque. Nous ajouterons une fonction que le programmeur peut utiliser pour afficher la version de la bibliothèque qu’il utilise. Nous devrons créer la nouvelle fonction, la compiler et ajouter le nouveau fichier objet au fichier de bibliothèque existant.

Tapez les lignes suivantes dans un éditeur. Enregistrez le contenu de l’éditeur dans un fichier nommé cipher_version.c, dans le répertoire de la bibliothèque.

#include 

void cipher_version(void)
{
 puts("toptips.fr :: VERY INSECURE Cipher Library");
 puts("Version 0.0.1 Alphan");

} // end of cipher_version

Nous devons ajouter la définition de la nouvelle fonction au fichier d’en-tête libcipher.h. Ajoutez une nouvelle ligne au bas de ce fichier, de sorte qu’il ressemble à ceci:

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

Enregistrez le fichier libcipher.h modifié.

Nous devons compiler le fichier cipher_version.c pour avoir un fichier objet cipher_version.o.

gcc -c cipher_version.c

gcc -c version_cipher.c dans une fenêtre de terminal

Cela crée un fichier cipher_version.o. Nous pouvons ajouter le nouveau fichier objet à la bibliothèque libcipher.a avec la commande suivante. L’option -v (verbose) permet à l’ar généralement silencieux de nous dire ce qu’il a fait.

ar -rsv libcipher.a cipher_version.o

ar -rsv libcipher.a cipher_version.o dans une fenêtre de terminal

Le nouveau fichier objet est ajouté au fichier bibliothèque. ar imprime la confirmation. Le «a» signifie «ajouté».

sortie d'ar dans une fenêtre de terminal

Nous pouvons utiliser l’option -t (table) pour voir quels modules se trouvent dans le fichier de bibliothèque.

ar -t libcipher.a

ar -t libcipher.a dans une fenêtre de terminal

Il y a maintenant trois modules dans notre fichier de bibliothèque. Utilisons la nouvelle fonction.

Utilisation de la fonction cipher_version ().

Supprimons l’ancienne bibliothèque et le fichier d’en-tête du répertoire de test, copions les nouveaux fichiers, puis revenons dans le répertoire de test.

Nous supprimerons les anciennes versions des fichiers.

rm ./test/libcipher.*

Nous allons copier les nouvelles versions dans le répertoire de test.

cp libcipher.* ./test

Nous allons changer dans le répertoire de test.

cd test

rm ./test/libcipher.* dans une fenêtre de terminal

Et maintenant, nous pouvons modifier le programme test.c afin qu’il utilise la nouvelle fonction de bibliothèque.

Nous devons ajouter une nouvelle ligne au programme test.c qui appelle la fonction cipher_version (). Nous placerons ceci avant les premiers met (texte); ligne.

#include 
#include  

#include "libcipher.h" 

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

Enregistrez-le sous test.c. Nous pouvons maintenant le compiler et tester que la nouvelle fonction est opérationnelle.

gcc test.c libcipher.a -o test

gcc test.c libcipher.a -o test dans une fenêtre de terminal

Lançons la nouvelle version de test:

  Comment faire un clic central pour fermer les applications sur Windows 10

sortie du programme de test dans une fenêtre de terminal

La nouvelle fonction fonctionne. Nous pouvons voir la version de la bibliothèque au début de la sortie du test.

Mais il peut y avoir un problème.

Remplacement d’un module dans la bibliothèque

Ce n’est pas la première version de la bibliothèque; c’est la seconde. Notre numéro de version est incorrect. La première version ne contenait pas de fonction cipher_version (). Celui-ci le fait. Cela devrait donc être la version « 0.0.2 ». Nous devons remplacer la fonction cipher_version () dans la bibliothèque par une fonction corrigée.

Heureusement, ar rend cela très facile à faire.

Tout d’abord, éditons le fichier cipher_version.c dans le répertoire de la bibliothèque. Remplacez le texte «Version 0.0.1 Alpha» par «Version 0.0.2 Alpha». Ça devrait ressembler à ça:

#include 

void cipher_version(void)
{
 puts("toptips.fr :: VERY INSECURE Cipher Library");  
 puts("Version 0.0.2 Alphan"); 

} // end of cipher_version

Enregistrez ce fichier. Nous devons le compiler à nouveau pour créer un nouveau fichier objet cipher_version.o.

gcc -c cipher_version.c

gcc -c version_cipher.c dans une fenêtre de terminal

Nous allons maintenant remplacer l’objet cipher_version.o existant dans la bibliothèque par notre nouvelle version compilée.

Nous avons déjà utilisé l’option -r (ajouter avec remplacer) pour ajouter de nouveaux modules à la bibliothèque. Lorsque nous l’utilisons avec un module qui existe déjà dans la bibliothèque, ar remplacera l’ancienne version par la nouvelle. L’option -s (index) mettra à jour l’index de la bibliothèque et l’option -v (verbose) permettra à ar de nous dire ce qu’il a fait.

ar -rsv libcipher.a cipher_version.o

ar -rsv libcipher.a cipher_version.o dans une fenêtre de terminal

Cette fois, ar signale qu’il a remplacé le module cipher_version.o. Le «r» signifie remplacé.

sortie ar dans une fenêtre de terminal

Utilisation de la fonction cipher_version () mise à jour

Nous devrions utiliser notre bibliothèque modifiée et vérifier qu’elle fonctionne.

Nous allons copier les fichiers de la bibliothèque dans le répertoire de test.

cp libcipher.* ./test

Nous allons changer dans le répertoire de test.

cd ./test

Nous devons recompiler notre programme de test avec notre nouvelle bibliothèque.

gcc test.c libcipher.a -o test

Et maintenant, nous pouvons tester notre programme.

./test

cp libcipher. * ./test dans une fenêtre de terminal

Le résultat du programme de test correspond à ce que nous attendions. Le numéro de version correct est affiché dans la chaîne de version et les routines de chiffrement et de déchiffrement fonctionnent.

Suppression de modules d’une bibliothèque

Cela semble dommage après tout cela, mais supprimons le fichier cipher_version.o du fichier de bibliothèque.

Pour ce faire, nous utiliserons l’option -d (supprimer). Nous utiliserons également l’option -v (verbose), afin que ar nous dise ce qu’il a fait. Nous inclurons également l’option -s (index) pour mettre à jour l’index dans le fichier de bibliothèque.

ar -dsv libcipher.a cipher_version.o

ar -dsv libcipher.a cipher_version.o dans une fenêtre de terminal

ar signale qu’il a supprimé le module. Le «d» signifie «supprimé».

Si nous demandons à ar de lister les modules à l’intérieur du fichier de bibliothèque, nous verrons que nous sommes de retour à deux modules.

ar -t libcipher.a

ar -t libcipher.a dans une fenêtre de terminal

Si vous comptez supprimer des modules de votre bibliothèque, n’oubliez pas de supprimer leur définition du fichier d’en-tête de la bibliothèque.

Partagez votre code

Les bibliothèques rendent le code partageable d’une manière pratique mais privée. Toute personne à qui vous donnez le fichier de bibliothèque et le fichier d’en-tête peut utiliser votre bibliothèque, mais votre code source réel reste privé.