Debugowanie aplikacji w architekturze MIPS #1 – Środowisko

Ten post powstał jako uaktualnienie procesu opisanego tutaj, przez Zacharego Cutlipa.

Po ponad dwóch latach od napisania tamtego tutoriala pewne rzeczy nieco się zdezaktualizowały lub zostały pominięte w opisie, skutkiem czego przyspożyły mi żmudnej pracy, której Tobie chciałbym oszczędzić 🙂

Co będzie potrzebne?

Wymagania nie powinny stanowić żadnego problemu:

1. Kompilacja statyczna QEMU

Z racji tego, że nowe wersje QEMU mają poprawiony błąd w pliku /linuxuser/elfload.c, wystarczy pobrać jedną z zalecanych wersji na stronie pobierania i dokonać niewielkiej zmiany w pliku Makefile. W moim przykładzie posłużę się wersją 2.2.1.

Na maszynie wirtualnej z Ubuntu wydajemy następujące polecenia:

Instalacja zależności

sudo apt-get install -y autoconf automake libtool zlib1g-dev libglib2.0-dev

Pobranie QEMU

wget http://wiki.qemu-project.org/download/qemu-2.2.1.tar.bz2

Rozpakowanie archiwum

tar xvjf qemu-2.2.1.tar.bz2

Tak jak w poradniku Zachary’ego, modyfikujemy plik Makefile znajdujący się w głównym katalogu rozpakowanego archiwum.

Zamieniamy:

pixman/Makefile: $(SRC_PATH)/pixman/configure (cd pixman; CFLAGS="$(CFLAGS) -fPIC $(extra_cflags) $(extra_ldflags)" $(SRC_PATH)/pixman/configure $(AUTOCONF_HOST) –disable-gtk –disable-shared –enable-static)

na:

pixman/Makefile: $(SRC_PATH)/pixman/configure (cd pixman; aclocal; CFLAGS="$(CFLAGS) -fPIC $(extra_cflags) $(extra_ldflags)" $(SRC_PATH)/pixman/configure $(AUTOCONF_HOST) –disable-gtk –disable-shared –enable-static)

Kompilujemy:

cd qemu-2.2.1 ./configure –static make sudo make install

2. Pobieranie obrazów Debian MIPS \ MIPSel

Ze strony pobieramy gotowe obrazy Debiana dla QEMU w architekturach MIPS (Big Endian) oraz MIPSel (Little Endian).

Należy mieć na uwadze, że do różnych wersji kerneli są przyporządkowane inne obrazy HDD, które nie są ze sobą kompatybilne. Oczywiście, również jądra pomiędzy architekturami nie są ze sobą zgodne.

Jądra dla obrazów debian_squeeze_mips_standard.qcow2 oraz debian_squeeze_mipsel_standard.qcow2

Jądra dla obrazów debian_wheezy_mips_standard.qcow2 oraz debian_wheezy_mipsel_standard.qcow2

3. Konfiguracja sieci

Skrypt do włączania i wyłączania interfejsów sieciowych nie uległ zmianie, podobnie jak zawartość pliku /etc/network/interfaces, dlatego pomijam ten krok.

4. Uruchamianie VM z Debianem

W skrypcie uruchamiającym maszyny wirtualne poprawiamy ścieżki do obrazów HDD oraz jąder systemów, również zamieniamy “XX” w ostatnim oktecie adresów MAC.

Bardzo ważną zmianą jest usunięcie z polecenia QEMU do uruchomienia systemu parametru -nographic. Przełącznik ten odpowiada za pominięcie uruchomienia serwera VNC maszyny wirtualnej i przekierwowanie wyjścia na konsolę. Niestety podczas ładowania z tą opcją system operacyjny zawiesza się. W przypadku usunięcia tego przełacznika wszystko działa idealnie 🙂

Polecenie ma wyglądać w następujący sposób:

$qemu -net nic,macaddr=$macaddr -net tap,ifname=$iface -M malta -kernel $kernel -hda $image -append “root=/dev/sda1 console=tty0”

Po edycji zapisujemy plik skryptu i możemy uruchomić wybraną przez siebie VM’kę za pomocą debqemu.sh be (dla Big Endian) \ le (Little Endian).

Do maszyny wirtualnej możemy połączyć się za pomocą dowolnego klienta VNC pod adresem 127.0.0.1:5900.

5. Czynności poinstalacyjne

Logujemy się za pomocą poświadczeń root:root i aktualizujemy system operacyjny:

apt-get update apt-get upgrade

Instalacja niezbędnych programów, wedle uznania (serwer SSH jest już zainstalowany):

apt-get install -y mc git gdb build-essential

To by było na tyle w pierwszej części. W kolejnej (ostatniej) opiszę proces uruchamiania binarek skompilowanych na MIPS i “zdalne” debugowanie za pomocą GDB Server i IDA Pro.