====== Křížový překladač GNU pro architekturu MIPS-ELF ======
Simulátorem QtMips simulovaný procesor [[http://en.wikipedia.org/wiki/MIPS_architecture|MIPS]] přistupuje k paměti v režimu [[http://en.wikipedia.org/wiki/Big-endian#Big-endian|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).
===== Debian balíčky pro křížový překlad na architekturu MIPS =====
Připravené balíčky jsou k dispozici na pomocném serveru [[http://pisa-virt.felk.cvut.cz/|pisa-virt]] v rámci
podpory vývojových nástrojů pro rozdílné, na Katedře řídicí techniky používané,
embedded architektury (již zastaralé informace na stránce [[http://rtime.felk.cvut.cz/hw/index.php/Cross_compilers|Křížové překladače]] v rámci RTIME HW Wiki, kde jsem pro studenty a bývalé kolegy své znalosti publikoval a archivoval).
Kroky pro instalaci na hostitelský systém Debian GNU/Linux x86
* Přidat do zdrojů systému APT odkaz na balíčky ze servisního virtuálního serveru:
echo deb http://pisa-virt.felk.cvut.cz/repos/apt/debian unstable main >/etc/apt/sources.list.d/pisa-virt-debs.list
* Případně přidat klíč
wget -qO - http://pisa-virt.felk.cvut.cz/repos/apt/debian/pisa-virt-reprepro.pub | sudo apt-key add -
* Aktualizovat seznam dostupných balíčků
apt-get update
* Instalovat příslušné balíčky ze sekce cross-dev (s použitím apt-get, aptitude nebo synaptic)
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''.
===== Manuální stažení novější verze balíčků =====
Balíčky k stažení: [[http://cmp.felk.cvut.cz/~pisa/apo/qtmips/binutils-mips-elf_2.34-1_amd64.deb|binutils-mips-elf_2.34-1_amd64.deb]] a [[http://cmp.felk.cvut.cz/~pisa/apo/qtmips/gcc-mips-elf_10.1.0-1_amd64.deb|gcc-mips-elf_10.1.0-1_amd64.deb]]
Provést instalaci
sudo dpkg -i Downloads/binutils-mips-elf_2.34-1_amd64.deb
sudo dpkg -i Downloads/gcc-mips-elf_10.1.0-1_amd64.deb
Pro distribuce s jiným balíčkovacím systémem než používá Debian
ar x Downloads/binutils-mips-elf_2.34-1_amd64.deb # Extract Debian package
sudo tar -C / -xvJf data.tar.xz # Untar data from the package to the filesystem root
ar x Downloads/gcc-mips-elf_10.1.0-1_amd64.deb # Extract Debian package
sudo tar -C / -xvJf data.tar.xz # Untar data from the package to the filesystem root
Sestavení křížového překladače GCC na platformu MIPS pro Windows [[http://cmp.felk.cvut.cz/~pisa/apo/qtmips/mips-elf-gcc-i686-mingw32.zip|mips-elf-gcc-i686-mingw32.zip]].
Sestavení křížového překladače GCC na MIPS pro macOS [[http://cmp.felk.cvut.cz/~pisa/apo/qtmips/binutils-mips-elf_2.34_macos.zip|binutils-mips-elf_2.34_macos.zip]] a [[http://cmp.felk.cvut.cz/~pisa/apo/qtmips/gcc-mips-elf_10.1.0_macos.zip|gcc-mips-elf_10.1.0_macos.zip]]. Archivy je potřeba rozbalit programem ZIP od kořenového adresáře systému.
===== Parametry pro překlad do prostředí simulátoru QtMips =====
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.
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ů.
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
===== Kompilace vývojového řetězce =====
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 \
--target=mips-elf \
--enable-targets=mips-linux \
--enable-multilib
Pro kompilaci vlastního překladače GCC doplněného o knihownu [[http://sourceware.org/newlib/|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 \
--target=mips-elf \
--enable-version-specific-runtime-libs \
--with-float=soft \
--enable-target-optspace
Pro canadian-cross kompilaci řetězce pro Windows pod GNU/Linuxem pak lze přidat
--build=x86_64-linux-gnu \
--host=i686-w64-mingw32 \
===== Kompilace assembleru pro MipsIt z příkazové řádky =====
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