GNAT-15.2.0

Om GNAT

Ada er et moderne programmeringsspråk designet for store, langlevende applikasjoner—og innebygde systemer spesielt—der pålitelighet og effektivitet er avgjørende. Den har et sett unike tekniske funksjoner som gjør den svært effektiv for bruk i store, komplekse og sikkerhetskritiske prosjekter.

Kompilatoren og tilhørende verktøy på denne siden er kjent som GNAT teknologien, utviklet av Adacore selskapet, ved hjelp av GCC bakstykke.

Nå til dags er det ikke mange pakker som bruker dette språket, men hvis du kommer over en pakke som bruker det, vil denne pakken aktivere støtte.

Ytterligere Nedlastinger

Hvis du ikke allerede har bygget eller lastet ned GNAT verktøy, er denne nedlastingen nødvendig ettersom GNAT er skrevet i Ada.

GNAT Avhengigheter

Valgfri

GDB, Graphviz (Noen tester bruker det hvis det er installert; merk at hvis det er installert, men ikke bygget med libpng, disse testene vil mislykkes), og Valgrind (for tester)

[Notat]

Notat

Dette kan ta litt tid å bygge. Gjør gjerne noe annet mens dette bygges.

Installasjon av GNAT Binærer

Siden GNAT er skrevet i Ada, må Ada verktøy være på systemet for å kunne bygge GNAT. Hvis du allerede har bygget slike verktøy eller har binærfilene på systemet ditt, kan du hoppe til neste avsnitt.

Installer GNAT binærfilene ved å kjøre følgende kommandoer som root brukeren mens den fortsatt er i mappen der tarballen er:

tar -xf gnat-x86_64-linux-15.1.0-2.tar.gz -C /opt &&
ln  -sv gnat-x86_64-linux-15.1.0-2 /opt/gnat      &&
chown -R root:root /opt/gnat

Juster nå PATH variabelen slik at GNAT programvaren kan finnes og brukes:

PATH_HOLD=$PATH &&
export PATH=/opt/gnat/bin:$PATH_HOLD

Forsikre at ld og as fra GNAT pakken ikke brukes for å forhindre problemer med aldring ved å utstede følgende som root bruker:

find /opt/gnat/bin -name ld -exec mv -v {} {}.old \; &&
find /opt/gnat/bin -name as -exec mv -v {} {}.old \;

Installasjon av GNAT

[Viktig]

Viktig

Selv om du bare spesifiserer andre språk enn Ada, C og C++ i ./configure-kommandoen nedenfor, vil installasjonsprosessen overskrive dine eksisterende GCC C og C++ kompilatorer og biblioteker. Det anbefales å kjøre hele pakken med tester.

Ikke fortsett med make install kommandoen til du er sikker på at byggingen var vellykket. Du kan sammenligne testresultatene dine med de som finnes på https://gcc.gnu.org/ml/gcc-testresults/. Du kan også se informasjonen i GCC delen av kapittel 8 i LFS boken (https://www.lfs.freding.no/lfs/view/systemd/chapter08/gcc.html).

Instruksjonene nedenfor utfører med vilje en «bootstrap» process. Bootstrapping is needed for robustness and is highly recommended når du oppgraderer kompilatorversjonen. For å deaktivere bootstrap likevel, legg til --disable-bootstrap til ../configure alternativene nedenfor.

Først må du sørge for at riktig bibliotekmappe brukes på x86_64:

case $(uname -m) in
  x86_64)
    sed -e '/m64=/s/lib64/lib/' \
        -i.orig gcc/config/i386/t-linux64
  ;;
esac

Opprett byggemappen og sjekk for støtte for multilib:

mkdir build &&
cd    build &&

if [[ $(uname -m) == "x86_64" ]]; then
    echo "int main(){}" > dummy.c &&

# cc is used here as the GNAT binaries don't have multilib support,
# but cc is not supplied in the distribution, meaning the system-installed
# C compiler will be used for this process. If cc is not linked to gcc,
# then use /usr/bin/gcc instead of cc.

    if $(cc -m32 dummy.c &> /dev/null); then
        MULTILIB="--enable-multilib"
        MULTILIB_FLAGS="--with-multilib-list=m64,m32"
        # This makes -mstackrealign the default for 32-bit objects
        sed '/STACK_REALIGN_DEFAULT/s/0/(!TARGET_64BIT \&\& TARGET_SSE)/' \
              -i ../gcc/config/i386/i386.h
        if $(cc -mx32 dummy.c &> /dev/null); then
            MULTILIB_FLAGS+=",mx32"
        fi
    elif $(cc -mx32 dummy.c &> /dev/null); then
        MULTILIB="--enable-multilib"
        MULTILIB_FLAGS="--with-multilib-list=m64,mx32"
    else
        MULTILIB="--disable-multilib"
    fi
    rm -v dummy.c
else
    MULTILIB="--disable-multilib"
fi

Nå installer GNAT ved å kjøre følgende kommandoer:

../configure                  \
    --prefix=/usr             \
    $(echo "$MULTILIB")       \
    $(echo "$MULTILIB_FLAGS") \
    --with-system-zlib        \
    --enable-default-pie      \
    --enable-default-ssp      \
    --disable-fixincludes     \
    --enable-languages=ada,c,c++  &&
    unset MULTILIB MULTILIB_FLAGS &&

make
[Notat]

Notat

Når du rekompilerer GCC, må du huske å inkludere ada i --enable-languages= parameter, ellers vil du miste Ada støtte og må installere GNAT binærfilene på nytt.

Hvis du kjører tester, som i LFS, fjern/rett flere kjente testfeil:

sed -e '/cpython/d'               -i ../gcc/testsuite/gcc.dg/plugin/plugin.exp &&
sed -e 's/no-pic /&-no-pie /'     -i ../gcc/testsuite/gcc.target/i386/pr113689-1.c &&
sed -e 's/300000/(1|300000)/'     -i ../libgomp/testsuite/libgomp.c-c++-common/pr109062.c &&
sed -e 's/{ target nonpic } //' \
    -e '/GOTPCREL/d'              -i ../gcc/testsuite/gcc.target/i386/fentryname3.c

Hvis du har installert tilleggspakker som valgrind og gdb, vil GCC delen av testpakken kjøre flere tester enn i LFS. Noen av disse vil rapportere FAIL og andre XPASS (består når det forventes å FAIL). Fra og med GCC-15.2.0, Omtrent 74 FEIL oppstår i «guality» pakken, samt diverse feil i resten av testpakken. Hvis alle kompilatorene ovenfor bygges, vil det være litt over 110 uventede feil av over 617 000 tester. For å kjøre testene, utfør følgende:

ulimit -s 32768 &&
make -k check

Testene er svært lange, og resultatene kan være vanskelige å finne i loggene, spesielt hvis du bruker parallelle jobber med make. Du kan få et sammendrag av testene med:

../contrib/test_summary

Nå, som root bruker:

make install                                               &&
mkdir -pv /usr/share/gdb/auto-load/usr/lib                 &&
mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib    &&

chown -v -R root:root \
    /usr/lib/gcc/*linux-gnu/15.2.0/include{,-fixed} \
    /usr/lib/gcc/*linux-gnu/15.2.0/ada{lib,include} &&

ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/15.2.0/liblto_plugin.so \
        /usr/lib/bfd-plugins/

Opprydding og testing

Nå som GNAT er installert, er det på tide å rydde opp og teste installasjonen for å forsikre deg om at alt fungerer som forventet.

Hvis du lastet ned GNAT binærfilene, fjern dem som root bruker:

rm -rf /opt/gnat*

Hvis du lastet ned GNAT binærfilene, gjenopprett PATH variabelen til hva den var tidligere:

export PATH=$PATH_HOLD &&
unset PATH_HOLD

Nå er det på tide å teste installasjonen. Bekreft først at C og C++ kompilatorene fungerer som de skal:

echo "int main(){}" > main.c &&
cp -v main.c main.cpp &&
gcc main.c            &&
./a.out               &&

rm -v a.out           &&
g++ main.cpp          &&
./a.out               &&

rm -v a.out main.{c,cpp}

Hvis du har støtte for 32-bits multilib:

echo "int main(){}" > main.c &&
cp -v main.c main.cpp &&
gcc -m32 main.c       &&
./a.out               &&

rm -v a.out           &&
g++ -m32 main.cpp     &&
./a.out               &&

rm -v a.out main.{c,cpp}

Hvis du har støtte for x32-bit multilib:

echo "int main(){}" > main.c &&
cp -v main.c main.cpp &&
gcc -mx32 main.c      &&
./a.out               &&

rm -v a.out           &&
g++ -mx32 main.cpp    &&
./a.out               &&

rm -v a.out main.{c,cpp}

Og til slutt, test GNAT kompilatoren:

cat > testgnat.adb << "EOF" &&
with Ada.Text_IO; use Ada.Text_IO;
procedure Testgnat is
begin
   Put_Line("Success!");
end Testgnat;
EOF

gnatmake testgnat.adb &&
./testgnat            &&

rm -v testgnat*

Kommandoene ovenfor skal ikke ha noen feil, ellers gikk det noe galt med installasjonen.

Parameterforklaringer

mkdir build; cd build: GCC dokumentasjonen anbefaler at pakken bygges i en dedikert byggemappe.

if [[ $(uname -m) == "x86_64" ]]; then...: Disse kommandoene sjekker om det er støtte for flere biblioteker.

$(echo "$MULTILIB{,_FLAGS}"): Disse kommandoene sender resultatene fra kommandoene som er forklart ovenfor som parametere til ../configure for å tillate automatisering av det som må settes for støtte for flere biblioteker hvis aktuelt.

--with-system-zlib: Bruker systemet zlib i stedet for det medfølgende språket. zlib brukes til å komprimere og dekomprimere GCCs mellomliggende språk i LTO objektfiler (Link Time Optimization).

--enable-default-pie: Gjør -fpie standardalternativet når programmer kompileres. Sammen med ASLR funksjonen aktivert i kjernen, dette bekjemper noen typer angrep basert på kjente minneoppsett.

--enable-default-ssp: Gjør -fstack-protector-strong standardalternativet når programmer kompileres. SSP er en teknikk som forhindrer endring av programflyten ved å ødelegge parameterstakken.

--enable-languages=ada,c,c++: Denne kommandoen bygger støtte for Ada, C og C++. Se https://lfs.freding.no/blfs/view/systemd/general/gcc.html for å finne ut hvilke andre språk som støttes. Sørg for å legge til ada til alternativet hvis du rekompilerer GCC.

ulimit -s 32768: Denne kommandoen hindrer at flere tester går tom for stabelplass.

make -k check: Denne kommandoen kjører testpakken uten å stoppe hvis det oppstår feil.

../contrib/test_summary: Denne kommandoen vil produsere et sammendrag av resultatene fra testpakken. Du kan legge til | grep -A7 Summ til kommandoen for å produsere en enda mer kondensert versjon av sammendraget. Du kan også omdirigere resultatet til en fil for gjennomgang og sammenligning senere.

mv -v /usr/lib/*gdb.py ...: Installasjonsfasen plasserer noen filer som brukes av gdb under /usr/lib mappen. Dette genererer falske feilmeldinger når du utfører ldconfig. Denne kommandoen flytter filene til et annet sted.

chown -v -R root:root /usr/lib/gcc/*linux-gnu/...: Hvis pakken er bygget av en annen bruker enn root, vil eierskapet til den installerte include mappen (og innholdet) vil være feil. Denne kommandoen endrer eierskapet til root bruker og gruppe.

Innhold

Installerte Programmer: gnat, gnatbind, gnatchop, gnatclean, gnatkr, gnatlink, gnatls, gnatmake, gnatname, og gnatprep
Installerte Biblioteker: libgnarl og libgnat i /usr/lib/gcc/<arch-triplet>/15.2.0/adalib
Installerte Mapper: /usr/lib/gcc/<arch-triplet>/15.2.0/ada{include,lib} og /usr/lib/gcc/<arch-triplet>/15.2.0/plugin/include/ada

Bare de Ada spesifikke filene er oppført her. Andre finner du på https://www.lfs.freding.no/lfs/view/systemd/chapter08/gcc.html#contents-gcc slik de opprinnelig ble installert under byggingen av LFS.

Korte Beskrivelser

gnat

er en innpakning som aksepterer en rekke kommandoer og kaller det tilsvarende verktøyet fra listen nedenfor

gnatbind

brukes til å binde kompilerte objekter

gnatchop

er nyttig for å gi filer nytt navn for å oppfylle standard Ada standard filnavngivningskonvensjoner

gnatclean

brukes til å fjerne filer tilknyttet et GNAT prosjekt

gnatkr

brukes til å bestemme det pakkenavnet for en gitt fil, når den pakkes til en spesifisert maksimal lengde

gnatlink

brukes til å koble sammen programmer og bygge en kjørbar fil

gnatls

er den kompilerte enhetsleseren

gnatmake

er Ada kompilatoren, som utfører kompilering, binding og lenking

gnatname

vil liste opp filene som er tilknyttet et GNAT prosjekt

gnatprep

er den eksterne forprosessoren for GNAT