Navigation

News

Courses

Quick Links

Εισαγωγή

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 διαθέσιμο χώρο στο σκληρό μας δίσκο.

  1. Κατεβάζουμε το αρχείο sescutils.tar.bz2 από τη σελίδα του μαθήματος, και το κάνουμε extract στον κατάλογο sesc-sim.
    [~]$ cd ~/sesc-sim
    [sesc-sim]$ tar jxvf sescutils.tar.bz2
    
    Δημιουργήθηκε ο κατάλογος "sescutils". Μέσα σε αυτόν δημιουργούμε τον κατάλογο "install" όπου θα αποθηκευτούν μετά το πέρας της διαδικασίας τα εκτελέσιμα των cross εργαλείων, οι απαραίτητες βιβλιοθήκες και τα διάφορα includes του συστήματος που προσομοιώνεται.

  2. Τροποποιήστε το αρχείο 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"

  3. Από τον κατάλογο 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) είναι προαιρετικό.

  4. Από τον κατάλογο sescutils, κάνουμε την εξής αντιγραφή:
    [sescutils]$ cp src/mint.x install/mipseb-linux/lib/ldscripts/
    
Πλέον έχουμε όλα τα εργαλεία ώστε να μπορούμε να μεταγλωττίσουμε ένα C πρόγραμμα για να τρέξει στον SESC.

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

Προκειμένου να κάνουμε 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 κατά τα γνωστά.