Εισαγωγή
Tα sescutils είναι ένα σύνολο GNU εργαλείων (gcc, binutils, glibc) που επιτρέπουν το cross-compile προγραμμάτων σε binaries τα οποία μπορούν να εκτελεστούν από τον SESC. To cross-compile αναφέρεται στη διαδικασία μεταγλώττισης ενός προγράμματος σε ένα binary το οποίο προορίζεται να εκτελεστεί σε ένα σύστημα (target platform) διαφορετικής ISA από αυτό στο οποίο γίνεται η μεταγλώττιση (build platform). Στην περίπτωσή μας λοιπόν, το build platform είναι κάποιο Unix-based x86 μηχάνημα, ενώ το target platform είναι το MIPS μηχάνημα που προσομοιώνει ο SESC.
Εγκατάσταση των sescutils
Για να μεταγλωττίσουμε και να εγκαταστήσουμε τα cross εργαλεία (compiler, linker, debugger, κλπ) μαζί με τις απαραίτητες βιβλιοθήκες, ακολουθούμε τα βήματα που παρουσιάζονται στη συνέχεια. Σημειώνουμε ότι πρέπει να έχουμε περί το 1.5 GB διαθέσιμο χώρο στο σκληρό μας δίσκο.
-
Κατεβάζουμε το αρχείο sescutils.tar.bz2 από τη σελίδα του
μαθήματος, και το κάνουμε extract στον κατάλογο sesc-sim.
[~]$ cd ~/sesc-sim [sesc-sim]$ tar jxvf sescutils.tar.bz2
Δημιουργήθηκε ο κατάλογος "sescutils". Μέσα σε αυτόν δημιουργούμε τον κατάλογο "install" όπου θα αποθηκευτούν μετά το πέρας της διαδικασίας τα εκτελέσιμα των cross εργαλείων, οι απαραίτητες βιβλιοθήκες και τα διάφορα includes του συστήματος που προσομοιώνεται. -
Τροποποιήστε το αρχείο
sescutils/build-mipseb-linux/build-common ως εξής:
- αλλάξτε τις τιμές των μεταβλητών GNUSRC και PREFIX ώστε
να δείχνουν τους πραγματικούς καταλόγους με τα sources των
sescutils και τα τελικά εκτελέσιμα των cross εργαλείων
(compiler, linker, debugger, κλπ), αντίστοιχα. Στην
περίπτωσή μας επομένως κάνουμε τις εξής αλλαγές:
GNUSRC=/myhomepath/sesc-sim/sescutils/src PREFIX=/myhomepath/sesc-sim/sescutils/install
- στη 10η γραμμή αλλάξτε το "uname -p" σε "uname -m"
- αλλάξτε τις τιμές των μεταβλητών GNUSRC και PREFIX ώστε
να δείχνουν τους πραγματικούς καταλόγους με τα sources των
sescutils και τα τελικά εκτελέσιμα των cross εργαλείων
(compiler, linker, debugger, κλπ), αντίστοιχα. Στην
περίπτωσή μας επομένως κάνουμε τις εξής αλλαγές:
-
Από τον κατάλογο sescutils/build-mipseb-linux τρέχουμε με τη
συγκεκριμένη σειρά τα ακόλουθα scripts:
[sesc-mipseb-linux]$ ./build-1-binutils [sesc-mipseb-linux]$ ./build-2-gcc-core [sesc-mipseb-linux]$ ./build-3-glibc [sesc-mipseb-linux]$ ./build-4-gcc [sesc-mipseb-linux]$ ./build-5-gdb
H παραπάνω διαδικασία μεταγλώττισης απαιτεί γενικά αρκετό χρόνο. Το 1 φτιάχνει τα binutils. Το 2 φτιάχνει μια αρχική ("bootstrap") έκδοση του gcc, η οποία είναι "αρκούντως μικρή" ώστε να μπορεί να γίνει compile η glibc, και χρησιμοποιώντας πλέον την glibc που δημιουργείται στο βήμα 3, ολοκληρώνεται το compilation του gcc με το 4. Το βήμα 5 (μεταγλώττιση debugger) είναι προαιρετικό. -
Από τον κατάλογο sescutils, κάνουμε την εξής αντιγραφή:
[sescutils]$ cp src/mint.x install/mipseb-linux/lib/ldscripts/
Μεταγλώττιση προγραμμάτων
Προκειμένου να κάνουμε compile τα διάφορα .c αρχεία και link τα αντίστοιχα object files σε ένα τελικό εκτελέσιμο, χωρίς να πρέπει να βάζουμε κάθε φορά στο command line του compiler και του linker τα διάφορα ειδικά options που απαιτεί ο SESC (μαζί με τα κατάλληλα paths), μια καλή πρακτική είναι να χρησιμοποιούμε ένα βασικό Makefile με όλες τις απαραίτητες παραμέτρους, και σε αυτό να αλλάζουμε κάθε φορά τα αρχεία που θέλουμε να μεταγλωττίσουμε κατά το δοκούν.
Ας υποθέσουμε λοιπόν ότι το πρόγραμμα που έχουμε γράψει (hello.c), βρίσκεται στον κατάλογο sesc-sim/hello. Μέσα σε αυτόν δημιουργούμε το Makefile.mips με τα εξής περιεχόμενα:
TARGET_NAME = mipseb-linux BASEDIR = /myhomepath/sesc-sim/sescutils/install #ο κατάλογος όπου εγκαταστάθηκαν τα sescutils BINDIR = $(BASEDIR)/bin/ INCLUDEDIR = $(BASEDIR)/$(TARGET_NAME)/include/ LIBDIR = $(BASEDIR)/$(TARGET_NAME)/lib/ CC = $(BINDIR)/$(TARGET_NAME)-gcc LD = $(BINDIR)/$(TARGET_NAME)-ld #SESC-specific compiler flags CFLAGS = -mips2 -mabi=32 -Wa,-non_shared -mno-abicalls #εδώ βάζετε ό,τι επιπλέον flags θέλετε, π.χ. για warnings, #optimizations, κλπ OTHER_FLAGS = -Wall CFLAGS += $(OTHER_FLAGS) #εδώ ορίζετε επιπλέον βιβλιοθήκες που θέλετε να κάνετε link #στο εκτελέσιμό σας (π.χ. την libm για μαθηματικές ρουτίνες) LIBS = -lm #SESC-specific linker flags LDFLAGS = -static -Wl,--script=$(BASEDIR)/$(TARGET_NAME)/lib/ldscripts/mint.x #τα object files (από ένα ή περισσότερα .c αρχεία) OBJS = hello.o #link object files to executable hello: $(OBJS) $(CC) $(LDFLAGS) $(OBJS) -o hello -L$(LIBDIR) $(LIBS) #compile sources to object files hello.o: hello.c $(CC) $(CFLAGS) -I/$(INCLUDEDIR) -c -o hello.o hello.c #clean up things... clean: rm -f *.o helloΔίνοντας ένα make -f Makefile.mips hello μέσα από τον κατάλογο hello, παράγεται τελικά το εκτελέσιμο "hello", το οποίο μπορεί να εκτελεστεί στον SESC κατά τα γνωστά.