Πώς να χρησιμοποιήσετε την εντολή ar του Linux για να δημιουργήσετε στατικές βιβλιοθήκες

Χρησιμοποιήστε την εντολή ar του Linux για να δημιουργήσετε βιβλιοθήκες συναρτήσεων όταν αναπτύσσετε λογισμικό. Αυτό το σεμινάριο θα σας δείξει πώς να δημιουργήσετε μια στατική βιβλιοθήκη, να την τροποποιήσετε και να τη χρησιμοποιήσετε σε ένα πρόγραμμα, με δείγμα κώδικα.

Η εντολή ar είναι ένας πραγματικός βετεράνος—υπάρχει από το 1971. Το όνομα ar αναφέρεται στην αρχική προβλεπόμενη χρήση του εργαλείου, η οποία ήταν για να δημιουργήσετε αρχεία αρχειοθέτησης. Ένα αρχείο αρχειοθέτησης είναι ένα μεμονωμένο αρχείο που λειτουργεί ως κοντέινερ για άλλα αρχεία. Μερικές φορές για πολλά άλλα αρχεία. Τα αρχεία μπορούν να προστεθούν, να αφαιρεθούν ή να εξαχθούν από το αρχείο. Τα άτομα που αναζητούν αυτόν τον τύπο λειτουργικότητας δεν στρέφονται πλέον στο ar. Αυτόν τον ρόλο έχουν αναλάβει άλλα βοηθητικά προγράμματα όπως η πίσσα.

Ωστόσο, η εντολή ar εξακολουθεί να χρησιμοποιείται για ορισμένους ειδικούς σκοπούς. Το ar χρησιμοποιείται για τη δημιουργία στατικών βιβλιοθηκών. Αυτά χρησιμοποιούνται στην ανάπτυξη λογισμικού. Και το ar χρησιμοποιείται επίσης για τη δημιουργία αρχείων πακέτων όπως τα αρχεία “.deb” που χρησιμοποιούνται στη διανομή του Debian Linux και τα παράγωγά του όπως το Ubuntu.

Θα εκτελέσουμε τα βήματα που απαιτούνται για τη δημιουργία και την τροποποίηση μιας στατικής βιβλιοθήκης και θα δείξουμε πώς να χρησιμοποιήσετε τη βιβλιοθήκη σε ένα πρόγραμμα. Για να το κάνουμε αυτό χρειαζόμαστε μια απαίτηση για την εκπλήρωση της στατικής βιβλιοθήκης. Ο σκοπός αυτής της βιβλιοθήκης είναι να κωδικοποιεί συμβολοσειρές κειμένου και να αποκωδικοποιεί κωδικοποιημένο κείμενο.

Σημειώστε ότι πρόκειται για ένα γρήγορο και βρώμικο hack για σκοπούς επίδειξης. Μην χρησιμοποιείτε αυτήν την κρυπτογράφηση για οτιδήποτε έχει αξία. Είναι το πιο απλό στον κόσμο κρυπτογράφηση αντικατάστασης, όπου το Α γίνεται Β, το Β γίνεται Γ κ.ο.κ.

Οι συναρτήσεις cipher_encode() και cipher_decode().

Θα εργαστούμε σε έναν κατάλογο που ονομάζεται “βιβλιοθήκη” και αργότερα θα δημιουργήσουμε έναν υποκατάλογο που ονομάζεται “test”.

Έχουμε δύο αρχεία σε αυτόν τον κατάλογο. Σε ένα αρχείο κειμένου που ονομάζεται cipher_encode.c έχουμε τη συνάρτηση cipher_encode():

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

} // end of cipher_encode

Η αντίστοιχη συνάρτηση cipher_decode() βρίσκεται σε ένα αρχείο κειμένου που ονομάζεται cipher_decode.c:

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

} // end of cipher_decode

Τα αρχεία που περιέχουν οδηγίες προγραμματισμού ονομάζονται αρχεία πηγαίου κώδικα. Θα δημιουργήσουμε ένα αρχείο βιβλιοθήκης που ονομάζεται libcipher.a. Θα περιέχει τις μεταγλωττισμένες εκδόσεις αυτών των δύο αρχείων πηγαίου κώδικα. Θα δημιουργήσουμε επίσης ένα σύντομο αρχείο κειμένου που ονομάζεται libcipher.h. Αυτό είναι ένα αρχείο κεφαλίδας που περιέχει τους ορισμούς των δύο συναρτήσεων στη νέα μας βιβλιοθήκη.

Οποιοσδήποτε διαθέτει τη βιβλιοθήκη και το αρχείο κεφαλίδας θα μπορεί να χρησιμοποιήσει τις δύο λειτουργίες στα δικά του προγράμματα. Δεν χρειάζεται να εφεύρουν ξανά τον τροχό και να ξαναγράψουν τις λειτουργίες. κάνουν απλώς χρήση των αντιγράφων της βιβλιοθήκης μας.

Μεταγλώττιση των αρχείων cipher_encode.c και cipher_decode.c

Για τη μεταγλώττιση των αρχείων πηγαίου κώδικα, θα χρησιμοποιήσουμε gcc, το τυπικός μεταγλωττιστής GNU. Η επιλογή -c (μεταγλώττιση, χωρίς σύνδεση) λέει στο gcc να μεταγλωττίσει τα αρχεία και μετά να σταματήσει. Παράγει ένα ενδιάμεσο αρχείο από κάθε αρχείο πηγαίου κώδικα που ονομάζεται αρχείο αντικειμένου. Ο σύνδεσμος gcc συνήθως παίρνει όλα τα αρχεία αντικειμένων και τα συνδέει μεταξύ τους για να δημιουργήσει ένα εκτελέσιμο πρόγραμμα. Παρακάμπτουμε αυτό το βήμα χρησιμοποιώντας την επιλογή -c. Χρειαζόμαστε απλώς τα αρχεία αντικειμένων.

  Πώς να ρυθμίσετε ένα σημείο πρόσβασης Wi-Fi σε Linux

Ας ελέγξουμε ότι έχουμε τα αρχεία που πιστεύουμε ότι έχουμε.

ls -l

Τα δύο αρχεία πηγαίου κώδικα υπάρχουν σε αυτόν τον κατάλογο. Ας χρησιμοποιήσουμε το gcc για να τα μεταγλωττίσουμε σε αρχεία αντικειμένων.

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

Δεν πρέπει να υπάρχει έξοδος από gcc εάν όλα πάνε καλά.

Αυτό δημιουργεί δύο αρχεία αντικειμένων με το ίδιο όνομα με τα αρχεία πηγαίου κώδικα, αλλά με επεκτάσεις “.o”. Αυτά είναι τα αρχεία που πρέπει να προσθέσουμε στο αρχείο της βιβλιοθήκης.

ls -l

Δημιουργία της Βιβλιοθήκης libcipher.a

Για να δημιουργήσουμε το αρχείο της βιβλιοθήκης — το οποίο είναι στην πραγματικότητα ένα αρχείο αρχειοθέτησης — θα χρησιμοποιήσουμε το ar.

Χρησιμοποιούμε την επιλογή -c (δημιουργία) για να δημιουργήσουμε το αρχείο βιβλιοθήκης, την επιλογή -r (προσθήκη με αντικατάσταση) για να προσθέσουμε τα αρχεία στο αρχείο βιβλιοθήκης και την επιλογή -s (ευρετήριο) για να δημιουργήσουμε ένα ευρετήριο των αρχείων μέσα το αρχείο της βιβλιοθήκης.

Θα καλέσουμε το αρχείο της βιβλιοθήκης libcipher.a. Παρέχουμε αυτό το όνομα στη γραμμή εντολών, μαζί με τα ονόματα των αρχείων αντικειμένων που πρόκειται να προσθέσουμε στη βιβλιοθήκη.

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

Εάν απαριθμήσουμε τα αρχεία στον κατάλογο, θα δούμε ότι έχουμε τώρα ένα αρχείο libcipher.a.

ls -l

Εάν χρησιμοποιήσουμε την επιλογή -t (πίνακας) με το ar, μπορούμε να δούμε τις ενότητες μέσα στο αρχείο της βιβλιοθήκης.

ar -t libcipher.a

Δημιουργία του αρχείου κεφαλίδας libcipher.h

Το αρχείο libcipher.h θα συμπεριληφθεί σε οποιοδήποτε πρόγραμμα που χρησιμοποιεί τη βιβλιοθήκη libcipher.a. Το αρχείο libcipher.h πρέπει να περιέχει τον ορισμό των συναρτήσεων που βρίσκονται στη βιβλιοθήκη.

Για να δημιουργήσουμε το αρχείο κεφαλίδας, πρέπει να πληκτρολογήσουμε τους ορισμούς συναρτήσεων σε ένα πρόγραμμα επεξεργασίας κειμένου όπως το gedit. Ονομάστε το αρχείο “libcipher.h” και αποθηκεύστε το στον ίδιο κατάλογο με το αρχείο libcipher.a.

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

Χρήση της Βιβλιοθήκης libcipher

Ο μόνος σίγουρος τρόπος για να δοκιμάσουμε τη νέα μας βιβλιοθήκη είναι να γράψουμε ένα μικρό πρόγραμμα για να τη χρησιμοποιήσουμε. Αρχικά, θα φτιάξουμε έναν κατάλογο που ονομάζεται test.

mkdir test

Θα αντιγράψουμε τη βιβλιοθήκη και τα αρχεία κεφαλίδας στον νέο κατάλογο.

cp libcipher.* ./test

Θα αλλάξουμε στον νέο κατάλογο.

cd test

Ας ελέγξουμε ότι τα δύο αρχεία μας είναι εδώ.

ls -l

Πρέπει να δημιουργήσουμε ένα μικρό πρόγραμμα που μπορεί να χρησιμοποιήσει τη βιβλιοθήκη και να αποδείξει ότι λειτουργεί όπως αναμένεται. Πληκτρολογήστε τις ακόλουθες γραμμές κειμένου σε ένα πρόγραμμα επεξεργασίας. Αποθηκεύστε τα περιεχόμενα του προγράμματος επεξεργασίας σε ένα αρχείο με το όνομα “test.c” στον κατάλογο δοκιμής.

#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

Η ροή του προγράμματος είναι πολύ απλή:

  Πώς να εγκαταστήσετε το Museeks Music Player σε Linux

Περιλαμβάνει το αρχείο libcipher.h ώστε να μπορεί να δει τους ορισμούς της συνάρτησης της βιβλιοθήκης.
Δημιουργεί μια συμβολοσειρά που ονομάζεται “κείμενο” και αποθηκεύει τις λέξεις “How-To Geek αγαπά το Linux” σε αυτό.
Εκτυπώνει αυτή τη συμβολοσειρά στην οθόνη.
Καλεί τη συνάρτηση cipher_encode() για να κωδικοποιήσει τη συμβολοσειρά και εκτυπώνει την κωδικοποιημένη συμβολοσειρά στην οθόνη.
Καλεί την cipher_decode() για να αποκωδικοποιήσει τη συμβολοσειρά και εκτυπώνει την αποκωδικοποιημένη συμβολοσειρά στην οθόνη.

Για να δημιουργήσουμε το πρόγραμμα δοκιμής, πρέπει να μεταγλωττίσουμε το πρόγραμμα test.c και να συνδέσουμε στη βιβλιοθήκη. Η επιλογή -o (έξοδος) λέει στο gcc πώς να ονομάσει το εκτελέσιμο πρόγραμμα που δημιουργεί.

gcc test.c libcipher.a -o test

Εάν το gcc σας επιστρέψει σιωπηλά στη γραμμή εντολών, όλα είναι καλά. Τώρα ας δοκιμάσουμε το πρόγραμμά μας. Η στιγμή της αλήθειας:

./test

Και βλέπουμε το αναμενόμενο αποτέλεσμα. Το δοκιμαστικό πρόγραμμα εκτυπώνει το απλό κείμενο, εκτυπώνει το κρυπτογραφημένο κείμενο και στη συνέχεια εκτυπώνει το αποκρυπτογραφημένο κείμενο. Χρησιμοποιεί τις λειτουργίες της νέας μας βιβλιοθήκης. Η βιβλιοθήκη μας λειτουργεί.

Επιτυχία. Αλλά γιατί να σταματήσουμε εκεί;

Προσθήκη άλλης ενότητας στη βιβλιοθήκη

Ας προσθέσουμε μια άλλη συνάρτηση στη βιβλιοθήκη. Θα προσθέσουμε μια συνάρτηση που μπορεί να χρησιμοποιήσει ο προγραμματιστής για να εμφανίσει την έκδοση της βιβλιοθήκης που χρησιμοποιεί. Θα χρειαστεί να δημιουργήσουμε τη νέα συνάρτηση, να τη μεταγλωττίσουμε και να προσθέσουμε το νέο αρχείο αντικειμένου στο υπάρχον αρχείο βιβλιοθήκης.

Πληκτρολογήστε τις ακόλουθες γραμμές σε ένα πρόγραμμα επεξεργασίας. Αποθηκεύστε τα περιεχόμενα του προγράμματος επεξεργασίας σε ένα αρχείο με το όνομα cipher_version.c, στον κατάλογο της βιβλιοθήκης.

#include 

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

} // end of cipher_version

Πρέπει να προσθέσουμε τον ορισμό της νέας συνάρτησης στο αρχείο κεφαλίδας libcipher.h. Προσθέστε μια νέα γραμμή στο κάτω μέρος αυτού του αρχείου, έτσι ώστε να μοιάζει με αυτό:

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

Αποθηκεύστε το τροποποιημένο αρχείο libcipher.h.

Πρέπει να μεταγλωττίσουμε το αρχείο cipher_version.c ώστε να έχουμε ένα αρχείο αντικειμένου cipher_version.o.

gcc -c cipher_version.c

Αυτό δημιουργεί ένα αρχείο cipher_version.o. Μπορούμε να προσθέσουμε το νέο αρχείο αντικειμένου στη βιβλιοθήκη libcipher.a με την ακόλουθη εντολή. Η επιλογή -v (verbose) κάνει το συνήθως αθόρυβο ar να μας λέει τι έχει κάνει.

ar -rsv libcipher.a cipher_version.o

Το νέο αρχείο αντικειμένου προστίθεται στο αρχείο της βιβλιοθήκης. ar εκτυπώνει επιβεβαίωση. Το «α» σημαίνει «προστέθηκε».

Μπορούμε να χρησιμοποιήσουμε την επιλογή -t (πίνακας) για να δούμε ποιες λειτουργικές μονάδες βρίσκονται μέσα στο αρχείο της βιβλιοθήκης.

ar -t libcipher.a

Υπάρχουν τώρα τρεις ενότητες μέσα στο αρχείο της βιβλιοθήκης μας. Ας χρησιμοποιήσουμε τη νέα λειτουργία.

Χρησιμοποιώντας τη συνάρτηση cipher_version().

Ας αφαιρέσουμε την παλιά βιβλιοθήκη και το αρχείο κεφαλίδας από τον κατάλογο δοκιμής, ας αντιγράψουμε στα νέα αρχεία και, στη συνέχεια, μεταβούμε στον κατάλογο δοκιμής.

Θα διαγράψουμε τις παλιές εκδόσεις των αρχείων.

rm ./test/libcipher.*

Θα αντιγράψουμε τις νέες εκδόσεις στον κατάλογο δοκιμής.

cp libcipher.* ./test

Θα μεταβούμε στον κατάλογο δοκιμής.

cd test

Και τώρα μπορούμε να τροποποιήσουμε το πρόγραμμα test.c ώστε να χρησιμοποιεί τη νέα λειτουργία βιβλιοθήκης.

Πρέπει να προσθέσουμε μια νέα γραμμή στο πρόγραμμα test.c που καλεί τη συνάρτηση cipher_version(). Θα το τοποθετήσουμε πριν από τις πρώτες θέσεις(κείμενο). γραμμή.

#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

Αποθηκεύστε αυτό ως test.c. Μπορούμε τώρα να το μεταγλωττίσουμε και να ελέγξουμε ότι η νέα συνάρτηση είναι λειτουργική.

gcc test.c libcipher.a -o test

Ας εκτελέσουμε τη νέα έκδοση της δοκιμής:

  Πώς να παίξετε το Minecraft στο Linux με το GDLauncher

Η νέα λειτουργία λειτουργεί. Μπορούμε να δούμε την έκδοση της βιβλιοθήκης στην αρχή της εξόδου από τη δοκιμή.

Μπορεί όμως να υπάρχει πρόβλημα.

Αντικατάσταση ενότητας στη βιβλιοθήκη

Αυτή δεν είναι η πρώτη έκδοση της βιβλιοθήκης. είναι το δεύτερο. Ο αριθμός έκδοσης μας είναι λανθασμένος. Η πρώτη έκδοση δεν είχε καμία συνάρτηση cipher_version() σε αυτήν. Αυτό το κάνει. Επομένως, αυτή θα πρέπει να είναι η έκδοση “0.0.2”. Πρέπει να αντικαταστήσουμε τη συνάρτηση cipher_version() στη βιβλιοθήκη με μια διορθωμένη.

Ευτυχώς, το ar το κάνει πολύ εύκολο.

Αρχικά, ας επεξεργαστούμε το αρχείο cipher_version.c στον κατάλογο της βιβλιοθήκης. Αλλάξτε το κείμενο “Version 0.0.1 Alpha” σε “Version 0.0.2 Alpha”. Θα πρέπει να μοιάζει με αυτό:

#include 

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

} // end of cipher_version

Αποθηκεύστε αυτό το αρχείο. Πρέπει να το μεταγλωττίσουμε ξανά για να δημιουργήσουμε ένα νέο αρχείο αντικειμένου cipher_version.o.

gcc -c cipher_version.c

Τώρα θα αντικαταστήσουμε το υπάρχον αντικείμενο cipher_version.o στη βιβλιοθήκη με την πρόσφατα μεταγλωττισμένη μας έκδοση.

Έχουμε χρησιμοποιήσει την επιλογή -r (προσθήκη με αντικατάσταση) στο παρελθόν, για να προσθέσουμε νέες λειτουργικές μονάδες στη βιβλιοθήκη. Όταν το χρησιμοποιούμε με μια ενότητα που υπάρχει ήδη στη βιβλιοθήκη, το ar θα αντικαταστήσει την παλιά έκδοση με τη νέα. Η επιλογή -s (index) θα ενημερώσει το ευρετήριο της βιβλιοθήκης και η επιλογή -v (verbose) θα κάνει το ar να μας πει τι έκανε.

ar -rsv libcipher.a cipher_version.o

Αυτή τη φορά το ar αναφέρει ότι έχει αντικαταστήσει τη λειτουργική μονάδα cipher_version.o. Το “r” σημαίνει αντικαταστάθηκε.

Χρησιμοποιώντας τη συνάρτηση Ενημερωμένη cipher_version().

Θα πρέπει να χρησιμοποιήσουμε την τροποποιημένη βιβλιοθήκη μας και να ελέγξουμε ότι λειτουργεί.

Θα αντιγράψουμε τα αρχεία της βιβλιοθήκης στον κατάλογο δοκιμής.

cp libcipher.* ./test

Θα μεταβούμε στον κατάλογο δοκιμής.

cd ./test

Πρέπει να μεταγλωττίσουμε ξανά το δοκιμαστικό μας πρόγραμμα με τη νέα μας βιβλιοθήκη.

gcc test.c libcipher.a -o test

Και τώρα μπορούμε να δοκιμάσουμε το πρόγραμμά μας.

./test

Το αποτέλεσμα από το πρόγραμμα δοκιμής είναι αυτό που περιμέναμε. Ο σωστός αριθμός έκδοσης εμφανίζεται στη συμβολοσειρά έκδοσης και οι ρουτίνες κρυπτογράφησης και αποκρυπτογράφησης λειτουργούν.

Διαγραφή Ενοτήτων από Βιβλιοθήκη

Φαίνεται κρίμα μετά από όλα αυτά, αλλά ας διαγράψουμε το αρχείο cipher_version.o από το αρχείο της βιβλιοθήκης.

Για να το κάνουμε αυτό, θα χρησιμοποιήσουμε την επιλογή -d (διαγραφή). Θα χρησιμοποιήσουμε επίσης την επιλογή -v (verbose), έτσι ώστε το ar να μας λέει τι έχει κάνει. Θα συμπεριλάβουμε επίσης την επιλογή -s (index) για την ενημέρωση του ευρετηρίου στο αρχείο της βιβλιοθήκης.

ar -dsv libcipher.a cipher_version.o

Το ar αναφέρει ότι έχει αφαιρέσει τη λειτουργική μονάδα. Το “d” σημαίνει “διαγραμμένο”.

Αν ζητήσουμε από το ar να παραθέσει τις ενότητες μέσα στο αρχείο της βιβλιοθήκης, θα δούμε ότι είμαστε πίσω σε δύο λειτουργικές μονάδες.

ar -t libcipher.a

Εάν πρόκειται να διαγράψετε λειτουργικές μονάδες από τη βιβλιοθήκη σας, θυμηθείτε να αφαιρέσετε τον ορισμό τους από το αρχείο κεφαλίδας της βιβλιοθήκης.

Μοιραστείτε τον Κώδικά σας

Οι βιβλιοθήκες κάνουν τον κώδικα κοινόχρηστο με πρακτικό αλλά ιδιωτικό τρόπο. Οποιοσδήποτε δίνετε το αρχείο βιβλιοθήκης και το αρχείο κεφαλίδας μπορεί να χρησιμοποιήσει τη βιβλιοθήκη σας, αλλά ο πραγματικός πηγαίος κώδικας παραμένει ιδιωτικός.