1. Εισαγωγή

Αυτό το HOWTO για προγραμματιστές πραγματεύεται θέματα σχετικά με το πώς μπορεί κανείς να δημιουργήσει και να χρησιμοποιήσει βιβλιοθήκες προγραμμάτων στο Linux, χρησιμοποιώντας το σύνολο εργαλείων GNU. Μια "βιβλιοθήκη προγράμματος'' είναι απλά ένα αρχείο που περιέχει το μεταγλωττισμένο (compiled) κώδικα (και τα δεδομένα), που πρόκειται να ενσωματωθούν αργότερα σε ένα πρόγραμμα. Οι βιβλιοθήκες προγραμμάτων επιτρέπουν στα προγράμματα να είναι πιο παραμετροποιήσιμα, γρηγορότερα στη διαδικασία επαναμεταγλώτισσης (recompilation), και ευκολότερα στη συντήρηση και την ενημέρωση (update). Οι βιβλιοθήκες προγράμματος μπορούν να διαιρεθούν σε τρεις τύπους: στατικές βιβλιοθήκες (static), διαμοιραζόμενες βιβλιοθήκες (shared), και δυναμικά φορτωμένες βιβλιοθήκες (dynamically loaded - DL).

Αυτό το άρθρο αναφέρεται αρχικά στις στατικές βιβλιοθήκες, οι οποίες εγκαθίστανται σε ένα εκτελέσιμο (executable) προτού εκτελεστεί το αντίστοιχο πρόγραμμα. Συζητά έπειτα τις διαμοιραζόμενες βιβλιοθήκες, οι οποίες φορτώνονται στο ξεκίνημα του προγράμματος και μοιράζονται μεταξύ των προγραμμάτων. Τέλος, συζητά τις δυναμικές βιβλιοθήκες, οι οποίες μπορούν να φορτωθούν και να χρησιμοποιηθούν οποιαδήποτε στιγμή ενώ ένα πρόγραμμα τρέχει. Οι δυναμικές βιβλιοθήκες δεν είναι πραγματικά ένα διαφορετικό είδος μορφοποίησης (format) βιβλιοθηκών (τόσο οι στατικές όσο και διαμοιραζόμενες βιβλιοθήκες μπορούν να χρησιμοποιηθούν ως δυναμικές) αντ' αυτού, η διαφορά έγκειται στον τρόπο με τον οποίο οι δυναμικές βιβλιοθήκες χρησιμοποιούνται από τους προγραμματιστές. Αυτό το HOWTO κλείνει με ένα κεφάλαιο με περισσότερα παραδείγματα και ένα ακόμα με αναφορές σε άλλες πηγές πληροφοριών.

Οι περισσότεροι υπεύθυνοι σε ανάπτυξη προγραμμάτων (developers) που αναπτύσσουν βιβλιοθήκες, οφείλουν να δημιουργήσουν διαμοιραζόμενες βιβλιοθήκες, δεδομένου ότι αυτές επιτρέπουν στους χρήστες να ενημερώσουν (update) τις βιβλιοθήκες τους χωριστά από τις εφαρμογές που τις χρησιμοποιούν. Οι δυναμικές βιβλιοθήκες είναι χρήσιμες, αλλά απαιτούν λίγο περισσότερη δουλειά για να καταστεί δυνατόν να χρησιμοποιηθούν και πολλά προγράμματα δεν χρειάζονται την ευελιξία που προσφέρουν. Απ' την άλλη πάλι, οι στατικές, κάνουν την αναβάθμιση (upgrading) των βιβλιοθηκών πολύ πιο προβληματική, οπότε δύσκολα θα τις συνιστούσε κανείς για γενική χρήση. Ωστόσο, κάθε μία έχει τα πλεονεκτήματά της, και τα πλεονεκτήματα του κάθε τύπου περιγράφονται στην αντίστοιχη παράγραφο του άρθρου. Οι προγραμματιστές που χρησιμοποιούν C++ και δυναμικές βιβλιοθήκες, θα πρέπει επίσης να συμβουλευθούν το "C++ mini- howto".

Δεν έχει σημασία που μερικοί άνθρωποι χρησιμοποιούν τον όρο δυναμικά συνδεδεμένες βιβλιοθήκες (dynamically linked libraries - DLLs) για να αναφερθούν στις διαμοιραζόμενες (shared) βιβλιοθήκες,μερικοί άλλοι τον όρο DLL για να σημάνουν οποιαδήποτε βιβλιοθήκη που χρησιμοποιείται ως δυναμική βιβλιοθήκη (DL), και μερικοί ακόμα που χρησιμοποιούν τον όρο DLL για να αναφερθούν σε οποιαδήποτε από τις παραπάνω περιπτώσεις. Οποιοδήποτε σημασιολογικό ορισμό και να επιλέξετε, αυτό το HOWTO καλύπτει τις DLLs σε Linux.

Σε αυτό το HOWTO ασχολούμαστε μόνο τη σύγχρονη και καθιερωμένη μορφοποίηση εκτελέσιμων και βιβλιοθηκών σχεδόν σε κάθε σύστημα/διανομή GNU/Linux : τη μορφοποίηση ELF (Executable and Linking Format). Το σύνολο εργαλείων GCC του GNU (GNU GCC toolset) μπορεί στην πραγματικότητα να χειριστεί βιβλιοθήκες με μορφοποίηση και διαφορετική της ELF - ειδικότερα, οι περισσότερες διανομές Linux μπορούν ακόμα να υποστηρίξουν την ξεπερασμένη μορφή a.out ( η υποστήριξη συνεχίζεται και στον 2.6 πυρήνα ). Εντούτοις, τέτοιες μορφοποιήσεις δε θα καλυφθούν εδώ.

Εάν χτίζετε μια εφαρμογή που θα θέλατε να μπορεί να μεταφερθεί σε πολλά συστήματα, ίσως θα έπρεπε να σκεφτείτε να χρησιμοποιήσετε το GNU libtool για να χτίσετε και να εγκαταστήσετε βιβλιοθήκες, αντί να χρησιμοποιήσει τα εργαλεία του Linux αυτά καθ\ ευατά. Το GNU Libtool είναι ένα γενικό script (αρχείο εντολών) υποστήριξης βιβλιοθηκών, που κρύβει την πολυπλοκότητα χρήσης των διαμοιραζόμενων βιβλιοθηκών (π.χ., δημιουργώντας και εγκαθιστώντας τες) πίσω από μια και συμπαγής και φορητή, μεταξύ συστημάτων, διεπαφή. Στο Linux, το GNU Libtool χτίζεται πάνω από τα εργαλεία και τις συμβάσεις που περιγράφονται σε αυτό το HOWTO. Για μια φορητή διεπαφή (portable interface) στις δυναμικές βιβλιοθήκες, μπορείτε να χρησιμοποιήσετε τα διάφορα portability wrappers (περιτυλίγματα φορητότητας). Το GNU Libtool περιλαμβάνει ένα τέτοιο, αποκαλούμενο "libltdl". Εναλλακτικά, θα μπορούσατε να χρησιμοποιήσετε την glib βιβλιοθήκη (μην τη μπερδεύετε με την glibc) με τη φορητή υποστήριξή της για dynamic module loading (δυναμική φόρτωση τμημάτων). Μπορείτε να μάθετε περισσότερα σχετικά με τη glib στο http://developer.gnome.org/doc/API/glib/glib-dynamic-loading-of-modules.html. Και πάλι πάντως, στο Linux αυτή η λειτουργικότητα υλοποιείται χρησιμοποιώντας τα βασικά εργαλεία που περιγράφονται σε αυτό το HOWTO. Εάν πράγματι αναπτύσσετε ή διορθώνετε κώδικα σε Linux, πιθανώς οι πληροφορίες που υπάρχουν σε αυτό το HOWTO θα εξακολουθούν να σας είναι χρήσιμες.

Η Αγγλική (και "αυθεντική" έκδοση) αυτού του HOWTO βρίσκεται στο http://www.dwheeler.com/program-library, and it has been και έχει συμπεριληφθεί στο Πρόγραμμα Τεκμηρίωσης του Linux (http://www.tldp.org). Τα πνευματικά δικαιώματα (C) 2000 ανήκουν στον David A. Wheeler και διανέμεται μέσω της άδειας GPL (Gerneral Public License) - δείτε την αντίστοιχη παράγραφο στο τέλος του άρθρου για περισσότερες πληροφορίες.