Linux i Inbyggda System, 7.5hp 120202 Linux Cross Toolchain Cross Development Toolchain binutil, glibc and gcc Innehållsförteckning: sida 1. Introduktion 2 2. Redovisa 2 3. Workspace 2 4. Komponent versioner 3 5. Byggkrav 3 6. Byggööversikt 3 7. Workspace inställningar 4 8. Förbered för att bygga verktygen 4 9. Kernel Headers 4 10. Binutils 5 10. Bootstrap Compiler 5 11. C library 5 12. Full Kompilering 6 13. Setup verktygskedjan 6 14. Att använda en Toolchain 7 15. C Library Alternativ 8
1. Introduktion Målet är att bygga en Linux kors verktygskedja på en host dator för vår target maskin. Se kapitel 4: Development Tools, in Building Embedded Linux Systems by Karim Yaghmour. Ungefär som vanliga programutvecklare så behöver inbäddade systemutvecklare kompilatorer, länkare, integrerade utvecklingsmiljöer och andra sådana utvecklingsverktyg. Den inbäddade utvecklarens verktyg är dock annorlunda i och med att de körs vanligtvis på en plattform och samtidigt byggs applikationer för en annan. Det är därför dessa verktyg ofta kallas plattformsoberoende utvecklingsverktyg, eller kors utvecklingsverktyg. För att välja rätt inställning för verktygskedjan behöver vi studera hårdvaran för målmaskinen. Kors utvecklingverktyget tillverkas av binutils, glibc och GCC för kärnan som körs på target. 2. Redovisa. Skapa ett fungerande Linux Cross Toolchain genom att bygga en kärna för target. Skriv en detaljerad Resultatrapport hur du har gjort din Linux Cross Toolchain. Redovisa någon av följande nivåer. 3. Du har byggt den själv! 2. Har byggt den med hjälp av Buildroot 1. Tagit en färdigutvecklad Linux Cross Toolchain 3. Workspace Under utveckling av och anpassning till programvaran för ditt målsystem, kommer du att behöva organisera olika mjukvarupaket och komponenter i projekt i ett omfattande och lättanvänd katalogstruktur. Placeringen av ditt projekts workspace är upp till dig, men jag rekommenderar att du använder en post i katalogen / home. Varje styrsystemskomponent har en separat post i min hemkatalog. Tabell 4-1. Föreslagna projektet katalogstruktur build-tools debug doc images kernel project rootfs sysapps tmp tools
Verktygskedjan måste vi sätta ihop för att korsutveckla applikationer för vilket target som helst, ingår binutils, såsom ld, gas, och ar, C-kompilatorn och C- biblioteket, glibc, eglibc eller uclibc.
4. Komponentversioner Det första steget i att bygga verktygskedjan är att välja den komponentversioner som vi kommer att använda. Detta innebär att välja en binutils-version, en gcc version och en glibc/eglibc version för target kernel. Eftersom dessa paket underhålls och godkänts oberoende av varandra, kommer inte alla versioner av ett paket, att bygga på rätt sätt, när den kombineras med olika versioner av andra paket. Du kan försöka använda de senaste versionerna av varje paket, men denna kombination är inte garanterat att det heller fungerar. Ett förslag är att använda de versioner som Buildroot använder för att bygga sin verktygskedja. 5. Byggkrav Att bygga en plattformsoberoende verktygskedjan behöver du ett fungerande verktygskedjan på din host. Du behöver också en giltig uppsättning kernel-headers för din host. Dessa headers finns oftast i / usr / include / linux, / usr / include / asm, och / usr / include / asmgeneric katalogen, och är de headers som bör används för att kompilera target glibc installerat på din datorn. I äldre distributioner, och i vissa installationer är dessa kataloger är egentligen symboliska länkar till kataloger i / usr / src / linux katalogen. 6. Byggöversikt. Med rätta verktyg på plats. Låt oss ta en titt på det förfarande som används för att bygga verktygskedjan. Dessa är de fem huvudsakliga stegen: l. Kernel headers installeras 2. Binutils installeras 3. Bootstrap kompilatorn installeras 4. C-biblioteket setup (bygga glibc och uclibc, använd en) 4. C-biblioteket setup (bygga glibc och uclibc, använd en) 5. Fullständig kompilator installeras De flesta steg i att bygga verktygskedjor innebär att följande åtgärder utföres: l. Packa upp paketet. 2. Konfigurera paket för plattformsoberoende utveckling. 3. Bygg paketet. 4. Installera paketet.
7. Workspace inställning För detta ändamål behöver vi definiera några fler miljövariabler. De underlätta byggprocessen och baseras på de miljövariabler som redan definierats. Med samma exempelprojekt som tidigare. Här är den nya develdaq skriptet med de nya variablerna: export PROJECT=daq-module export PRJROOT=/home/karim/control-project/${PROJECT} export TARGET=i386-linux export PREFIX=${PRJROOT}/tools export TARGET_PREFIX= ${PREFIX}/${TARGET} export PATH=${PREFIX}/bin:${PATH} cd $PRJROOT För köra det här skriptet $./Develdaq 8. Förbered för att bygga verktygen. Men först måste vi skapa de kataloger som kommer att innehålla paketen medans de byggs. Skapa en katalog för var och en av verktygskedjans komponenter. $ cd ${PRJROOT}/build-tools $ mkdir build-binutils build-boot-gcc build-glibc build-gcc Först och främst kommer varje packet med sin egen dokumentation. En hel del färdiga plattformsoberoende vektygskedjor finns antingen online eller kommersiellt. Eftersom jag inte känner till själva processen, genom vilken varje byggdes, jag kan inte erbjuda några råd om dessa paket. 9. Kernel Headers Installationsprogrammet av kärnans headers är det första steget i uppbyggnaden av verktygskedjan. $ tar xvzf linux-2.4.18.tar.gz eller $ tar xvjf linux-2.4.18.tar.bz2 $ cd linux-2.4.18 $ make ARCH=i386 CROSS_COMPILE=i386-linux- menuconfig Vi kan nu skapa den omfattar katalogen som krävs för verktygskedjan och kopiera kernel headers till den. $ mkdir p ${TARGET_PREFIX}/include $ cp r include/linux/ ${TARGET_PREFIX}/include $ cp r include/asm-i386/ ${TARGET_PREFIX}/include/asm $ cp r include/asm-generic/ ${TARGET_PREFIX}/include
10. Binutils I binutils paketet ingår verktyg som oftast används för att manipulera binära objektfiler. $ cd $ {PRJROOT} / build-tools $ tar -xvzf binutils-2.10.1.tar.gz $ cd build-binutils $../binutils-2.10.1/configure - target = $ TARGET - prefix = $ {PREFIX} $ make $ make install $ ls $ {PREFIX} / bin 11. Bootstrap Compiler gcc-2.95.3 I detta skede kommer vi att bygga bootstrap-kompilatorn gcc-2.95.3, som bara kommer att stödja C-språket. $ cd ${PRJROOT}/build-tools $ tar xvzf gcc-2.95.3.tar.gz $ cd build-boot-gcc $../gcc-2.95.3/configure - target=$target -prefix=${prefix} \ > --without-headers -with-newlib -enable-languages=c $ make all-gcc $ make install-gcc 12. C Library för gcc 3.2 och högre Glibc-paketet består av ett antal bibliotek och är den känsligaste och längsta package build i våra krossplattforms verktygskedja. Det är en extremt viktig programvarukomponent som de flesta, om inte alla, program som finns eller är under utveckling för ditt target är beroende av. $ cd ${PRJROOT}/build-tools $ tar xvzf glibc-2.3.1.tar.gz $ tar xvzf glibc-linuxthreads-2.3.1.tar.gz -directory=glibc-2.3.1 $ mkdir build-glibc header $ cd build-glibc-headers $../glibc-2.3.1/configure -host=$target -prefix= /usr \ > --enable-add-ons -with-headers=${target_prepix}/include $ make cross-compilings=yes install_root=${target_prefix} \ > prefix= install-headers Därefter skapar vi en dummy stubs.h fil som behövs för att gcc skall gå att bygga. $ mkdir p ${TARGET_PREFIX>/include/gnu $ touch ${TARGET_PREFIX}/include/gnu/stubs.h
Slutligen kan vi bygga bootstrap gcc-kompilatorn. $ cd ${PRJROOT>/build-tools/build-boot-gcc $../gcc-3.2.1/configure -target=$target -prefix=${prefix} \ > --disable-shared -with-headers=${target_prefix}/include \ > --with-newlib -enable-languages=c $ make all-gcc Med konfigureringsskriptet gjort, kan vi nu bygga glibc och installera det: $ cd ${PRJROOT}/build-tools/build-glibc $ make $ make cross-compiling=yes install_root=${target_prefix} \ > prefix= install 13. Full Kompilering Vi är nu redo att installera den fullständiga kompilatorn för din målgrupp med både C och C + +-stöd. $ cd ${PRJROOT}/build-tools/build-gcc $../gcc-2.95.3/configure - target=$target -prefix=${prefix} \ > --enable-languages=c,c++ $ make all $ make install 14. Setup verktygskedjan En kopia av några av host utilities utan det till target kopplade namnet har installerats i ${PREFIX}/$ TARGET}/bin katalogen. Eftersom denna katalog nu innehåller riktade binärfiler som installeras av C-biblioteket byggprocess föreslår jag starkt att du flyttar host binärer från denna katalog och in en annan katalog mer lämpade för host binärerna. $ cd ${PREFIX}/${TARGET}/bin $ file as ar gcc ld nm ranlib strip $ i386-linux-gcc print-search-dirs $ mv as ar gcc ld nm ranlib strip \ > ${PREFIX}/lib/gcc-lib/i386-linux/2.95.3 Följande skript utför länkningen: $ for file in as ar gcc ld nm ranlib strip > do > ln s ${PREFIX}/lib/gcc-lib/i386-linux/2.95.3/$file > done
15. Att använda en Toolchain Du har nu en fullt fungerande gränsöverskridande verktygskedja. Följande är en Makefile för att kontrollera demonen på DAQ-modul som ger ett bra exempel på den gränsöverskridande verktygskedjan användning: # Tool names CROSS COMPILE = ${TARGET}- AS = $(CROSS_COMPILE)as AR = $(CROSS_COMPILE)ar CC = $(CROSS_COMPILE)gcc CPP = $(CC) E LD = $(CROSS_COMPILE)ld NM = $(CROSS_COMPILE)nm OBJCOPY = $(CROSS_COMPILE)objcopy OBJDUMP = $(CROSS-COMPILE)objdump RANLIB = $(CROSS_COMPILE)ranlib READELF = $(CROSS COMPILE)readelf SIZE = $(CROSS COMPILE)size STRINGS = $(CROSS_COMPILE)strings STRIP = $(CROSS COMPILE)strip export AS AR CC CPP LD NM OBJCOPY OBJDUMP RANLIB READELF SIZE \ > STRINGS STRIP # Build settings CFLAGS = -O2 Wall HEADER OPS = LDFLAGS = # Installation variables EXEC_NAME = command-daemon INSTALL = install INSTALL_DIR = ${PRJROOT}/rootfs/bin # Files needed for the build OBJS =daemon.o # Make rules all: daemon.c.o: $(CC) $(CFLAGS) $(HEADER_OPS) c $< daemon: ${OBJS} $(CC) o $(EXEC_NAME) ${OBJS} $(LDFLAGS) install: daemon test d $(INSTALL_DIR) $(INSTALL) d m 755 $(INSTALL_DIR) (INSTALL) m 755 $(EXEC_NAME) $(INSTALL_DIR) clean: rm f *.o $(EXEC_NAME) core distclean: rm f *~ rm f *.o $(EXEC_NAME) core
16. C Library alternativ Med tanke på de restriktioner och begränsningar för inbyggda system, så innebär storleken på standard GNU C-biblioteket en osannolik kandidat för användning på vårt target. Istället måste vi leta efter en C-bibliotek som kommer att ha tillräckligt med funktionalitet och samtidigt vara relativt liten, uclibc/eglibc $ cd ${PRJROOT}/build-tools/uClibc-0.9.16 $ make CROSS=i386-linux- menuconfig Den viktigaste konfigurationsmenyn innehåller följande undermenyer: Target Architecture Features and Options General Library Settings Networking Support String and Stdio Support Library Installation Options uclibc hacking options Med uclibc nu konfigurerad kan vi kompilera den: $ make CROSS=i386-linux- Med bygget nu avslutad, kan vi installera uclibc: $ make CROSS=i386-linux- PREFIX= install Det första steget i att använda dessa verktyg är att ändra vår PATH: $ export PATH=${PREFIX}/uclibc/bin:${PATH) Med samma Makefile som tidigare, kan vi kompilera kontrollen för demonen som följer: $ make CROSS_COMPILE=i386-uclibc- $ make CROSS COMPILE=i386-uclibc- LDFLAGS= -static "Hello World!", För glibc, är mindre än 12 kb i storlek när de länkas dynamiskt och runt 350 KB när den är statiskt länkade och avskalad. Samma "Hello World!" Är bara 2 kb i storlek om den dynamiskt länkas till uclibc och 18 KB när de är statiskt länkade med det. Detta är en stor skillnad