Heterogeniteit van computeromgevingen via kruiscompilatie

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 1Verschil 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. 

Shell

 

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:

  1. 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

     

    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.
  2. 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 en tar-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.

Shell

 

Volg de compilatiestappen die zijn gegeven in het README-bestand van de bibliotheek. Stel daarnaast de onderstaande parameters in tijdens de bouwprocedurestappen:

  1. Stel het --host parameter in bij het uitvoeren van het ./configure script.
    Shell

    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.
  2. Bij het gebruik van “make install” voor het bouwen van afhankelijke bibliotheken, stel DESTDIR in op de toolchain sysroot-directory.
    Shell

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