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
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
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/development/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
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/svn/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/development/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
|