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 MIPS-COFF/ECOFF a do textové reprezentace obsahu paměti SREC.

Simulátorem MipsIT simulovaný procesor MIPS přistupuje k paměti v režimu big-endian.

V prostředí MipsIT je použita již velmi stará verze GNU překladače 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 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 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

* 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 binutils-mips-elf_2.20.51-1_amd64.deb a 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 binutils-mips-elf_2.20.1-1_i386.deb a 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 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

courses/b35apo/tutorials/03/mips-elf-gnu/start.txt · Last modified: 2018/02/11 17:30 (external edit)