Οδηγός μεταγλώττισης πηγαίου κώδικα

...το μέρος για να ξεκινήσετε!

Συντονιστής: adem1

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

Σημαντικό είναι να χρησιμοποιήσετε την υπηρεσία http://imagebin.ubuntu-gr.org για τις εικόνες.

Οδηγός μεταγλώττισης πηγαίου κώδικα

Δημοσίευσηαπό Dimitris » 15 Μάιος 2008, 17:24

Οδηγός μεταγλώττισης πηγαίου κώδικα

1. Εισαγωγή

Oι υπολογιστές αυτό που κάνουν δεν είναι τίποτε άλλο από πρόσθεση, πολλαπλασιασμός και αποθήκευση και μεταφορά δεδομένων. Αυτό επιτυγχάνεται με ηλεκτρονικά κυκλώματα, τα οποία ανάλογα με την είσοδο που δέχονται επιτρέπουν ή όχι τη διέλευση του ρεύματος. Οι καταστάσεις αυτές μπορούν να αναπαρασταθούν στο δυαδικό συστημα ως 0 "δεν παιρνά ρεύμα" ή 1 "παιρνά ρεύμα". Οι οδηγίες ή εντολές που καταλαβαίνει δηλαδή ο υπολογιστής είναι γραμμένες σε γλώσσα μηχανής (machine code). Κώδικας μηχανής ή γλώσσα μηχανής είναι ένα σύστημα οδηγιών και δεδομένων που μπορούν να εκτελεσθούν απ'ευθείας από την κεντρική μοναδα επεξεργασίας του υπολογιστή. Η γλώσσα μηχανής είναι συνήθως δύσκολη στο χειρισμό από τον άνθρωπο, αν και στις πρώτες μέρες των υπολογιστών ήταν αρκετά απλά. Γι'αυτό το λόγο δημιουργήθηκε μια άλλη γλώσσα, η assembly, πιο προσιτή στον άνθρωπο. Η assembly είναι μια χαμηλού επιπέδου γλώσσα για τον προγραμματισμό υπολογιστών. Aν και χρησιμοποιείται ακόμη και σήμερα σε κάποιες εφαρμογές, όπως μικροεπεξεργαστές ή plc, είναι αρκετά δύσχρηστη. Γι'αυτό αναπτύχθηκαν υψηλότερου επιπέδου γλώσσες κατανοητές στον άνθρωπο. Οι γλώσσες προγραμματισμού μπορούν να χωριστούν σε δύο κατηγορίες, compiled και interpreted, ανάλογα με το αν μετατρέπουν τον πηγαίο κώδικα σε κώδικα μηχανής ή αν τον εκτελούν βήμα-βήμα. Μερικά παραδείγματα compiled γλωσσών προγραμματισμού είναι fortran, C, C++, ada, algol, cobol, delphi, pascal. Παραδείγματα interpreted γλωσσών προγραμματισμού, γνωστές και ως scripting γλώσσες, αποτελούν python, java, tcl, ruby. Στον παρών οδηγό θα ασχοληθούμε με τη μεταγλώττιση προγραμμάτων γραμμένα κυρίως σε C, και σε κάποιες περιπτώσεις fortran.

Για τη μεταγλώττιση προγραμμάτων είναι απαραίτητα, εκτός του μεταγλωττιστή, κάποια εργαλεία που διευκολύνουν και αυτοματοποιούν τη διαδικασία. Στο debian (και σε παράγωγά του όπως το ubuntu) η εγκατάσταση των απαραίτητων προγραμμάτων, αν και είναι πολύ πιθανόν να είναι ήδη εγκατεστημένα, γίνεται ως εξής:

Κώδικας: Επιλογή όλων
sudo apt-get install gcc
sudo apt-get install make


Για τους χρήστες FORTRAN το απαραίτητο πακέτο μπορεί να εγκατασταθεί:

Κώδικας: Επιλογή όλων
sudo apt-get install gfortran


Mια άλλη δυνατότητα περιλαμβάνει τη χρήση του μεταγλωττιστή g95, ο οποίος πρέπει να εγκατασταθεί χειροκίνητα. Τα υπόλοιπα εργαλεία, ld, ar, nm, που θα χρειασθούν είναι εγκατεστημένα σε κάθε σύστημα linux. Σε διαφορετική περίπτωση μπορούν να εγκατασταθούν επίσης απλά με τη χρήση της εντολής apt-get, όπως παραπάνω. Άλλες διανομές έχουν διαφορετικό τρόπο εγκατάστασης των πακέτων, όπως το rpm της Red Hat, oι οποίοι δεν πρόκειται να συζητηθούν εδώ.

2. Ο μεταγλωττιστής gcc

Ο μεταγλωττιστής gcc (GNU Compiler Collection, παλιότερα γνωστός ως GNU C Compiler) είναι ένα πρόγραμμα για τη μεταγλώττιση πηγαίου κώδικα σε γλώσσα μηχανής γραμμένου στις γλώσσες C, C++, ή Objective-C (αντικειμενική-C). Ο gcc μεταγλωττίζει ένα ή περισσότερα αρχεία πηγαίου κώδικα, για παράδειγμα πηγαία αρχεία C (file.c), πηγαία αρχεία assemply (file.s) ή προεπεξεργασμένα πηγαία αρχεία C (file.i). Aν η κατάληξη του αρχείου δεν αναγνωρισθεί τότε θεωρείται ως αντικειμενικό αρχείο (object) ή βιβλιοθήκη. Ο gcc καλεί συνήθως έναν προεπεξεργαστή (preprocessor), μεταγλωττίζει τον προεπεξεργασμένο κώδικα σε γλώσσα assembly, τον συναρμολεί και μετά το συνδέει με το linker. H διαδικασία μπορεί να διακοπεί σε ένα από τα προηγούμενα στάδια χρησιμοποιώντας τις επιλογές -c, -S, ή -E. Τα βήματα μπορεί επίσης να διαφέρουν ανάλογα με τη γλώσσα που χρησιμοποιείται. Ως προεπιλογή η έξοδος αποθηκεύεται στο αρχειό a.out. Σε μερικές περιπτώσεις ο gcc δημιουργεί ένα αντικειμενικό αρχειό έχοντας την κατάληξη .o και το αντίστοιχο βασικό όνομα.

Οι επιλογές του προεπεξεργαστή και του linker που δίνονται στη γραμμη εντολών του gcc, μεταβιβάζονται σε αυτά τα εργαλεία όταν εκτελούνται. Στον παρών οδηγό θα σχολιασθούν μόνο οι βασικές επιλογές του gcc, ενώ για μια πλήρη αναφορά μπορείτε να ανατρέξετε στις σελίδες εγχειριδίου (man pages).

Ας ξεκινήσουμε όμως από ένα απλό παράδειγμα. Το αρχείο hallo.c περιλαμβάνει τα εξής:

Κώδικας: Επιλογή όλων
/* hallo.c */
int main(){
   printf("Hallo world\n");
}

H εντολή

Κώδικας: Επιλογή όλων
gcc hallo.c


δέχεται ως αρχείο εισόδου το hallo.c, το μεταγλωτίζει και χωρίς να αποθηκεύει το ενδιάμεσο αντικείμενο, δημιουργεί το εκτελέσιμο με το προεπιλεγμένο όνομα a.out.

H περιφραστική εκδοχή της παραπάνω εντολής θα ήταν:

Κώδικας: Επιλογή όλων
gcc -c hallo.c
gcc -o a.out hallo.c


Η επιλογή -c δηλώνει μεταγλώττιση (compile), ενώ η -ο (οutput) δηλώνει το αρχείο εξόδου. Στην περιφραστική εκδοχή αποθηκεύεται και το ενδιάμεσο αντικείμενο hallo.o.

Αν υποθέσουμε ότι το αρχείο hallo.c περιέχει πολλούς βρόγχους (loops) τον ένα μέσα στον άλλο για τον υπολογισμό πινάκων. Τότε αυτό θα κάνει το πρόγραμμα αρκετά αργό. Σε τέτοιες περιπτώσεις είναι απαραίτητη η χρήση της επιλογής βελτιστοποίησης -Ο όπως στο παρακάτω παράδειγμα:

Κώδικας: Επιλογή όλων
gcc -c -O3 hallo.c


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

Οι επιλογές προεπεξεργαστή μπορεί να χρησιμοποιηθεί για προγράμματα που πρέπει να λειτουργούν σε διάφορες αρχιτεκτονικές με διαφορετικές τιμές σε μια μεταβλητή. Ας θεωρήσουμε ότι έχουμε σε ένα πρόγραμμα την επιλογή 32-bit ή 64-bit, και ότι σε καθε περίπτωση πρέπει να συμβεί κάτι διαφορετικό. Αυτό δε συμαίνει ότι πρέπει να έχουμε και δύο εκδόσεις του προγράμματος. Μπορεί εύκολα να λυθεί με την επιλογή -D όπως στο παρακάτω παράδειγμα:

Κώδικας: Επιλογή όλων
int main(){
   if (BIT==32){
      printf("%i\n", BIT);
      }
   else if (BIT==64){   
      printf("%i\n",BIT);
      }
   else {
      printf("%i\n",BIT);
      }
}


To οποίο μεταγλωττίζεται με μία από τις επιλογές:

Κώδικας: Επιλογή όλων
gcc -DBIT hallo.c

gcc -DBIT=32 hallo.c

gcc -DBIT=64 hallo.c


Aς υποθέσουμε τώρα το αρχειό mylib.h βρίσκεται στο φάκελο ~/include και ότι θέλουμε να το συμπεριλάβουμε στον κώδικά μας με την εντολή #include "mylib.h". Αυτό θα το κάναμε με την επιλογή -I κατά τη μεταγλώττιση, ή οποία δεχεται τόσο σχετική όσο και απόλυτη διαδρομή.

Κώδικας: Επιλογή όλων
gcc -I~/include hallo.c


Η χρήση μιας βιβλιοθήκης, πχ. libast.a, η οποία βρίσκεται στο φάκελο ~/lib γίνεται με τις παρακάτω επιλογές:

Κώδικας: Επιλογή όλων
gcc -L~/lib -last hallo.c


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

Γενικές επιλογές (κατά αλφαβητική σειρά)

-ansi
Eπιβάλει πλήρη συμβατότητα με το πρότυπο ANSI.
-c Δημιουργία ενός συνδέσιμου αρχείου αντικειμένου για κάθε αρχείο πηγαίου κώδικα, αλλά χωρίς κλήση του linker.
-E Προεπεξεργάζεται τα πηγαία αρχεία αλλά δεν τα μεταγλωττίζει. Τυπώνει τα αποτελέσματα στην τυπική έξοδο. Αυτή η επιλογή είναι χρήσιμη για τη μεταβίβαση μερικών επιλογών cpp (C PreProcessor) που διαφορετικά θα σταματούσαν το gcc όπως η -C, -M, ή -P.
-g Συμπεριλαμβάνει πληροφορίες αποσφαλμάτωσης (debugging) για χρήση με το gdb.
-glevel
Παρέχει πληροφορίες για την αποσφαλμάτωση. level πρέπει να είναι 1, 2, ή 3, με το 1 να παρέχει το ελάχιστο πλήθος πληροφοριών. Η προεπιλογή είναι το 2.
--help
Τυπώνει τις συνηθέστερες βασικές επιλόγες και τερματίζει.
-o file
Ορίζει το αρχείο εξόδου ως file. Προεπιλεγμένο είναι το a.out.
-O[level]
Βελτιστοποίηση. level πρέπει να είναι 1, 2, 3, ή 0 (προεπιλεγμένο είναι το 1). Το 0 απενεργοποιεί τη βελτιστοποίηση.
-p Παρέχει πληροφορίες προφιλ για χρήση με prof.
-pedantic
Προειδοποιεί αμετροεπώς.
-pg Παρέχει πληροφορίες προφιλ για χρήση με gprof.
-std=standard
Kαθορίζει το πρότυπο της C του αρχείου εισόδου. Αποδεκτές τιμές είναι:
iso9899:1990, c89 1990 ISO C πρότυπο.
iso9899:199409 1994 προσθήκη στο 1990 ISO C πρότυπο.
iso9899:1999, c99 1999 ISO C αναθεωρημένο πρότυπο.
iso9899:1999, c9x
gnu89 1990 C πρότυπο με GNU επεκτάσεις (η προεπιλεγμένη τιμή).
gnu99, gnu9x 1999 αναθεωρημένο ISO C πρότυπο με GNU επεκτάσεις.

-s Μεταγλωττίζει τα πηγαία αρχεία σε κώδικα assembly, αλλά δεν τα συναρμολογεί.
-v Tυπώνει πληροφορίες έκδοσης.
-V version
Προσπαθεί να εκτελέσει την gcc έκδοση version.
-w Aποσιωπεί τις προειδοποιήσεις.
-W Προειδοποιεί πιο αμετροεπώς από το κανονικό.
-Wall
Ενεργοποιεί όλες τις πιθανές προειδοποιήσεις.
-x language
Περιμένει το αρχείο εισόδου να είναι γραμμένο στη γλώσσα language, που μπορεί να είναι c, objective-c, c-header, c++, ada, f77, ratfor, assembler, java, cpp-output, c++-cpp-ouput, objc-cpp-output, f77-cpp-output, assembler-with-cpp, ή ada. Αν δεν ορισθεί τίποτε τότε μαντεύει τη γλώσσα από την κατάληξη του αρχείου.

Επιλογές προεπεξεργαστή

Ο gcc μεταβιβάζει τις παρακάτω επιλογές στον προεπεξεργαστή:

-Dname[=def]
Οριζει το name με την τιμή def σαν να είχε οριστεί ως #define. Αν δε δοθεί =def, τότε το name ορίζεται με την τιμή 1. -D έχει χαμηλότερη προτεραιότητα από -U.
-Idir
Περιλαμβάνει το dir στη λίστα με τους φακέλους για να ψαξει για αρχεία που πρέπει να συμπεριληφθούν.
-Uname
Aπομακρύνει τον ορισμό το συμβόλου name.

Eπιλογές linker

Ο gcc μεταβιβάζει τις παρακάτω επιλογές στο linker:

-llib
Συνδέει στη βιβλιοθήκη lib.
-Ldir
Ψάχνει στο dir εκτός από προεπιλεγμένους φακέλους για βιβλιοθήκες.
-u symbol
Αναγκάζει το linker να ψάξει στις βιβλιοθηκες για τον ορισμό του symbol, και να συνδέσει στις βιβλιοθήκες που βρήκε.

3. Εργαλεία

3.1 Η εντολή: ld

Το πρόγραμμα ld συνδέει (link) διαφορα αντικειμενα, στη δοσμένη σειρά, σε ένα εκτελέσιμο αντικείμενο (προεπιλογή a.out). Συνήθως εκτελείται αυτόματα από τις εντολές μεταγλώττισης όπως η gcc. Η βασική σύνταξη της εντολής είναι:

ld [options] objfiles

Eπιλογές

-Ldir
Ψάχνει στο dir εκτός από προεπιλεγμένους φακέλους για βιβλιοθήκες.
-o file
Ορίζει το αρχείο εξόδου ως file. Προεπιλεγμένο είναι το a.out.

Για παράδειγμα:

Κώδικας: Επιλογή όλων
ld -o myexe file1.o file2.o file3.o


δημιουργεί το εκτελέσιμο myexe από τα αντικείμενα file1.o file2.o file3.o.

3.2 H εντολή: ar

Χρησιμοποιείται συνήθως για τη δημιούργια βιβλιοθηκών. Η βασική σύνταξη της εντολής είναι:

ar key [args] [posname] [count] archive [files]

Key

d Διαγραφή των files από το archive.
m Μετακίνηση των files στο τέλος του archive.
p Τυπώνει τα files του archive.
q Προσθέτει τα files στο τέλος του archive.
r Αντικαθιστά τα files στο archive.
t Δείχνει τα περιεχομενα του archive ή τα αναφερθέντα files.
x Εξάγει τα περιεχόμενα από το archive ή μόνο τα αναφερθέντα files.

Συνήθη ορίσματα

a Χρηση με r ή m για τοποθέτηση των files στο archive μετά το posname.
b Όπως το a αλλά πρίν το posname.
c Δημιουργία archive "σιωπηλά"
i Όπως το b.
u Χρήση με το r για την αντικατάσταση μόνο των files που άλλαξαν από την τελευταία φορά που προστέθηκαν στο archive.

Για παράδειγμα η εντολή

ar cr libast.a *.o

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

3.3 H εντολή: nm

Με αυτή την εντολή μπορούν να τυπωθούν τα ονόματα των συναρτήσεων που χρησιμοποιούνται στο αντικείμενο. Τα ονόματα τυπώνονται όχι όπως φαίνονται στον πηγαίο κώδικα αλλά με underscores και άλλες λεπτομέρεις που εξαρτώνται από το μεταγλωττιστή. Η εντολή nm είναι πολύ χρήσιμη κατά την αποσφαλμάτωση προγραμμάτων που είναι γραμμένα σε ανάμικτες γλώσσες προγραμματισμού. Η βασική σύνταξη της εντολής είναι:

nm [options] objfiles

Για παράδειγμα το αρχειό hallo.o του πρώτου παραδειγματος στο λειτουργικό mac os x (powerpc) θα δώσει:

00000000 T _main
U _printf
U dyld_stub_binding_helper

4. make

Το make είναι ένα εργαλείο για την αυτόματη δημιουργία προγραμμάτων. Το προεπιλεγμένο αρχείο εισόδου είναι το Makefile, οπότε με την εκτέλεση της εντολής make θα ψάξει το πρόγραμμα για το αρχείο Makefile και αν δε το βρει θα βγάλει μήνυμα λάθους. Ένα απλό Makefile περιλαμβάνει τα εξής:

Κώδικας: Επιλογή όλων
# Αυτό είναι σχόλιο
COM=myexe
OBJ=file1.o file2.o file3.o
LDR=gcc

$(COM): $(OBJ)
   $(LDR) -o $(COM) $(OBJ)
# Τα κενά στην αρχή της παραπάνω γραμμής είναι σημαντικό να είναι tab.

clean:
   rm $(OBJ)
# Ομοίως το κενό πρέπει να είναι tab.


Στα Makefiles υπάρχει η "παραξενιά" να χρησιμοποιείται το tab. Πρέπει απλώς κανείς να το συνηθισει. Αλλά ας πάρουμε το αρχείο από την αρχή. COM=myexe δινει στη μεταβλητή COM την τιμή myexe, η οποία θα είναι το όνομα του εκτελέσιμου. OBJ=file1.o file2.o file3.o λέει στο make ότι τα αντικείμενα που χρειάζονται είναι τα file1.o file2.o file3.o. LDR=gcc ορίζει το πρόγραμμα που θα συνδέσει τα αντικείμενα, θα μπορούσε να ήταν και το ld.

H επόμενη γραμμή λέει ότι το εκτελέσιμο $(COM) εξαρτάται από τα αντικείμενα $(OBJ). Για να δημιουργηθεί δηλαδή το αρχείο myexe πρέπει πρώτα να δημιουργηθούν τα εξαρτόμενα αντικείμενα. Ας υποθέσουμε τώρα ότι τα file1.c και file2.c είναι αρχεία C, ενώ το file3.f είναι αρχείο fortran. Aυτό δε φαίνεται πουθενά στο Makefile, παρόλ' αυτά το make θα καλέσει τους κατάλληλους μεταγλωττιστές, κι αν δεν υπάρχουν θα βγάλει μήνυμα λάθους. Aν πληκτρολογήσουμε make, θα προσπαθήσει να εκτελέσει τις εντολές:

Κώδικας: Επιλογή όλων
gcc -c file1.c
gcc -c file2.c
g77 -c file3.f


Έπειτα θα τα συνδέσει με την εντολή

Κώδικας: Επιλογή όλων
gcc -o myexe file1.o file2.o file3.o


Tελος η εντολή rm $(OBJ) δε θα εκτελεσθεί. Αυτό συμβαίνει γιατί υπάρχουν στο συγκεκριμενο αρχείο 2 στόχοι (targets), ο $(COM) και ο clean. Aν κατα την εκτέλεση της εντολής δε εχουμε δώσει κάποιο στόχο τότε ο προεπιλεγμένος είναι ο ανώτερος, δηλαδή σε αυτή την περίπτωση ο $(COM). Αν πληκτρολογήσουμε

Κώδικας: Επιλογή όλων
make clean


τότε θα πάει στη γραμμή

clean:

όπου δε θα δει καμία εξάρτηση και μετά θα εκτελέσει την εντολή rm $(OBJ).

Όλες οι παραπάνω εντολές και επιλόγες των εντολών που παρουσιασθηκαν παραπάνω, μπορούν με μεγάλη ευκολία να χρησιμοποιηθούν σε ένα Makefile.

5. Επίλογος

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

6. Βιβλιογραφία

Herold, Helmut (2003), make - Das Profitool zur automatischen Generierung von Programmen, Addison-Wesley.

Robbins, Arnold (2005), UNIX in a nutshell, O' Reilly.

Creative Commons License
Η εργασία υπάγεται στην άδεια Creative Commons Αναφορά-Παρόμοια διανομή 3.0 Ελλάδα
Τελευταία επεξεργασία από Dimitris και 16 Μαρ 2010, 01:18, έχει επεξεργασθεί 4 φορά/ες συνολικά
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: Οδηγός μεταγλώττισης πηγαίου κώδικα

Δημοσίευσηαπό simosx » 15 Μάιος 2008, 18:32

Πολύ ωραία.
Είναι δικό σου άρθρο ή είναι από μετάφραση;

Για την εγκατάσταση των βασικών πακέτων μεταγλώττισης σε Ubuntu, εκτελείς

sudo apt-get install build-essential

το build-essential εμπεριέχει μεταγλωττιστές και ό,τι άλλο χρειάζεται.
προσωπικό ιστολόγιο ϗ πλανήτης Ubuntu-gr
Συμβάλετε και εσείς στο ελληνικό βιβλίο Ubuntu!
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Πολύ καλό ┃ Αγγλικών: Πολύ καλό
2 Ubuntu 13.10 saucy 3.11.0-031100rc1-generic 64bit (el_GR.UTF-8, Unity ubuntu)
3 AMD E-450 APU with Radeon HD Graphics ‖ RAM 3555 MiB ‖ Sony Corporation VAIO
4 AMD nee ATI Wrestler [Radeon HD 6320] [1002:9806] {fglrx_pci}
5 eth0: Atheros Inc. AR8151 v2.0 Gigabit Ethernet [1969:1083] (rev c0) ⋮ wlan0: Atheros Inc. AR9285 [168c:002b] (rev 01)
Φτιάξτε και εσείς τη δική σας υπογραφή (παραπάνω κείμενο) αυτόματα με κλικ εδώ!
simosx
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10334
Εγγραφή: 11 Μάιος 2008, 18:52
Launchpad: simosx
IRC: simosx
Εκτύπωση

Re: Οδηγός μεταγλώττισης πηγαίου κώδικα

Δημοσίευσηαπό linuxman » 30 Ιουν 2008, 19:24

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

Κώδικας: Επιλογή όλων
sudo apt-get install cpp-doc lib64stdc++6 manpages-dev autoconf automake1.9 libtool gcc-doc libc6-dev-amd64 lib64gcc1 glibc-doc binutils-doc dh-make debian-keyring build-essential dialog gcc-3.4 gcc g++ bison flex gcc-multilib libltdl3-dev libmail-sendmail-perl libcompress-zlib-perl autoconf2.13 autobook autoconf-archive gnu-standards kernel-package module-assistant
Οδηγίες προς Νεοεισερχόμενους
1 Γνώσεις Linux: Πολύ καλό ┃ Προγραμματισμού: Ικανοποιητικό ┃ Αγγλικών: Ικανοποιητικό
2 Linux Mint 17.1 Rebecca 3.13.0-37-generic 64bit (el_GR.UTF-8, X-Cinnamon cinnamon)
3 Intel Core i5-2310M CPU @ 2.10GHz ‖ RAM 3866 MiB ‖ Dell Inc. 0D7C51 - Dell Inc. Dell System Vostro 3750
4 Intel 2nd Generation Core Processor Family Integrated Graphics [8086:0116] {i915}
5 wlan0: Intel Centrino Wireless-N 1030 [Rainbow Peak] [8086:008a] (rev 34) ⋮ eth0: Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 06)
http://www.greeklug.gr
Άβαταρ μέλους
linuxman
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 10378
Εγγραφή: 10 Μάιος 2008, 20:41
Τοποθεσία: Thessaloniki / Macedonia / Greece
Εκτύπωση

Re: Οδηγός μεταγλώττισης πηγαίου κώδικα

Δημοσίευσηαπό ftso » 30 Ιουν 2008, 20:30

Και για να μην ξεχνιόμαστε:
Κώδικας: Επιλογή όλων
sudo apt-get install checkinstall


man checkinstall έγραψε:DESCRIPTION
checkinstall is a program that monitors an installation procedure (such
as make install, install.sh ), and creates a standard package for your
distribution (currently deb, rpm and tgz packages are supported) that
you can install through your distribution’s package management system
(dpkg, rpm or installpkg).

Note that for most useful actions, checkinstall must be run as root.
Άβαταρ μέλους
ftso
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 6409
Εγγραφή: 12 Μάιος 2008, 13:40
Τοποθεσία: Αθήνα
IRC: ftso
Εκτύπωση

Re: Οδηγός μεταγλώττισης πηγαίου κώδικα

Δημοσίευσηαπό Dimitris » 26 Αύγ 2008, 18:57

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

Αφού ολοκληρωθεί η διαδικασία
Κώδικας: Επιλογή όλων
./configure
make

επιτυχώς έρχεται η σειρά να κάνουμε make install. Είναι πολύ πιθανό να μας ζητήσει δικαιώματα root και να εγκαταστήσει το εκτελέσιμό μας στο /usr/local/bin ή οπουδήποτε αλλού όπου ένας απλός χρήστης δεν έχει δικαιώματα. Δε θέλουμε όμως να μπλέξουμε με τα αρχεία συστήματος. Μία λύση είναι να αλλάξουμε το φάκελο εγκατάστασης με
Κώδικας: Επιλογή όλων
make install --prefix ~/bin

Aυτό φυσικά προϋποθέτει να υπάρχει ο φάκελος bin στο αρχικό μας φάκελο home/dimitris (όπου dimitris το δικό σας ονομα χρήστη).
Εναλλακτικά αντιγράφουμε το εκτελέσιμο που μόλις δημιουργήθηκε στο ~/bin.

Για να μπορεί να αναγνωρίζεται από τη γραμμή εντολών θα πρέπει να προσθέσουμε αυτό το φάκελο στο path. path είναι μια μεταβλητή περιβάλλοντος η οποία περιέχει φακέλους στους οποίους βρίσκονται εκτελέσιμα. Αυτή συνήθως ορίζεται στο αρχείο .bashrc το οποιο βρίσκεται στον αρχικό μας κατάλογο (/home/dimitris). Η σύνταξη με ένα παράδειγμα είναι η εξής:
Κώδικας: Επιλογή όλων
PATH=$PATH:/usr/bin/:/usr/local/:/home/dimitris/bin

H εντολή αυτή βάζει στη μεταβλητή path ό,τι υπήρχε προηγουμένως ($PATH), έπειτα το φάκελο /usr/bin/, έπειτα το /usr/local/ και στο τέλος το φάκελο /home/dimitris/bin
Να τονίσω ότι η $PATH είναι απαραίτητη γιατί διαφορετικά οι προεπιλεγμένοι φάκελοι του συστήματος να μη λειτουργούν.
Τελευταία επεξεργασία από Dimitris και 26 Αύγ 2008, 19:17, έχει επεξεργασθεί 1 φορά/ες συνολικά
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: Οδηγός μεταγλώττισης πηγαίου κώδικα

Δημοσίευσηαπό ftso » 26 Αύγ 2008, 19:14

Dimitris έγραψε:...

Για να μπορεί να αναγνωρίζεται από τη γραμμή εντολών θα πρέπει να προσθέσουμε αυτό το φάκελο στο path. path είναι μια μεταβλητή περιβάλλοντος η οποία περιέχει φακέλους στους οποίους βρίσκονται εκτελέσιμα. Αυτή συνήθως ορίζεται στο αρχείο .bashrc το οποιο βρίσκεται στον αρχικό μας κατάλογο (/home/dimitris). Η σύνταξη με ένα παράδειγμα είναι η εξής:
Κώδικας: Επιλογή όλων
export PATH=$PATH:/usr/bin/:/usr/local/:/home/dimitris/bin

H εντολή αυτή βάζει στη μεταβλητή path ό,τι υπήρχε προηγουμένως ($PATH), έπειτα το φάκελο /usr/bin/, έπειτα το /usr/local/ και στο τέλος το φάκελο /home/dimitris/bin


Προσοχή!!!
Οι κατάλογοι που προσθέτουμε στο PATH και έχουν δικαίωμα εγγραφής και άλλοι εκτός του root να μπαίνουν ΠΑΝΤΑ στο τέλος.

Και εξηγώ με ένα παράδειγμα:
Αν εκτελέσω εγώ την εντολή sudo τότε το shell θα αρχίσει να ψάχνει στους καταλόγους του PATH για την εντολή αυτή και την οποία θα την βρεί τελικά στον κατάλογο /usr/bin/ o οποίος είναι απο τους πρώτους στο PATH.
Αν όμως πριν του /usr/bin/ , υπήρχε παράδειγμα ο /home/dimitris/bin , τότε πολύ εύκολα θα μπορούσε κάποιος να μας βάλει ένα shellscript μέσα το όνομα sudo το οποίο θα μπορούσε να μας υποκλέψει τον κωδικό χωρίς να το πάρουμε καν πρέφα (Trojan horse).

Αν προσέξουμε αυτό το πράγμα, δεν υπάρχει κανένας απολύτως κίνδυνος.

Αυτά!
@Dimitris πολύ καλές οι οδηγίες σου.
Έμαθα αρκετά πράγματα. :)
Άβαταρ μέλους
ftso
Επίτιμο μέλος
Επίτιμο μέλος
 
Δημοσιεύσεις: 6409
Εγγραφή: 12 Μάιος 2008, 13:40
Τοποθεσία: Αθήνα
IRC: ftso
Εκτύπωση

Re: Οδηγός μεταγλώττισης πηγαίου κώδικα

Δημοσίευσηαπό Dimitris » 26 Αύγ 2008, 19:27

Πολλή σημαντική παρατήρηση, το θεώρησα αυτονόητο το να βάλουμε το φάκελό μας στο τέλος του path. Eυχαριστώ ftso.

Για να θωρακιστούμε ακόμη πιο πολύ καλό είναι ο φάκελος του παραδείγματος /home/dimitris/bin να έχει μόνο read δικαιώματα από την ομάδα και τους άλλους. Και μιας και μιλήσαμε για δικαιώματα μου δίνει την ιδέα να εξηγήσω πως ακριβώς λειτουργούν τα δικαιώματα στο linux. Δε νομίζω να υπάρχει κάπου λεπτομερής περιγραφή.
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: Οδηγός μεταγλώττισης πηγαίου κώδικα

Δημοσίευσηαπό Dimitris » 06 Σεπ 2008, 01:47

Oι προγραμματιστές του ubuntu φαίνεται ότι δεν το βλέπουν αυτό σαν κίνδυνο μιας και το default ~.profile
Κώδικας: Επιλογή όλων
# ~/.profile: executed by the command interpreter for login shells.
# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login
# exists.
# see /usr/share/doc/bash/examples/startup-files for examples.
# the files are located in the bash-doc package.

# the default umask is set in /etc/profile
#umask 022

# if running bash
if [ -n "$BASH_VERSION" ]; then
    # include .bashrc if it exists
    if [ -f ~/.bashrc ]; then
        . ~/.bashrc
    fi
fi

# set PATH so it includes user's private bin if it exists
if [ -d ~/bin ] ; then
    PATH=~/bin:"${PATH}"
fi

βάζει το ~/bin πριν το default path. Χμμμ, παράξενο. Μόλις το διόρθωσα σχολιάζοντας τις 3 τελευταίες γραμμές, δηλαδή:
Κώδικας: Επιλογή όλων
# set PATH so it includes user's private bin if it exists
#if [ -d ~/bin ] ; then
#    PATH=~/bin:"${PATH}"
#fi
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Re: Οδηγός μεταγλώττισης πηγαίου κώδικα

Δημοσίευσηαπό demi » 12 Φεβ 2009, 01:05

μπορεί κάποιος να μου απαντίσει που μπορεί να δει την εκτέλεση ενός κώδικα μετά την μεταγλώτιση.
π.χ στο Anjuta.
demi
babeTUX
babeTUX
 
Δημοσιεύσεις: 19
Εγγραφή: 07 Φεβ 2009, 22:04
Εκτύπωση

Re: Οδηγός μεταγλώττισης πηγαίου κώδικα

Δημοσίευσηαπό Dimitris » 12 Φεβ 2009, 11:49

Στο Anjuta δεν έχω ιδέα, από γραμμή εντολών αν θέλεις. Το πρόγραμμά σου έχει gui; Αν ναι τότε ανοιγεις από το nautilus το φάκελο που έγινε η μεταγλώττιση και κάνεις διπλο κλικ στο εκτελέσιμο. Αν είναι πρόγραμμα για τη γραμμή εντολών ανοιγεις το τερματικό και
Κώδικας: Επιλογή όλων
cd /path/to/folder/
./executable

όπου /path/to/folder/ η διαδρομή μέχρι το φάκελο που έγινε η μεταγλώττιση και executable το εκτελέσιμό σου. Aπό το τερματικό μπορείς να τρέξεις και πρόγραμμα με gui φυσικά.

Αν εννοείς αυτό και αν κατάλαβα καλά την ερώτησή σου.
Άβαταρ μέλους
Dimitris
saintTUX
saintTUX
 
Δημοσιεύσεις: 1357
Εγγραφή: 13 Μάιος 2008, 13:57
Τοποθεσία: Θεσσαλονίκη
Εκτύπωση

Επόμενο

Επιστροφή στο Οδηγοί - How to - Tutorials

cron