K. Konopko; Toolchain. Toolchain. dr inż. Krzysztof Konopko

Podobne dokumenty
Tworzenie oprogramowania

Laboratorium 1 Temat: Przygotowanie środowiska programistycznego. Poznanie edytora. Kompilacja i uruchomienie prostych programów przykładowych.

Programowanie Systemów Wbudowanych

Środowisko Keil. Spis treści. Krzysztof Świentek. Systemy wbudowane. 1 Trochę teorii. 2 Keil

K. Konopko; Toolchain. Jądro Linuksa. dr inż. Krzysztof Konopko

Programowanie systemów wbudowanych

2 Tworzenie oprogramowania dla systemu wbudowanego

Konfiguracja i kompilacja jądra Linux. Based on Free Electrons

Programowanie Strukturalne i Obiektowe Słownik podstawowych pojęć 1 z 5 Opracował Jan T. Biernat

Podstawy programowania

1. Pierwszy program. Kompilator ignoruje komentarze; zadaniem komentarza jest bowiem wyjaśnienie programu człowiekowi.

IBM SPSS Statistics - Essentials for R: Instrukcje instalacji dla Linux

Programowanie w języku C++ Grażyna Koba

Uruchomienie Raspberry Pi

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Linux.

Programowanie Systemów Wbudowanych

Programowanie niskopoziomowe

Programowanie Systemów Wbudowanych

X P.I.W.O. Portowanie Tizena na nowe architektury na przykładzie ARMv6. Maciej Wereski Samsung R&D Institute Poland. 17 Maj Poznań, Polska

Programowanie w C. dr inż. Stanisław Wszelak

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

IdyllaOS. Prosty, alternatywny system operacyjny. Autor: Grzegorz Gliński. Kontakt:

Embedded GNU/Linux. Krzysztof Mazur

Język JAVA podstawy. wykład 1, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Wstęp do Informatyki i Programowania Laboratorium: Lista 0 Środowisko programowania

Prezentacja emulatora QEMU Zajęcia SO

Technika mikroprocesorowa. Struktura programu użytkownika w systemie mikroprocesorowym

Linux - System Wbudowany

Programowanie niskopoziomowe. dr inż. Paweł Pełczyński

BF20 JTAG dla ARM ów z interfejsem USB Instrukcja obsługi

Wstęp do programowania

Programowanie niskopoziomowe

QEMU działa na procesorach procesorach: emuluje procesory: dostępne dla s.o. hosta:

2 Tworzenie oprogramowania dla systemu wbudowanego

Fragment wykładu z języka C ( )

Podstawy Informatyki Wprowadzenie do języka C dr inż. Jarosław Bułat

Programowanie mikrokontrolerów AVR

Optymalizacja programów Open Source. Profilery wysokiego poziomu część 2. Krzysztof Lichota

Czym jest Java? Rozumiana jako środowisko do uruchamiania programów Platforma software owa

Kernel Kompilacja jądra

Komputery przemysłowe i systemy wbudowane

U M L. System operacyjny Linux zagnieżdżony w zewnętrznym systemie operacyjnym (Linux)

Systemy operacyjne na platformach mobilnych 2 Programowanie aplikacji z graficznym interfejsem użytkownika w GTK+

2 Tworzenie oprogramowania dla systemu wbudowanego

SYLABUS DOTYCZY CYKLU KSZTAŁCENIA realizacja w roku akademickim 2016/2017

CODE::BLOCKS & VALGRIND OPRACOWAŁ MICHAŁ BETHKE

Praca w środowisku Visual Studio 2008, Visual C

Struktury systemów operacyjnych

Q E M U.

Kompilacja i scalanie programów w linii poleceń gcc i make

Systemy wbudowane. Rysunek 1: Ilustracja procesu kompilacji oprogramowania

Spis treści. I. Skuteczne. Od autora... Obliczenia inżynierskie i naukowe... Ostrzeżenia...XVII

Podstawy programowania. Wprowadzenie

Programowanie w asemblerze Linkowanie

Metody Kompilacji Wykład 1 Wstęp

IBM SPSS Statistics Wersja 22. Linux - Instrukcja instalacji (licencja wielokrotna)

Spis treści. Wstęp... 10

Warsztaty AVR. Instalacja i konfiguracja środowiska Eclipse dla mikrokontrolerów AVR. Dariusz Wika

Języki Programowania. Kompilatory Fortranu. Wojciech Sobieski

Systemy wbudowane. Wprowadzenie. Struktura. Mikrokontrolery AVR. Wprowadzenie do programowania w C

Otwarte oprogramowanie w systemach wbudowanych i pomiarowych. Rok akademicki: 2015/2016 Kod: EEL PT-s Punkty ECTS: 3

Wolne Oprogramowanie i GNU Fortran

Komputery Przemysłowe i Systemy Wbudowane

Wprowadzenie do biblioteki klas C++

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 8. Karol Tarnowski A-1 p.

Wstęp do programowania. Wykład 1

Programowanie I. O czym będziemy mówili. Plan wykładu nieco dokładniej. Plan wykładu z lotu ptaka. Podstawy programowania w językach. Uwaga!

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Windows.

WPROWADZENIE DO INFORMATYKI

Systemy Operacyjne. Ćwiczenia

Programowanie C++ Wykład 1 - Aplikacje konsowlowe w środowisku QT. dr inż. Jakub Możaryn. Warszawa, Instytut Automatyki i Robotyki

Programowanie Systemów Wbudowanych. GNU Toolchain i kompilacja skrośna. GNU Toolchain. Cross-compilation KSEM WETI PG.

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 7. Karol Tarnowski A-1 p.

Wstęp. do języka C na procesor (kompilator RC51)

System Zarządzania Dystrybucją

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Laboratorium 1. I. Zainstaluj program Eclipse (wersja C/C++ w odpowiednim systemie operacyjnym

Historia modeli programowania

Make jest programem komputerowym automatyzującym proces kompilacji programów, na które składa się wiele zależnych od siebie plików.

Programowanie obiektowe zastosowanie języka Java SE

Instrukcja użytkownika Platforma transakcyjna mforex Trader dla systemu Linux

Programowanie w C++ Wykład 10. Katarzyna Grzelak. 21 maja K.Grzelak (Wykład 10) Programowanie w C++ 1 / 21

REFERAT PRACY DYPLOMOWEJ

ICD Wprowadzenie. Wprowadzenie. Czym jest In-Circuit Debugger? 2. O poradniku 3. Gdzie szukać dodatkowych informacji? 4

MentorGraphics ModelSim

Sprzęt komputera - zespół układów wykonujących programy wprowadzone do pamięci komputera (ang. hardware) Oprogramowanie komputera - zespół programów

Instrukcje instalacji pakietu IBM SPSS Data Access Pack dla systemu Linux

PROGRAMOWANIE WSPÓŁCZESNYCH ARCHITEKTUR KOMPUTEROWYCH DR INŻ. KRZYSZTOF ROJEK

Programowanie komputerów

Procesy pojęcia podstawowe. 1.1 Jak kod źródłowy przekształca się w proces

Programowanie w języku Python. Grażyna Koba

Delphi podstawy programowania. Środowisko Delphi

Platformy programistyczne:.net i Java L ABORATORIUM 7,8: HACKATHON - JTTT

Programowanie współbieżne i rozproszone

Linux -- u mnie działa!

SYSTEMY OPERACYJNE WYKLAD 4 - zarządzanie pamięcią

Programowanie obiektowe. Literatura: Autor: dr inŝ. Zofia Kruczkiewicz

GNU GProf i GCov. przygotował: Krzysztof Jurczuk Politechnika Białostocka Wydział Informatyki Katedra Oprogramowania ul. Wiejska 45A Białystok

Konspekt pracy inżynierskiej

Transkrypt:

Toolchain dr inż. Krzysztof Konopko e-mail: k.konopko@pb.edu.pl 1

Środowisko kompilacji skrośnej Program wykładu: Wprowadzenie do kompilacji skrośnej. GCC Binutils. Biblioteka standardowa C. Pliki nagłówkowe jądra. Tworzenie toolchaina. 2

Wprowadzenie Zwykle narzędzia programistyczne dostępne dla GNU / Linux przeznaczone są do tworzenia systemu i aplikacji natywnych. W przypadku systemu wbudowanego jest to zwykle niemożliwe: system wbudowany zazwyczaj ma zbyt małe zasoby (procesor, pamięć, urządzenia IO), system wbudowany jest zazwyczaj dużo wolniejszy od stacji roboczej, nie zawsze istnieje możliwość (potrzeba) instalacji całego środowiska deweloperskiego na komputerze docelowym. Dlatego najczęściej wykorzystuje się cross-kompilator, który umożliwia kompilowanie na stacji roboczej (architektura x86) oprogramowania dla systemu o architekturze ARM. 3

Podstawowe komponenty GMP MPFR pliki nagłówkowe jądra MPC GCC Binutils libc TOOLCHAIN libelf 4

GCC GCC (ang. GNU Compiler Collection) - zestaw kompilatorów do różnych języków programowania rozwijany w ramach projektu GNU. W skład GCC wchodzą kompilatory wielu języków programowania w tym: C - gcc C++ - g++ Objective-C - gobjc Fortran - g77 oraz nowa implementacja Fortranu 95 o nazwie GFortran Java - gcj Ada gnat 5

GCC Kompilatory wchodzące w skład GCC mogą być uruchamiane na wielu różnych platformach sprzętowych i systemowych. Za ich pomocą można generować kod wynikowy przeznaczony dla różnych procesorów w tym: Alpha ARM AVR IA-64 MIPS Motorola M68000 i wiele innych układów tej firmy PowerPC SPARC/SPARC64 x86/x86-64 6

Binutils addr2line ar as c++filt gprof ld nm objdump ranlib readelf size strings strip Tłumaczy adres w komunikacie błędu (core dump) na odpowiedni plik źródłowy i numer linii. Używany przy debugowaniu. Archiwizator. Kilka skompilowanych plików. o (zazwyczaj biblioteki przygotowane do statycznego linkowania) może zostać zapakowanych do pojedynczego pliku.a. Asembler GNU - używany przez GCC. Używany przez linker przy konsolidacji kodu napisanego w C++ lub Javie. Kolejne narzędzie do debugowania, wyświetla statystyki użycia poszczególnych funkcji (Profiler). Linker (konsolidator), używany przez GCC. Wyświetla identyfikatory pojawiające się w danym pliku.o. Wyświetla informacje o plikach skompilowanych. Pomocniczy do tworzenia paczek z wersjami statycznymi bibliotek. Generuje indeks identyfikatorów zawartych we wszystkich plikach w archiwum i przechowuje go w tym archiwum w specjalnym formacie. Informacje o plikach wykonywalnych w formacie ELF. Pozwala na przykład stwierdzić, jakie biblioteki są wymagane przez dany plik wykonywalny. Rozmiary poszczególnych sekcji pliku wykonywalnego. Program analizuje dowolny plik binarny, znajduje i wyświetla wszystkie zawarte w nim drukowalne ciągi znaków. Usuwa dodatkowe informacje z plików wykonywalnych i bibliotek. Program staje się mniejszy (i jego ładowanie trwa krócej), ale tracimy możliwość debugowania go. 7

Biblioteka standardowa C glibc zawiera m.in.: interfejs do funkcji jądra systemu - tworzący pomost między wywołaniami systememowymi i prostymi fukcjami write() i read(), formatowane wejście i wyjście (słynne funkcje z grupy printf), kod zapewniający kompatybilność ze standardem interfejsu POSIX, ANSI C i innymi standardami, procedury alokacji pamięci, buforowane I/O, procedury matematyczne (w GNU/Linuksie ta część biblioteki znajduje się w osobnym pliku - libm.so), procedury operowania na łańcuchach tekstowych, obsługa lokalizacji, funkcje daty i czasu, funkcje pseudolosowe. 8

Pliki nagłówkowe jądra Biblioteka standardowa i kompilowane programy muszą znać sposób komunikacji z jądrem w tym: dostępne wywołania systemowe <asm-generic/unistd.h>, definicje stałych <asm-generic/fcntl.h>, <asm/fcntl.h>, <linux/fcntl.h>, struktury danych <asm/stat.h> itd. Dlatego biblioteka standardowa C wymaga plików nagłówkowych jądra. 9

Tworzenie toolchaina Nazwa narzędzi tworzących toolchain wskazuje kompilatorowi i narzędziom Binutils dla jakiej architektury bajtów w słowie oraz ABI odbywa się kompilacja. 1)architektura: arm, armeb; 2)wariant: unknown, none; czasem wersja rdzenia: cortex_a8, nazwa producenta itp.; może określać również kolejność bajtów w słowie; 3)system operacyjny: linux, symbian, android - wskazuje, że generowany kod jest łączony dynamicznie z odpowiednią biblioteką standardową dla danego systemu; ten element nazwy może w ogóle nie występować, co oznacza, że toolchain służy do generowania kodu działającego bezpośrednio na procesorze; 4)wersja biblioteki standardowej/abi: gnu, gnueabi, uclibcgnueabi, np.: arm-unknown-linux-uclibcgnueabi-* 10

(E)ABI Kompilator GCC dla architektury ARM pozwala wybrać ABI (ang. Application Binary Interface, ABI) czyli zestaw reguł i ustawień kompilacji i linkowania programów, które decydują o współpracy pomiędzy poszczególnymi programami, bibliotekami i systemem operacyjnym. W przeciwieństwie do API (ang. Application Programming Interface), które określa interfejs dla programisty (dostępne funkcje i ich parametry), ABI dotyczy programów w wersji skompilowanej. Domyślne ABI, którego instrukcje generuje nasz kompilator, definiujemy na etapie kompilacji GCC parametrem: --with-mabi=<abi> Na etapie korzystania z toolchaina, wybór ABI, dla którego jest kompilowany program, dokonywany jest parametrem: -mabi=<abi> 11

Wersja procesora i architektury Można określić rodzaj kodu generowanego przez kompilator w zależności od architektury danego procesora oraz sposób optymalizowania kodu typowego dla danego układu poprzez następujące opcje: -mcpu= - nazwa docelowego procesora. Na podstawie nazwy procesora określana jest wersja architektury, generowany kod asemblera zawierający specyficzne dla niej instrukcje, -march= - nazwa docelwej architektury. Określa architekturę dla której generowany jest kod asemblera. -mtune= - używany do optymalizacji kodu dla konkretnego procesora. Przyjmuje te same parametry, co -mcpu=. O ile -mcpu= generuje kod działający tylko na konkretnym procsorze/wersji architektury, o tyle -mtune= optymalizuje kod asemblera dla konkretnego modelu procesora (ale kod działa na każdym procesorze zgodnym z architekturą). Na przykład kod może być generowany dla procesora zgodnego z arm9, ale najszybciej działać na arm926ej-s: -mcpu=arm9 -mtune=arm926ej-s. 12

Kolejność bajtów w słowie Istnieją zasadniczo dwa sposoby uporządkowania danych w pamięci: Big endian (spotykane także grubokońcowość) to forma zapisu danych, w której najbardziej znaczący bajt (zwany też grubym bajtem, z ang. high-order byte) umieszczony jest jako pierwszy. Little endian (spotykane także cienkokońcowość) to forma zapisu danych, w której mniej znaczący bajt (zwany też dolnym bajtem, z ang. low-order byte) umieszczony jest jako pierwszy. Wyboru dokonujemy, ustalając odpowiednią nazwę narzędzi, oraz przy konfiguracji biblioteki standardowej. 13

Operacje zmiennoprzecinkowe W przypadku braku możliwości sprzętowej realizacji, operacje zmiennoprzecinkowe mogą być emulowane na jeden z następujących sposobów: Kompilator GCC zastępuje, na etapie kompilacji, instrukcje zmiennoprzecinkowe, (opcja: -msoft-float). Programy korzystają z instrukcji zmiennoprzecinkowych, które są emulowane przez jądro systemu. Decyzje o rodzaju emulacji podejmowane są na etapie konfiguracji toolchaina. 14

Ręczne tworzenie toolchaina Budowa systemu od zera (z dostępnych źródeł na otwartych licencjach) pozwala lepiej zrozumieć, jak działa Linux, skąd się biorą poszczególne programy. Umożliwia dostosowanie ich do własnych potrzeb. Wady to przede wszystkim dłuższy niż przy zastosowaniu automatycznych narzędzi czas poświęcony na przygotowanie i kompilację oraz konieczność samodzielnego dbania o ewentualne aktualizacje i reagowania na rozpoznane błędy bezpieczeństwa. 15

Gotowe toolchainy Wady gotowych toolchainów: służą do ogólnych zastosowań i mają działać na jak największej ilości systemów, co w zasadzie wyklucza wykorzystanie optymalizacji; z reguły są dostarczane przez producentów sprzętu, mogą więc zawierać tylko optymalizacje na konkretny procesor/platformę, nie ma gwarancji, że skompilowany nimi kod w ogóle da się uruchomić na innym zestawie; dostarczają stabilnych (czytaj: starych) wersji kompilatora i narzędzi, często nieobsługujących najnowszych procesorów z ich nowymi funkcjami. Zalety gotowych toolchainów: gotowe do użytku od razu po zainstalowaniu/rozpakowaniu; sprawdzone (przez to, że są powszechnie używane, jest szansa, że ktoś już natknął się na błąd, który właśnie się nam przytrafił); Przykładowe gotowe toolchainy: Sourcery CodeBench toolchain, Linaro toolchain, gotowe pakiet toolchaina zawarty w dystrybucji np. w Ubuntu: sudo apt-get install gcc-arm-linux-gnueabi 16

Gotowe toolchainy Sourcery CodeBench: CodeSourcery jest firmą, która sprzedaje gotowe toolchainy zapewniając wsparcie udostępnia jednak też i darmową wersję lite http://mentor.com/embedded-software/sourcery-tools/sourcery-codebench/editions/liteedition/ Dla architektury ARM dostępne są między innymi następujące wersje: EABI - biblioteka standardowa newlibc - do kompilacji programów działających bezpośrednio na sprzęcie (bez systemu operacyjnego); uclinux - biblioteka standardowa uclibc; GNU/Linux - biblioteka GNU/libc; Wystarczy pobrać instalator lub archiwum (skorzystamy z tego drugiego), rozpakować i ustawić zmienne środowiskowe. Linaro: Jest projektem rozpoczętym przez firmy: ARM, Freescale, IBM, Samsung, ST-Ericsson i Texas Instruments 3 czerwca 2010 roku. Ma na celu dostarczanie, zgodnie z zapowiedziami, co pół roku, stabilnego, zoptymalizowanego zestawu bazowych narzędzi dla dystrybucji i deweloperów systemów wbudowanych". Zgodnie z założeniami, nacisk ma zostać położony na jądro oraz system bazowy. https://wiki.linaro.org/workinggroups/toolchain 17

Toolchainy generowane automatycznie Innym rozwiązaniem jest użycie narzędzi, które automatyzują proces budowania toolchaina. Najbardziej popularne to: Crosstool-ng http://crosstool-ng.org/, Buildroot http://www.buildroot.net, Yocto https://www.yoctoproject.org/. Inne toolchainy można znaleźć na: http://elinux.org/toolchains 18

Tworzenie toolchaina z zastosowaniem crosstool-ng Kompilacja i instalacja ct-ng na podstawie wydanej wersji wget http://crosstool-ng.org/download/crosstool-ng/crosstool-ng-version.tar.bz2 tar -xf crosstool-ng-version.tar.bz2 cd crosstool-ng-version./configure --prefix=/some/place make make install Kompilacja i instalacja ct-ng na podstawie wersji rozwojowej git clone https://github.com/crosstool-ng/crosstool-ng cd crosstool-ng./bootstrap./configure --enable-local make make install Tworzenie toolchaina./ct-ng help./ct-ng armv7-rpi2-linux-gnueabihf./ct-ng menuconfig./ct-ng build 19