Met de opkomst van open-source software en de acceptatie van deze oplossingen bij het creëren van complexe systemen, wordt het vermogen om applicaties te ontwikkelen die naadloos kunnen draaien op meerdere hardwareplatforms inherent belangrijk. Er is een constante behoefte om de software te ontwikkelen op één architectuur, maar de mogelijkheid te hebben om deze uit te voeren op andere doelarchitecturen. Een veelgebruikte techniek om dit te bereiken is het cross-compileren van de applicatie voor de doelarchitectuur.
Cross-compilatieis significant in embedded systems where the intent is to run applications on specialized hardware like ARM and PowerPC boards. These systems are resource-constrained and hence a direct compilation is not an option. Daarom zullen ontwikkelaars gebruikmaken van de gangbare x86-architectuur als host en toolchains specificeren voor de doelhardware, waardoor binaries compatibel zijn met de doelhardware.
Deze handleiding behandelt een dergelijke casestudy waarbij cross-compilatie van een open-source pakket werd uitgevoerd voor PowerPC. Het artikel zal de details van de gebruikte tools en toolchains behandelen, evenals een stapsgewijze tutorial over hoe cross-compilatie werd bereikt voor deze architectuur.
The Probleemstelling
Gegeven een doelbord met PowerPC-architectuur, was de bedoeling om L3-routeringmogelijkheden aan dit bord toe te voegen. Voor dit doel werd een populaire open-source routeringsprotocolsuite, FRRouting (FRR), overwogen.
FRR is een protocolsuite die het mogelijk maakt dat elke Linux machine zich gedraagt als een volwaardige router. Het is verpakt voor amd64, arm64, armhf, en i386 maar niet voor PowerPC. Dit vereiste de cross-compilatie van FRR.
Build host | target host | |
---|---|---|
CPU Architectuur |
x86_64 |
Powerpc(32-bit) |
Besturingssysteem |
Ubuntu 18.4 |
QorIQ SDK |
CPU |
12 |
2 (e5500) |
RAM |
12GB |
1GB |
Tabel 1. Verschil in bouw- en doelplatform
De Kruiscompilatietocht
Er zijn twee belangrijke stadia in cross-compilatie:
Configureren van de Buildomgeving en Pre-gecompileerde Toolchain
1. Installeer de vereiste buildtools in de omgeving. Veelvoorkomende buildtools zijn autoconf, make, cmake, build-essentials, pkg-config, libtool, enz.
2. Stel de pre-gecompileerde toolchain in die specifiek is voor de doelhostomgeving. CPU/Board-leveranciers bieden hun eigen architectuur-specifieke toolchains. De toolchain die specifiek is voor het doelbord is verkregen van de productwebsite van de leverancier.
3. De toolchain wordt geleverd met een omgevingsbestand, dat wordt gebruikt om de omgevingsvariabelen zoals CC, GCC, PKG_CONFIG_PATH, enz. in te stellen, die nodig zijn voor cross-compilatie. Bewerk het omgevingsbestand /opt/fsl-qoriq/2.0/environment-setup-ppce5500-fsl-linux
en werk het pad van variabelen bij met betrekking tot het pad van de toolchain-directory.
export SDKTARGETSYSROOT=/opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux
export PATH=/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/../x86_64-fslsdk-linux/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-uclibc:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-musl:$PATH
export CCACHE_PATH=/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/../x86_64-fslsdk-linux/bin:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-uclibc:/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr/bin/powerpc-fsl-linux-musl:$CCACHE_PATH
export PKG_CONFIG_SYSROOT_DIR=$SDKTARGETSYSROOT
export PKG_CONFIG_PATH=$SDKTARGETSYSROOT/usr/lib/pkgconfig
export CONFIG_SITE=/opt/fsl-qoriq/2.0/site-config-ppce5500-fsl-linux
export PYTHONHOME=/opt/fsl-qoriq/2.0/sysroots/x86_64-fslsdk-linux/usr unset command_not_found_handle
export CC="powerpc-fsl-linux-gcc -m32 -mhard-float -mcpu=e5500 --sysroot=$SDKTARGETSYSROOT"
export CXX="powerpc-fsl-linux-g++ -m32 -mhard-float -mcpu=e5500 --sysroot=$SDKTARGETSYSROOT"
export CPP="powerpc-fsl-linux-gcc -E -m32 -mhard-float -mcpu=e5500 --sysroot=$SDKTARGETSYSROOT"
export AS="powerpc-fsl-linux-as "
export LD="powerpc-fsl-linux-ld --sysroot=$SDKTARGETSYSROOT"
export GDB=powerpc-fsl-linux-gdb
export STRIP=powerpc-fsl-linux-strip
export RANLIB=powerpc-fsl-linux-ranlib
export OBJCOPY=powerpc-fsl-linux-objcopy
export OBJDUMP=powerpc-fsl-linux-objdump
export AR=powerpc-fsl-linux-ar
export NM=powerpc-fsl-linux-nm
export M4=m4
export TARGET_PREFIX=powerpc-fsl-linux-
export CONFIGURE_FLAGS="--target=powerpc-fsl-linux --host=powerpc-fsl-linux --build=x86_64-linux --with-libtool-sysroot=$SDKTARGETSYSROOT"
export CFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types"
export CXXFLAGS=" -O2 -pipe -g -feliminate-unused-debug-types"
export LDFLAGS="-Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed"
export CPPFLAGS=""
export KCFLAGS="--sysroot=$SDKTARGETSYSROOT"
export OECORE_DISTRO_VERSION="2.0"
export OECORE_SDK_VERSION="2.0"
export ARCH=powerpc
export CROSS_COMPILE=powerpc-fsl-linux-
Het Oplossen van Afhankelijkheden in een Vooraf Gecompileerde Toolchain
Elke software heeft zijn eigen set aan afhankelijkheden (tools/bibliotheken) die opgelost moeten worden vóór de cross-compilatie.
Afhankelijk van de beschikbaarheid van deze tools/bibliotheken in de doelarchitectuur, zijn er twee opties om ze op te lossen. Ofwel installeer je ze rechtstreeks vanuit beschikbare pakketten, ofwel compileer je ze ook cross vanuit de bron.
Specifiek voor de FRR-compilatie moeten de bibliotheken libpcre2, libyang, clippy, libelf en json-c vanuit de bron worden gebouwd. Naast deze bibliotheken waren protobuf en libcap bibliotheekpakketten beschikbaar voor PPC (PowerPC) arch, die direct in de toolchain kunnen worden geïnstalleerd.
1. Bibliotheken Installeren vanuit Pakketten
Bibliotheekpakketten die beschikbaar zijn voor de doelarchitectuur kunnen in de toolchain sysroot worden geïnstalleerd op twee manieren:
- De eerste manier maakt gebruik van de op Ubuntu/Debian gebaseerde
dpkg-deb
tool voor het rechtstreeks installeren van Debian-pakketten zoals hieronder vermeld:Shell$ dpkg-deb -x <pkg_name>.deb <toolchain_directory_path>
#Voorbeeld van libcap:
$ wget http://launchpadlibrarian.net/222364908/libcap-dev_2.24-12_powerpc.deb
$ dpkg-deb -x libcap-dev_2.24-12_powerpc.deb /opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux/
Opmerking:
- Download alle afhankelijkheidspakketten en installeer ze in volgorde.
- Bibliotheekpakketten kunnen in een andere mapstructuur worden geïnstalleerd. Kopieer die bibliotheekbestanden naar de juiste mappen volgens de toolchain.
- Op de tweede manier worden debian/rpm-pakketten geëxtraheerd en handmatig geplaatst in de gereedschapsmap zoals hieronder vermeld:
Voor het extraheren van een debian-pakket, gebruik de
ar
entar
-tools zoals hieronder vermeld:Opmerking: Deze methode is handig voor systemen zonder ondersteuning voor
dpkg-deb
.Voor het extraheren van een rpm-pakket, gebruik de
rpm2cpio
-tool met het volgende commando:Pakketextractie en bestandsplaatsing met libcap-voorbeeld:
# Controleer of de pakketten/bibliotheken succesvol zijn geïnstalleerd door het volgende commando uit te voeren:
Opmerking
: Installeer
pkg-config
indien nog niet geïnstalleerd.
2. Cross-Compiling Bibliotheken
Bibliotheekpakketten zijn niet beschikbaar voor de doelarchitectuur en worden gecompileerd vanuit de bron. Voordat je met de compilatie begint, laad je het omgevingsbestand dat is verpakt met de toolchain om alle noodzakelijke parameters in te stellen die vereist zijn voor cross-compilatie.
$ source <env_file_path>
Volg de compilatiestappen die zijn gegeven in het README-bestand van de bibliotheek. Stel daarnaast de onderstaande parameters in tijdens de bouwprocedurestappen:
- Stel het
--host parameter
in bij het uitvoeren van het./configure
script.Shell$ ./configure --host=<target_host_parameter>
# Voorbeeld:
$ ./configure --host=powerpc-fsl-linux
Opmerking:
- <target_host_parameter> is het systeem waarvoor de bibliotheek/tool wordt gebouwd. Het kan worden gevonden in het omgevingsbestand van de toolchain. Het is een veelvoorkomend voorvoegsel dat wordt gevonden in $CC, $LD, enz.
- Er zullen twee soorten afhankelijke bibliotheken zijn. Een is alleen vereist voor het compilatieproces, en de andere is een afhankelijkheidsvereiste voor uitvoering op de doelhost. Stel het
--host parameter
dienovereenkomstig in.
- Bij het gebruik van “make install” voor het bouwen van afhankelijke bibliotheken, stel DESTDIR in op de toolchain sysroot-directory.
Shell
$ make DESTDIR=<toolchain_directory_path> install
Examlple:
$ make DESTDIR=/opt/fsl-qoriq/2.0/sysroots/ppce5500-fsl-linux/ install
Conclusie
De verschillen in systeemarchitecturen, bibliotheken, afhankelijkheden en toolchains maken cross-compilatie tot een complexe techniek om uit te voeren. Om de complexiteiten te verminderen, onthult dit artikel de fasen van cross-compilatie. FRR en PowerPC werden als voorbeelden genomen voor de gewenste software en de doelhardware, respectievelijk. De stappen die in dit artikel worden behandeld, bieden echter een redelijke strategie voor de cross-compilatie van software op een specifieke hardware. De omgevingsinstellingen, de toolchain en de afhankelijkheden zullen variëren op basis van de vereisten.
Source:
https://dzone.com/articles/heterogeneity-computing-environments-cross-compilation