Previous Next Table of Contents

5. Μεταφορά και μεταγλώττιση προγραμμάτων

Please see also the Linux GCC-FAQ, available in HTML format by FTP from www.mrc-apu.cam.ac.uk in /pub/linux/GCC-FAQ.html.

---------------------------------------------------------------------

5.1 Πώς μπορώ να μεταφέρω ένα πρόγραμμα στο linux απο άλλα λειτουργικά συστήματα;

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

Εάν έχετε προγράμματα απο το bsd πρέπει να δοκιμάσετε να χρησιμοποιήσετε στα κατάλληλα σημεία των γραμμών του compile τις παραμέτρους: -I/usr/include/bsd και -lbsd

---------------------------------------------------------------------

5.2 Τί είναι το ld.so και πού μπορώ να το βρώ;

Το ld.so είναι ο dynamic libary loader. Κάθε διαδικό αρχείο που χρησιμοποιεί shared libraries παλιότερα είχε περίπου 3Κ κώδικα στην αρχή του, που το βοηθούσε στην ανεύρεση και το φόρτωμα των shared libraries. Τώρα αυτός ο κώδικας έχει τοποθετηθεί σε μια ειδική shared library, /lib/ld.so, όπου και όλα τα διαδικά αρχεία μπορούν να τον βρούν. Έτσι τα binaries σπαταλούν λιγότερο χώρο στον δίσκο και μπορούν να αναβαθμιστούν ευκολότερα.

Μπορεί κανείς να το κατεβάσει απο το tsx-11.mit.edu απο το directory /pub/linux/packages/GCC και στα mirror site του. Τη στιγμή που γράφεται αυτό το faq η τελευταία version του ld.so είναι η ld.so.1.7.11.tar.gz. Ενώ το /lib/ld-linux.so.1 είναι το ίδιο πράγμα για τα ELF binaries και πηγαίνει με το ίδιο πακέτο με τον a.out loader.

---------------------------------------------------------------------

5.3 Έχει κανείς μεταφέρει / κάνει compile / γράψει κάποιο XXX πρόγραμμα για το linux;

Πρώτα απ'όλα, κοιτάξτε στο Linux Software Map (LSM) --- είναι στο directory docs στο sunsite.unc.edu, και σε άλλα ftp sites. Μια μηχανή αναζήτησης είναι διαθέσιμη στον web server http://www.boutell.com/lsm.

Ελένξτε τα ftp sites (δείτε το Q2.5 'Πού μπορώ να βρώ προγράμματα για το linux μέσω ftp ;') πρώτα --- ελένξτε τα find-ls ή index αρχεία για τα κατάλληλα strings. Ελένξτε και το Linux Projects Map (LPM), στο ftp.ix.de στο /pub/Linux/docs/Projects-Map.gz.

Εάν δεν βρείτε τίποτα, μπορείτε ή να κατεβάσετε τον κώδικα του προγράμματος και να τον κάνετε compile μόνοι σας -- δείτε το Q5.1 'Πώς μπορώ να μεταφέρω ένα πρόγραμμα στο Linux ;' -- ή, εάν είναι μεγάλο πακέτο που μπορεί να χρειάζεται αλλαγές στον κώδικα, στείλτε ένα μήνυμα στο newsgroup : comp.os.linux.development.apps.

Εάν κάνετε compile ένα μεγάλο πρόγραμμα παρακαλώ ανεβάστε το σε ένα ή και περισσότερα ftp sites και στείλτε ένα mail στο comp.os.linux.announce (στείλτε το μήνυμα στο linux-announce@news.ornl.gov).

Εάν ψάχνετε για ένα εφαρμογής-τύπου πρόγραμμα τότε πολλές πιθανότητες υπάρχουν να έχει γράψει κάποιος μια δωρεάν έκδοση. Δοκιμάστε να διαβάσετε το FAQ στο comp.sources.wanted για οδηγίες στο πώς θα βρείτε κώδικες προγραμμάτων.

Θα πρεπει επισης να ελένξετε το Projects-FAQ, που βρίσκεται στο directory /pub/Linux/docs/faqs/Projects-FAQ στο sunsite.unc.edu.

---------------------------------------------------------------------

5.4 Μπορώ να χρησιμοποιήσω σε έναν 386, κώδικα ή έναν compiler που έχει γίνει compile σε έναν 486;

Γενικά ναί, εκτός εάν είναι ο kernel.

Η επιλογή -m486 του GCC, η οποία χρησιμοποιείται για να δημιουργηθούν διαδικά αρχεία για 486 υπολογιστές οδηγεί στήν δημιουργία αρχείων λίγο μεγαλύτερων που εκτελούνται γρηγορότερα στα 486. Όμως δουλεύουν κανονικά και σε ένα 386, με μια μικρή πτώση της απόδοσης όπως είναι φυσικό.

Όμως από την έκδοση 1.3.35 ο kernel χρησιμοποιεί κώδικα του 486 ή και του pentium εάν είναι ρυθμισμένος για έναν 486 ή ένα pentium αντίστοιχα, έτσι γίνεται άχρηστος για ένα 386.

Το GCC μπορεί να ρυθμιστεί για έναν 386 ή 486. Η μόνη διαφορά είναι ότι εάν ρυθμιστεί για 386 η αρχική επιλογή θα είναι το -m386 ενώ εάν έχει ρυθμιστεί για 486 θα είναι το -m486. Σε κάθε περίπτωση αυτό μπορεί να ξεπεραστεί με την κατάλληλη παράμετρο σε κάθε compile ή εάν αλλαχθεί κατάλληλα το αρχείο : /usr/lib/gcc-lib/i*-linux/n.n.n/specs.

Υπάρχει μία alpha έκδοση του GCC η οποία γνωρίζει πώς θα επιταχύνει το binary για τον pentium, αλλά είναι λίγο ασταθής, ειδικά εάν δηλωθούν παράμετροι για υψηλή επιτάχυνση. Το pentium GCC μπορεί να βρεθεί στο tsx-11.mit.edu στο directory /pub/linux/ALPHA/pentium-gcc. Συστήνω την χρήση του κανονικού 486 GCC στη θέση του. Είναι προτιμότερο να χρησιμοποιείται το -m386 στα pentium γιατί προκύπτει κώδικας που είναι καλύτερος, ή το ελάχιστο λίγο μικρότερος.

---------------------------------------------------------------------

5.5 Τι κάνει το gcc -O6;

Αυτή τη στιγμή είναι το ίδιο με το -Ο2 (GCC 2.5) ή -Ο3 (GCC 2.6, 2.7) ή με κάθε αριθμό μεγαλύτερο από αυτούς κάνει το ίδιο πράγμα. Τα Makefiles των καινούριων kernel χρησιμοποιούν το -Ο2, εσείς πρέπει να κάνετε το ίδιο.

---------------------------------------------------------------------

5.6 Πού είναι τα linux/*.h και τα asm/*.h;

Αυτά τα αρχεία είναι στα directories /usr/include/linux και /usr/include/asm.

Τα directories αυτά πρέπει να είναι symbolic links στόν κώδικα του kernel στο /usr/src/linux και όχι αληθινά directories.

Έαν δέν έχετε τον κώδικα του kernel κατεβάστε τον --- δείτε την (Ερώτηση 7.6 "Πώς μπορώ να αναβαθμίσω / κάνω compile ξανά τον kernel μου ;").

Χρησιμοποιήστε την rm για να απομακρύνετε περιττά αρχεία, και ln για να δημιουργήσετε τα links :

rm -rf /usr/include/linux /usr/include/asm
ln -sf /usr/src/linux/include/linux /usr/include/linux
ln -sf /usr/src/linux/include/asm /usr/include/asm
Στις μέρες μας το /usr/src/linux/include/asm είναι ένα symbolic link σε ένα συγκεκριμένο asm-$ARCH (???) directory - εάν έχετε έναν πρόσφατα ξεσυμπιεσμένο κώδικα του kernel πρέπει να χρησιμοποιήσετε την εντολή make symlinks. Θα βρείτε επίσης οτι μπορεί να χρειαστεί να κάνετε ένα make config σε έναν τέτοιο kernel, για να δημιουργηθεί το <linux/autoconf.h>.

---------------------------------------------------------------------

5.7 Υπάρχουν λάθη όταν δοκιμάζω να κάνω compile τον kernel.

Σιγουρευτείτε ότι τα /usr/include/linux και /usr/include/asm δέν είναι κανονικά directories αλλά symbolic links στα /usr/src/linux/include/linux και /usr/src/linux/include/asm αντίστοιχα.

Εάν χρειάζεται, σβήστε τα χρησιμοποιώντας την rm και μετά την ln -s για να δημιουργήσετε τα links όπως στην Ερώτηση 5.6 'Που είναι τα αρχεία linux/*.h και τα asm/*.h;'.

Θυμηθείτε ότι όταν χρησιμοποιείτε ένα patch στον kernel πρέπει να χρησιμοποιήσετε την παράμετρο -p0 ή την -p1. Αλλιώς το patch μπορεί να τοποθετηθεί λάθος. Δείτε την σελίδα του man για την εντολή patch για περισσότερες λεπτομέρειες.

Εάν κάνετε patch για έναν kernel ποιό πρόσφατο απο τον 1.1.44 πρέπει να βρείτε ότι υπάρχουν νέα directories /usr/src/linux/include/asm-i386. Το directory asm εκεί πρέπει να σβηστεί. Η εντολή make symlinks θα δημιουργήσει αυτά σαν symbolic links στα asm-i36 και arch/i386/boot αντίστοιχα. Ο ποιό εύκολος τρόπος για να είστε σίγουροι ότι ή διαδικασία έχει γίνει σωστά είναι να μήν πάτε στον kernel 1.1.45 με patch απο τον 1.1.44, αλλά να κατεβάσετε τον linux-1.1.45.tar.gz.

Το μήνυμα ld: unrecognised option `-qmagic' σημαίνει ότι πρέπει να πάρετε έναν καινούριο linker, από το tsx-11.mit.edu στο /pub/linux/packages/GCC, στο αρχείο binutils-2.6.0.2.bin.tar.gz.

---------------------------------------------------------------------

5.8 Πώς μπορώ να δημιουργήσω μία shared library;

Για τα ELF executables :

   gcc -fPIC -c *.c
   gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0 *.o
Για τα a.out, πάρτε το πακέτο tools-n.nn.tar.gz από το tsx-11.mit.edu, στο /pub/linux/packages/GCC/src. Έρχεται μαζί με οδηγίες οι οποίες θα σας πουν τι να κάνετε. Προσέξτε ότι οι κοινές βιβλιοθήκες για a.out είναι μία μάλλον δύσκολη υπόθεση.

---------------------------------------------------------------------

5.9 Τα εκτελέσιμά μου είναι (πολύ) μεγάλα.

Με ένα μεταγλωττιστή για ELF (see Q8.2 `What's all this about ELF ?') η συχνότερη αιτία μεγάλων εκτελέσιμων είναι η έλλειψη ενός κατάλληλου συνδέσμου σε .so library για μία από τις βιβλιοθήκες που χρησιμοποιείτε. Πρέπει να υπάρχουν σύνδεσμοι όπως το libc.so για κάθε βιβλιοθήκη όπως η libc.so.5.2.18. Με έναν μεταγλωττιστή για a.out (see Q8.2 `What's all this about ELF ?') η συχνότερη αιτία μεγάλων εκετελέσιμων είναι ο ορισμός του μεταγλωττιστή -g. Αυτό παράγει (εκτός από μηνύματα λάθους στο αρχείο εξόδου) ένα πρόγραμμα στατικά συνδεδεμένο, δηλαδή ένα το οποίο συμπεριλαμβάνει ένα αντίγραφο της βιβλιοθήκες της C αντί να χρησιμοποιεί ένα δυναμικά συνδεδεμένο αντίγραφο. Άλλα πράγματα τα οποία αξίζει τον κόπο να ερευνήσετε είναι τα -O και -O2 τα οποία ενεργοποιούν την βελτιστοποίηση (ελέγξτε τις οδηγίες του GCC ) και το -s (ή την εντολή strip ) η οποία βγάζει όλες τις πληροφορίες συμβόλων από το εκτελέσιμο (κάνοντας τον έλεγχο λαθών - debugging - εντελώς αδύνατο). Μπορεί να θέλετε να χρησιμοποιήσετε το -N σε πολύ μικρά εκτελέσιμα (μικρότερα από 8K με το -N), αλλά δεν θα έπρεπε να το κάνετε αυτό εκτός εάν καταλαβαίνετε τα θέματα απόδοσης, και ποτέ με daemons.

---------------------------------------------------------------------

5.10 Υποστηρίζει το Linux νηματικές (threads) ή lightweight επεξεργασίες;

Όπως το πολυεπεξεργαστικό μοντέλο του Unix συμπεριλαμβάνει βαριές επεξεργασίες, το οποίο είναι φυσικά μέρος του στάνταρντ πυρήνα του Linux, υπάρχουν διάφορες υλοποιήσεις ελαφριών επεξεργασιών ή νηματικών, οι περισσότερες εκ των οποίων είναι γενικά πακέτα για Unix:

Παρακαλώ επικοινωνήστε με τους δημιουργούς των πακέτων για πληροφορίες.

Η έκδοση 1.3.35 του πυρήνα περιέχει κάποια υποστήριξη για νήματα του πυρήνα, αλλά ο κώδικας δεν έχει ελεγχθεί καλά.

Σ.τ.Μ.: Με τον όρο νήματα υποθέτω ότι ο συγγραφές εννοεί νηματική επεξεργασία. Η μετάφραση έγινε με αυτό σαν βάση.

---------------------------------------------------------------------

5.11 Που μπορώ να βρω το `lint' για Linux;

Περίπου ίδια λειτουργικότητα συμπεριλαμβάνεται στο GNU C μεταγλωττιστή (gcc) ο οποίος χρησιμοποιείται από τα συστήματα Linux. Χρησιμοποιείστε την επιλογή -Wall για να ενεργοποιήσετε τις περισσότερες από τις χρήσιμες έξτρα προειδοποιήσεις. Ελέγξτε τις οδηγίες χρήσης για το GCC για περισσότερες πληροφορίες. (πατήστε control-h ασκολουθούμενο από i στο Emacs και επιλέξτε την καταχώριση για το GCC).

Υπάρχει ένα ελεύθερα διαθέσιμο πρόγραμμα που λέγεται `lclint' που κάνει περίπου τα ίδια πράγματα όπως το παραδοσιακό lint. Η ανακοίνωση και ο πηγαίος κώδικας είναι διαθέσιμα στο larch.lcs.mit.edu in /pub/Larch/lclint στο World Wide Web κοιτάξτε στο http://larch-www.lcs.mit.edu:8001/larch/lclint.html.

---------------------------------------------------------------------

5.12 Που μπορώ να βρω το `kermit' για Linux;

Το αυστηρό copyright του Kermit έχει αμναγκάσει τους περισσότερους διανομείς να το αφαιρέσουνε από τις τυπικές Linux διανομές. Ο κώδικας και μερικά εκτελέσιμα είναι διαθέσιμα στο kermit.columbia.edu ως

kermit/archives/ckermit-6.0.192-7.i386.rpm         # RedHat 
kermit/archives/ckermit-6.0.192-7.sparc.rpm
kermit/archives/ckermit-6.0.192-7.alpha.rpm
kermit/archives/ckermit-6.0.192-7.src.rpm
kermit/archives/cku192.debian.tar                  # Debian
kermit/archives/cku192.slackware-i386.tgz                           # Slackware
Εκτελέσιμα για άλλα Linux είναι διαθέσιμα στα
kermit/bin/ckuker.linux-2.0-alpha
kermit/bin/ckuker.linux-2.0.27-sparc
kermit/bin/ckuker.linux-2.0.28-mklinux-mach3.0-ppc
kermit/bin/ckuker.linux-1.2.13-i386-elf
kermit/bin/ckuker.linux-2.1.13-i386-elf
Tα αρχεία /kermit/bin/READ.ME και /kermit/archive/READ.ME έχουν περαιτέρω πληροφορίες.

=====================================================================


Previous Next Table of Contents