Search
Simulátorem QtMips simulovaný procesor MIPS přistupuje k paměti v režimu big-endian.
Pro přípravu vývojových nástrojů bylo tedy použito volby MIPS-ELF (architektura MIPS, ELF pak znamená čistý výkonný formát bez specializace na určitý operační systém).
Připravené balíčky jsou k dispozici na serveru RTIME v rámci podpory vývojových nástrojů pro rozdílné, na Katedře řídicí techniky používané, embedded architektury (Viz stránka "Křížové překladače na RTIME HW Wiki).
Kroky pro instalaci na hostitelský systém Debian GNU/Linux x86
echo deb ftp://rtime.felk.cvut.cz/debian unstable main >/etc/apt/sources.list.d/rtime-debs.list
apt-get update
apt-get install binutils-mips-elf gcc-mips-elf
Po úspěšné instalaci je možné používat překladač jazyka C mips-elf-gcc, program pro překlad jazyka symbolických adres mips-elf-as a program pro relokaci a skládaní aplikací (linker) mips-elf-ld.
mips-elf-gcc
mips-elf-as
mips-elf-ld
Balíčky k stažení: binutils-mips-elf_2.30.0-1_amd64.deb a gcc-mips-elf_7.4.0-1_amd64.deb
Provést instalaci
sudo dpkg -i Downloads/binutils-mips-elf_2.30.0-1_amd64.deb sudo dpkg -i Downloads/gcc-mips-elf_7.4.0-1_amd64.deb
Sestavení křížového překladače GCC na platformu MIPS pro Windows mips-elf-gcc-i686-mingw32.zip.
Sestavení křížového překladače GCC na MIPS pro macOS binutils-mips-elf_2.32_macos.zip a gcc-mips-elf_7.4_macos.zip
Překlad z assembleru do relokovaletlného objektového tvaru
mips-elf-gcc -c start-asm.S -o start-asm.o
Určení jazyka zdrojového souboru provádí kompilátor GCC automaticky podle přípony souboru (assembler “.s”, assembler s preprocesorem “.S”, C “.c”, C++ “.C”). Pro kompilaci zdrojových kódů s příponou malé “.s” assemblerem s preprocesorem je možné volbu jazyka vynytit explicitně přepínačem “-x”.
mips-elf-gcc -x assembler-with-cpp -c start-asm.S -o start-asm.o
Překlad z jazyka C
mips-elf-gcc -g -O1 -c pow-cycle.c -o pow-cycle.o
, kde -g specifikuje vložení ladících informací, -O1 míru optimalizace, -c požadavek na překlad bez finálního složení aplikace a -o specifikaci jména výstupního souboru.
-g
-O1
-c
-o
Pro vlastní složení binárního programu pak slouží příkaz
mips-elf-gcc -g -nostdlib -nodefaultlibs -nostartfiles -Wl,-Ttext,0x80020000 pow-cycle.o -o pow-cycle
Důležité je specifikovat, na které adrese předpokládá simulátor začátek programu. V případě QtMips se počáteční adresa 0x80020000 a apecifikace -Wl,-Ttext předává tento požadavek na start “textového”/kódového segmentu do linkeru. Pokud je definovaný symbol _start a linker nastaví vstupní bod, tak se bude simulátor QtMips řídit nastavením z linkeru. Další přepínače pak slouží k tomu, aby výsledný program obsahoval pouze specifikovaný kód bez standardních knihoven, sekvencí pro volání konstruktorů a inicializace běhového prostředí. Tímto způsobem získaný kód obsahuje právě jen přeložené funkce z explicitně uvedených zdrojových kódů.
-Wl,-Ttext
_start
Pro úspěšný přístup ke globálním proměnným je však alespoň minimální část sekvence pro nastavení běhového prostředí nutná. Lze jí nahradit následujícím kódem v assembleru vloženým před ostatní funkce v zdrojovém kódu v jazyce C
asm ( ".global _start\n" "_start:\n" " la $gp,_gp\n" " j main\n" );
Výsledný sputitelný program je však stále ve formátu ELF, který již lze načíst simulátorem QtMips. Soubor je možné převést i do textového zápisu obsahu paměti příkazem
mips-elf-objcopy -O srec pow-cycle pow-cycle.srec
Pro kompilaci nástrojů pro práci s objektovým kódem byla použita konfigurace
CFLAGS=-O2 LDFLAGS=-s \ ./configure \ --prefix=/usr \ --disable-nls \ --with-gnu-ld \ --with-gnu-as \ --with-mmap \ --enable-64-bit-bfd \ --build=x86_64-linux-gnu \ --host=x86_64-linux-gnu \ --target=mips-elf \ --enable-targets=mips-linux \ --enable-multilib
Pro kompilaci vlastního překladače GCC doplněného o knihownu NewLib pak
./configure -v \ --enable-languages=c \ --prefix=/usr \ --enable-multilib \ --with-system-zlib \ --without-included-gettext \ --disable-nls \ --disable-lto \ --disable-threads \ --enable-sjlj-exceptions \ --with-gnu-ld \ --with-gnu-as \ --with-newlib \ --enable-checking=release \ --build=x86_64-linux-gnu \ --host=x86_64-linux-gnu \ --target=mips-elf \ --enable-version-specific-runtime-libs \ --with-float=soft \ --enable-target-optspace
Minimálmí Makefile pro kompilaci z příkazové řádky
CC=mips-elf-gcc LD=mips-elf-gcc OBJCOPY=mips-elf-objcopy CFLAGS=-Wall -ggdb OBJS=start-asm.o BIN=start-bin all: $(BIN) $(BIN).out run .PHONY: clean run $(BIN) : $(OBJS) mips-elf-gcc -g -nostdlib -nodefaultlibs -nostartfiles -Wl,-Ttext,0x80020000 -o $@ $< $(BIN).srec : $(BIN) $(OBJCOPY) -O srec $< $@ clean : rm -f $(BIN) $(OBJS) $(BIN).srec