5.10.1. Instalarea GCC
Prima noastră versiune de GCC a instalat câteva antete interne de sistem. În mod normal, unul dintre ei, limite.h, va include la rândul său sistemul corespunzător limite.h antet, în acest caz, /tools/include/limits.h. Cu toate acestea, la momentul primei versiuni a gcc /tools/include/limits.h nu a existat, așa că antetul intern pe care GCC l-a instalat este un fișier parțial, autonom și nu include caracteristicile extinse ale antetului de sistem. Acest lucru a fost adecvat pentru construirea libc-ului temporar, dar această versiune a GCC necesită acum antetul intern complet. Creați o versiune completă a antetului intern folosind o comandă care este identică cu ceea ce face sistemul de compilare GCC în circumstanțe normale:
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
`dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h
cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
`dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include-fixed/limits.h
în gcc/config/{linux,i386/linux{,64}}.h
în gcc/config/{linux,i386/linux{,64}}.h
$file{,.orig} 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
's@/usr@/tools@g' $fișier.orig > $fișier
$file{,.orig} 's@/lib\(64\)\?\(32\)\?/ld@/tools&@g' \
's@/usr@/tools@g' $fișier.orig > $fișier
Încă o dată, schimbați locația linkerului dinamic implicit al GCC pentru a-l folosi pe cel instalat /instrumente.
pentru dosar do
cp -uv sed -e
-e
pentru dosar do
cp -uv sed -e
-e
ecou'
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 „/tools/lib/”
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file atinge $file.orig
făcut
ecou'
#undef STANDARD_STARTFILE_PREFIX_1
#undef STANDARD_STARTFILE_PREFIX_2
#define STANDARD_STARTFILE_PREFIX_1 „/tools/lib/”
#define STANDARD_STARTFILE_PREFIX_2 ""' >> $file atinge $file.orig
făcut
Dacă construiți pe x86_64, schimbați numele de director implicit pentru bibliotecile pe 64 de biți în „lib”:
caz $(uname -m) în x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
ESAC
caz $(uname -m) în x86_64)
sed -e '/m64=/s/lib64/lib/' \
-i.orig gcc/config/i386/t-linux64
;;
ESAC
Ca și în prima versiune a GCC, necesită pachetele GMP, MPFR și MPC. Despachetați fișierele tar și mutați-le în numele directorului necesare:
tar -xf ../mpfr-4.0.2.tar.xz mv -v mpfr-4.0.2 mpfr
tar -xf ../gmp-6.1.2.tar.xz mv -v gmp-6.1.2 gmp
tar -xf ../mpc-1.1.0.tar.gz mv -v mpc-1.1.0 mpc
tar -xf ../mpfr-4.0.2.tar.xz mv -v mpfr-4.0.2 mpfr
tar -xf ../gmp-6.1.2.tar.xz mv -v gmp-6.1.2 gmp
tar -xf ../mpc-1.1.0.tar.gz mv -v mpc-1.1.0 mpc
Creați din nou un director de compilare separat:
mkdir -v build cd build
mkdir -v build cd build
Înainte de a începe să construiți GCC, nu uitați să anulați toate variabilele de mediu care suprascriu semnalizatoarele implicite de optimizare. Acum pregătiți GCC pentru compilare:
CC=$LFS_TGT-gcc \
CXX=$LFS_TGT-g++ \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../configurează \
--prefix=/instrumente \
--with-local-prefix=/tools \
--with-native-system-header-dir=/tools/include \
--enable-languages=c,c++ \
--disable-libstdcxx-pch \
--disable-multilib \
--disable-bootstrap \
--disable-libgomp
CC=$LFS_TGT-gcc \
CXX=$LFS_TGT-g++ \
AR=$LFS_TGT-ar \
RANLIB=$LFS_TGT-ranlib \
../configurează \
--prefix=/instrumente \
--with-local-prefix=/tools \
--with-native-system-header-dir=/tools/include \
--enable-languages=c,c++ \
--disable-libstdcxx-pch \
--disable-multilib \
--disable-bootstrap \
--disable-libgomp
Semnificația noilor opțiuni de configurare:
--enable-languages=c,c++
Această opțiune asigură că atât compilatoarele C, cât și C++ sunt construite.
--disable-libstdcxx-pch
Nu construiți antetul precompilat (PCH) pentru libstdc++. Ocupă mult spațiu și nu ne folosește.
--disable-bootstrap
Pentru versiunile native ale GCC, implicit este să faceți o construcție „bootstrap”. Acest lucru nu doar compila GCC, ci îl compilează de mai multe ori. Folosește programele compilate într-o primă rundă pentru a se compila a doua oară și apoi din nou a treia oară. A doua și a treia iterație sunt comparate pentru a vă asigura că se poate reproduce perfect. Acest lucru implică, de asemenea, că a fost compilat corect. Cu toate acestea, metoda de compilare LFS ar trebui să ofere un compilator solid, fără a fi nevoie să bootstrap de fiecare dată.
Compilați pachetul:
face
face
Instalează pachetul:
make install
make install
Ca atingere finală, creați un link simbolic. Multe programe și scripturi rulează cc în loc de gcc, care este folosit pentru a menține programele generice și, prin urmare, utilizabile pe toate tipurile de sisteme UNIX în care compilatorul GNU C nu este întotdeauna instalat. Alergare cc lasă administratorului de sistem liber să decidă ce compilator C să instaleze:
ln -sv gcc /tools/bin/cc
ln -sv gcc /tools/bin/cc
Prudență
În acest moment, este imperativ să opriți și să vă asigurați că funcțiile de bază (compilarea și legarea) ale noului lanț de instrumente funcționează conform așteptărilor. Pentru a efectua o verificare a sensului, rulați următoarele comenzi:
echo 'int main(){}' > dummy.c cc dummy.c
readelf -l a.out | grep ': /tools'
echo 'int main(){}' > dummy.c cc dummy.c
readelf -l a.out | grep ': /tools'
Dacă totul funcționează corect, nu ar trebui să existe erori, iar rezultatul ultimei comenzi va fi de forma:
[Se solicită interpretul de program: /tools/lib64/ld-linux-x86-64.so.2]
[Se solicită interpretul de program: /tools/lib64/ld-linux-x86-64.so.2]
Rețineți că linkerul dinamic va fi /tools/lib/ld-linux.so.2 pentru mașinile pe 32 de biți.
Dacă rezultatul nu este afișat ca mai sus sau nu a existat deloc ieșire, atunci ceva nu este în regulă. Investigați și reveniți pe pașii pentru a afla unde este problema și remediați-o. Această problemă trebuie rezolvată înainte de a continua. Mai întâi, efectuați din nou verificarea de sănătate, folosind gcc în loc de cc. Dacă acest lucru funcționează, atunci /tools/bin/ cc lipsește linkul simbolic. Instalați linkul simbolic ca mai sus. Apoi, asigurați-vă că PATH este corect. Acest lucru poate fi verificat rulând ecou $ PATH și verificând asta /tools/bin se află în fruntea listei. Dacă PATH este greșit, ar putea însemna că nu sunteți autentificat ca utilizator lfs sau că ceva a mers prost în secțiunea 4.4, „Configurarea mediului”.
Odată ce totul este bine, curățați fișierele de testare:
rm -v dummy.c a.out
rm -v dummy.c a.out