Βιβλιοθήκη (υπολογιστές): Διαφορά μεταξύ των αναθεωρήσεων

Περιεχόμενο που διαγράφηκε Περιεχόμενο που προστέθηκε
JohnMad (συζήτηση | συνεισφορές)
JohnMad (συζήτηση | συνεισφορές)
μΧωρίς σύνοψη επεξεργασίας
Γραμμή 10:
Έτσι τελικά σε κάθε αρχείο πηγαίου κώδικα, είτε αυτό είναι αυτόνομο (με σημείο εισόδου εκτέλεσης, π.χ. συνάρτηση main()) είτε όχι (π.χ. αρχείο βιβλιοθήκης), αντιστοιχίζεται ένα αντικειμενικό αρχείο με κώδικα μηχανής (αρχεία *.o στο [[Unix]] και *.obj στα [[Windows]]). Ένα αντικειμενικό αρχείο περιέχει εκτελέσιμο κώδικα, δηλώσεις δεδομένων, έναν πίνακα συμβόλων, όπου ορίζονται τα αναγνωριστικά (ονόματα μεταβλητών, σταθερών ή συναρτήσεων) που εξάγονται από το αρχείο -δηλώνονται δηλαδή σε αυτό- ή εισάγονται στο αρχείο -χρησιμοποιούνται δηλαδή χωρίς να δηλώνονται-, και λοιπές πληροφορίες για το συνδέτη. Ο συνδέτης (linker) συνήθως καλείται αυτόματα αμέσως μετά τον assembler, δέχεται ως είσοδο ένα ή περισσότερα αντικειμενικά αρχεία, τα συνενώνει κατάλληλα και παράγει ένα μοναδικό, τελικό εκτελέσιμο αρχείο. Αυτή η συνένωση που επιτελεί όμως ο συνδέτης δεν αφορά μόνο πολλαπλά αντικειμενικά αρχεία (που προκύπτουν προφανώς από αντίστοιχα πολλαπλά πηγαία αρχεία) της ίδιας εφαρμογής, αλλά επεκτείνεται και στο να "επιλύει αναφορές εισαγόμενων συμβόλων": σαρώνει δηλαδή τον πίνακα συμβόλων κάθε αντικειμενικού αρχείου εισόδου, ανακαλύπτει ποια αναγνωριστικά παρέχονται από κάποια βιβλιοθήκη, αναζητά τον αντικειμενικό κώδικα της βιβλιοθήκης και εισάγει στο τελικό εκτελέσιμο της εφαρμογής τα κατάλληλα τμήματα του. Προκειμένου να επιτύχει τους στόχους του ο συνδέτης, ανάμεσα στ' άλλα, προβαίνει σε ένα πρώτο βήμα "επανατοποθέτησης". Αυτό σημαίνει ότι κάθε τμήμα κώδικα μηχανής που εισάγει και τακτοποιεί στο τελικό εκτελέσιμο αρχείο, είτε είναι από αντικειμενικό αρχείο που έδωσε ως είσοδο στο συνδέτη ο χρήστης είτε από αντικειμενικό αρχείο βιβλιοθήκης, το τροποποιεί κατάλληλα ώστε τελικά όλες οι διευθύνσεις μνήμης εντολών και δεδομένων στο τελικό εκτελέσιμο να είναι συνεπείς μεταξύ τους, να μην επικαλύπτονται και να είναι σχετικές ως προς μία κοινή διεύθυνση βάσης. Αυτό το βήμα είναι απαραίτητο γιατί ο μεταγλωττιστής νωρίτερα είχε δράσει θεωρώντας ξεχωριστό [[χώρος διευθύνσεων|χώρο διευθύνσεων]] για κάθε αντικειμενικό αρχείο με διαφορετικές διευθύνσεις βάσης. Συνήθως, για διευκόλυνση του προγραμματιστή, ο μεταγλωττιστής, ο assembler και ο συνδέτης καλούνται με μία μόνο εντολή και με τη σωστή σειρά -ενώ αν ο προγραμματιστής το επιθυμεί μπορεί περνώντας κάποια κατάλληλη παράμετρο να τροποποιήσει αυτήν τη συμπεριφορά (π.χ. στον μεταγλωττιστή της [[C (γλώσσα προγραμματισμού)|C]] [[gcc]] με την παράμετρο -c παραλείπεται η σύνδεση). Τα αντικειμενικά αρχεία υπακούν σε διάφορα προτυποποιημένα [[φορμά]] τα οποία καθορίζουν τη δομή τους και συνήθως είναι ίδια και για τα τελικά εκτελέσιμα αρχεία. Επιπλέον τα φορμά αυτά είναι ίδια τόσο για τα αυτόνομα εκτελέσιμα όσο και για τις βιβλιοθήκες. Σύνηθες φορμά στα MS Windows είναι το PE ενώ στο Unix το ELF.
 
Όταν επίκειται το τρέξιμο ενός εκτελέσιμου αρχείου εκτελείται πρώτα ένα κατάλληλο πρόγραμμα του ΛΣ: ο "φορτωτής" (loader). Ο τελευταίος αντιγράφει τα περιεχόμενα του εκτελέσιμου από το δίσκο στη μνήμη, δίνει κατάλληλες τιμές σε εσωτερικές δομές του πυρήνα (αφού ουσιαστικά εκκινείται μία νέα διεργασία) και ειδοποιεί σχετικά το υποσύστημα εικονικής μνήμης, ενώ αν το τελευταίο δεν είναι διαθέσιμο, κάτι σπάνιο σήμερα αφού όλα τα μοντέρνα ΛΣ χρησιμοποιούν [[εικονική μνήμη]], τροποποιεί επιπλέον τον κώδικα του προγράμματος με ένα δεύτερο βήμα επανατοποθέτησης που είναι απαραίτητο κάθε φορά που το πρόγραμμα εκτελείται: η διεύθυνση βάσης, ως προς την οποία γίνονται όλες οι αναφορές μνήμης εντός του κώδικα, παίρνει την τιμή της θέσης μνήμης στην οποία πραγματικά φορτώθηκε η πρώτη εντολή του προγράμματος. Αυτή η θέση μνήμης δεν είναι γνωστή πριν από τη φόρτωση (εκτός αν το ΛΣ δεν είναι [[πολυδιεργασία|πολυδιεργασιακό]], όπως το MS-DOS, κάτι σπάνιο σήμερα) οπότε αυτή η επανατοποθέτηση όλου του εκτελέσιμου πρέπει να γίνεται σε κάθε εκτέλεση. Αν όμως το ΛΣ παρέχει υποσύστημα εικονικής μνήμης τότε αυτό το βήμα δεν είναι απαραίτητο, αφού κάθε διεργασία έχει έναν πλήρη, ιδιωτικό χώρο εικονικών διευθύνσεων στη διάθεση της, με το μηχανισμό εικονικής μνήμης του [[πυρήνας (υπολογιστές)|πυρήνα]] να αναλαμβάνει την αντιστοίχιση με τη φυσική μνήμη (αχρηστεύοντας έτσι την επανατοποθέτηση [[χρόνος φόρτωσης|χρόνου φόρτωσης]]). Εν πάσει περιπτώσει, μόλις ο φορτωτής ολοκληρώσει την εργασία του τερματίζεται και η νέα διεργασία είναι έτοιμη προς εκτέλεση. Το πότε θα αρχίσει πραγματικά να εκτελείται είναι θέμα του [[χρονοπρογραμματιστής|χρονοπρογραμματιστή]] του πυρήνα.
 
== Κατηγορίες ==
Γραμμή 19:
==Ονομασία==
 
*[[GNU]]/[[Linux]], [[Solaris λειτουργικό σύστημα|Solaris]] και κλώνοι του [[BSD]]: <code>libfoo.a</code> και <code>libfoo.so</code> τα αρχεία τοποθετούνται σε καταλόγους όπως <code>/lib</code>, <code>/usr/lib</code> ή <code>/usr/local/lib</code>. Τα ονόματα των αρχείων ξεκινάνεξεκινούν πάντα με <code>lib</code>, και τελειώνουν με <code>.a</code> (αρχειοθήκες, στατικές βιβλιοθήκες) ή <code>.so</code> (διαμοιραζόμεναδυναμικές αρχεία αντικείμενα, δυναμικά συνδεδεμένεςκοινόχρηστες βιβλιοθήκες), με έναν προαιρετικό αριθμό έκδοσης. Για παράδειγμα η <code>libfoo.so.2</code> είναι η δεύτερη κύρια αναθεώρηση της δυναμικής βιβλιοθήκης <code>libfoo</code>. Παλιές εκδόσεις του [[Unix]] χρησιμοποιούσαν πρωτεύωνπρωτεύοντα και δευτερεύωνδευτερεύοντα αριθμό έκδοσης, πχπ.χ. (<code>libfoo.so.1.2</code>), ενώ οι σύγχρονες εκδόσεις μόνο τον πρωτεύοντα, π.χ. (<code>libfoo.so.1</code>). Δυναμικές βιβλιοθήκες τοποθετούνται στο <code>/usr/libexec</code> και παρόμοιους καταλόγους. Η κατάληξη <code>.la</code> που συναντάται σε αρχεία μερικές φορές είναιαφορά αρχειοθήκες [[libtool]], σε μη άμεσα χρησιμοποιήσιμη κατάσταση.
*[[Mac OS X]] και άνω: Το σύστημα κληρονομεί για τις στατικές βιβλιοθήκες τις συμβάσεις από το [[BSD]], και μπορεί να χρησιμοποιεί και βιβλιοθήκες τύπου <code>.so</code> (όμως με την κατάληξη <code>.dylib</code>).
*[[Microsoft Windows]]: αρχεία με κατάληξη <code>*.LIB</code> είναι στατικές βιβλιοθήκες και αρχεία με κατάληξη <code>*.DLL</code> είναι δυναμικές βιβλιοθήκες. Οι εκδόσεις είναι κωδικοποιημένες μέσα στα αρχεία.
 
Γραμμή 26:
* [[Επαναχρησιμοποίηση κώδικα]]
* [[Microsoft Dynamic Link Library]]
* [[Αρχείο αντικείμενο]]
* [[Plugin]]
 
== Εξωτερικοι σύνδεσμοι ==
*[http://www.dwheeler.com/program-library/ Βιβλιοθήκες στο Linux]
*[http://www.iecc.com/linker/linker10.html Δυναμική σύνδεσηΣύνδεση και φόρτωμαφόρτωση βιβλιοθηκών]
*[http://www.enderunix.org/simsek/articles/libraries.pdf ΠωςΠώς να δημιουργήσετε βιβλιοθήκες προγραμμάτων του Baris Simsek]
*[http://people.redhat.com/drepper/dsohowto.pdf ΠωςΠώς να δημιουργήσετε διαμοιραζόμενεςκοινόχρηστες βιβλιοθήκες]
 
[[Κατηγορία:προγραμματισμός]]