====== Křížový překladač GNU pro architekturu MIPS-ELF ====== Simulátor Mips.exe z prostředí MipsIT je schopný načítat programy zkompilované do objektového formátu [[http://en.wikipedia.org/wiki/COFF|MIPS-COFF/ECOFF]] a do textové reprezentace obsahu paměti [[http://en.wikipedia.org/wiki/SREC_%28file_format%29|SREC]]. Simulátorem MipsIT 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]]. V prostředí MipsIT je použita již velmi stará verze GNU překladače [[http://gcc.gnu.org/|GCC]] (2.7.2-970404.mips) zkompilovaná pro cílovou platformu mips-ecoff. V současné době je již formát COFF/ECOFF ve většině aplikací nahrazen formátem [[http://en.wikipedia.org/wiki/ELF_file_format|ELF]] a podpora kopilace programů v jazyce C do formátu COFF pro MIPS již není v GCC udržovaná. 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 serveru [[http://rtime.felk.cvut.cz/|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 [[http://rtime.felk.cvut.cz/hw/index.php/Cross_compilers|"Křížové překladače]] na RTIME HW Wiki). Kroky pro instalaci na hostitelský systém Debian GNU/Linux x86 * Přidat do zdrojů systému APT odkaz na balíčky z RTIME: echo deb ftp://rtime.felk.cvut.cz/debian unstable main >/etc/apt/sources.list.d/rtime-debs.list * 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''. ===== Instalace v učebně za proxy s autentizací ===== Manuálně stáhnout balíčky [[ftp://rtime.felk.cvut.cz/debian.old/pool/main/b/binutils-2.20.51/binutils-mips-elf_2.20.51-1_amd64.deb|binutils-mips-elf_2.20.51-1_amd64.deb]] a [[ftp://rtime.felk.cvut.cz/debian.old/pool/main/g/gcc-4.4.4/gcc-mips-elf_4.4.4-1_amd64.deb|gcc-mips-elf_4.4.4-1_amd64.deb]] Provést instalaci sudo dpkg -i Downloads/binutils-mips-elf_2.20.51-1_amd64.deb sudo dpkg -i Downloads/gcc-mips-elf_4.4.4-1_amd64.deb 32-bit verze kompilátoru je také k dispozici [[ftp://rtime.felk.cvut.cz/debian.old/pool/main/b/binutils-2.20.1/binutils-mips-elf_2.20.1-1_i386.deb|binutils-mips-elf_2.20.1-1_i386.deb]] a [[ftp://rtime.felk.cvut.cz/debian.old/pool/main/g/gcc-4.4.4/gcc-mips-elf_4.4.4-1_i386.deb|gcc-mips-elf_4.4.4-1_i386.deb]] ===== Parametry pro překlad do prostředí simulátoru Mips.exe ===== 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ě MipsIT se jedná o adresu 0x80020000 a apecifikace ''-Wl,-Ttext'' předává tento požadavek na start "textového"/kódového segmentu do 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ýledný sputitelný program je však stále ve formátu ELF, který není pro simulátor MipsIT použitelný. Proto je potřaba provést převedení programu do formátu COFF nebo SREC mips-elf-objcopy -O srec pow-cycle pow-cycle.srec mips-elf-objcopy -O ecoff-bigmips pow-cycle pow-cycle.out ===== 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,mips-ecoff \ --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 \ --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 ===== 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).out : $(BIN) $(OBJCOPY) -O ecoff-bigmips $< $@ clean : rm -f $(BIN) $(OBJS) $(BIN).out run: $(BIN).out wine /mountpoint/mipsit/bin/Mips.exe $(BIN).out