BluePink BluePink
XHost
Gazduire site-uri web nelimitata ca spatiu si trafic lunar la doar 15 eur / an. Inregistrare domenii .ro .com .net .org .info .biz .com.ro .org.ro la preturi preferentiale. Pentru oferta detaliata accesati site-ul BluePink
Capitolul III

    Compilatorul GCC şi compilarea nucleului Linux

     Compilatorul GCC

Compilatorul GCC sau GNU Compiler Collection este unul din cele mai utilizate şi performante compilatoare pentru C/C++( în special C, pentru C++ folosindu-se des compilatorul G++). Şi aceasta aparţine colecţiei de software GNU, adică este un program open source. Este un compilator extensibil, deşi este dedicat pentru C totuşi are extesii şi pentru alte limbaje de programare cum ar fi: C++, Pascal, Fortran, Objective-C etc. Este un program open source cu toate acestea executabilele generate de acesta nu trebuie să fie neapărat open source, chiar dacă include librăriile standard C sau C++.

Prima versiune GCC îi aparţine lui Richard Stallman ( iniţiatorul proiectului GNU), şi este datată în anul 1986. Pe parcursul anilor au tot apărut versiuni din ce în ce mai evoluate, la început necesitând instalarea separată a compilatorului, mai apoi să fie incluse în distribuţiile GNU/LINUX ( în acest caz pentru doritori se poat face doar upragadarea la o versiune mai nouă a compilatorului GCC).

Sintaxa generală a compilatorului pentru apelarea acestuia este:

gcc opţiuni nume_fişier

Pentru C fişierele sursă au extensia .c. Pentru a compila un program nume.c, se executa comanda:

 gcc -o nume nume.c

Argumentul nume al opţiunii -o indică numele dat executabilului (de obicei, acelaşi nume de bază ca şi pentru sursă). Fără opţiunea -o, executabilul e denumit implicit a.out.

Un alt mod de a folosi opţiunea -o este:

gcc nume.c -o nume

Puţin ne vom ocupa în continuare de compilarea şi execuţia unui program C, pentru a înţelege cum putem sau cum mai putem folosi compilatorul gcc.

Deci ştiind care este comanda pentru compilare vom şi executa un program nume.c, şi anume:

gcc nume.c -o nume

./nume

 Prima comandă semnifică compilarea şi link-editarea (rezolvarea apelurilor de funcţii)  fişierului  sursă nume.c, generându-se un executabil al cărui  nume  este specificat  prin  opţiunea  -o. De fapt, se execută în mod transparent următoarea secvenţă de operaţii:

  • preprocesorul cpp expandează macrourile şi include fişierele header;
  • se generează cod obiect prin compilare;
  • editorul de legături ld rezolvă apelurile de funcţii şi creează executabilul.

Această secvenţă poate fi parcursă şi manual. Mai întâi, se execută preprocesarea (-E), generându-se fişierul intermediar nume.cpp:

gcc -E nume.c -o nume.cpp

Se generează un fişier obiect utilizând fişierul sursă anterior preprocesat:

gcc -x cpp-output -c nume.cpp -o nume.o

Fişierul obiect este link-editat şi se creează executabilul:

gcc nume.o -o nume

Opţiuni utile ale lui gcc:

 

-Iname

Fişierele .h sunt căutate şi în directorul numit name; implicit, fişierele .h sunt căutate în directorul curent şi în directoarele ce conţin headerele pentru librăriile standard (/usr/include şi /usr/include/sys).

-Lname

Librăriile sunt căutate şi în directorul numit name; implicit, librăriile sunt căutate în /lib şi /usr/lib.

-lname

Link-editează librăria cu numele libname

-static

Link-editează static o librărie

-D name

Definirea macroului numit name

-D name=valoare

Definirea macroului cu valoarea specificată de valoare

-U name

Anularea macroului numit name

-g

Include informaţii de depanare în fişierul-obiect generat

Pentru a putea compila programe cu funcţii matematice standard e nevoie de biblioteca libm. În acest caz, se foloseşte opţiunea -l urmată, fără spaţiu, de numele bibliotecii (fără prefixul lib folosit convenţional pentru toate bibliotecile) astfel:

gcc -lm -o nume nume.c

La compilare, e utilă generarea cât mai multor avertismente. Aceasta se specifică cu opţiunea -Wall (warnings: all).

Ar mai fi de spus în legătură cu utilizarea gcc ca şi compilator, numai că posibil intrând în mai multe detalii vom omite unele caracteristici care tot mai apar cu apariţia versiunilor mai noi de gcc (la ora actuală gcc se află undeva la versiunea 4.0.2, inclusă în distribuţia SuSE 10.0), aşa că soluţia cea mai bună este să parcurgem manualele versiunilor recente pentru a afla mai multe despre gcc.

În continuare vom aborda instalarea acestui compilator, folosindu-ne de comenzi generale care se utilizează sub toate sistemele de operare UNIX. De ce? Pentru că la ora acutală, în majoritatea distribuţiilor Linux vom găsi câte o versiune gcc, doar trebuie să o selectăm la instalarea pachetelor Linux. Însă dacă avem un sistem mai vechi şi avem Linux (o distribuţie mai veche) sau un alt sistem de operare UNIX pe ea,  este posibil să nu fie inclus gcc şi atunci va trebui să o instalăm manual.

Sus

     Instalarea GCC

Instalarea gcc se poate efectua în mai multe feluri, şi anume: instalare ca pachet separat sau instalare ca parte a unui pachet.

Instalarea ca pachet separat se poate realiza:

  • prin compilarea sa cu cc-ul nativ (sau cu gcc-ul care a fost descărcat în formă precompilată);
  • apoi se recompilează cu gcc-ul care s-a creat;
  • după care se verifică versiunea compilată cu gcc, printr-o nouă recompilare cu ea însăşi.

În momentul când compilăm gcc, putem decide dacă vrem C++-ul să fie inclus între limbajele care sunt construite în final, şi desigur cum asta ar fi util pentru noi, trebuie să ştim că avem nevoie de libstdc++ care nu este compilat ca parte a pachetului gcc. Desigur şi în acest caz putem alege distribuţia dorită (în versiunile noi de gcc posibil să existe libstdc++ inclus, dacă alegem ca C++ -ul să fie inclus, dar nu versiunea pe care o dorim noi). Sfatul este să răsfoim README-ul libstdc++ (şi nu doar în cazul instalării libstdc++), inainte de a începe instalarea. Răsfoind README, vom găsi o mulţime de sfaturi în legătură cu priorităţile de instalare, însă noi să alegem cea mai ideală, corespunzătoare şi uşoară pentru noi. Un astfel de sfat arată astfel:

  • Construiţi şi instalaţi gcc;
  • Descărcaţi distribuţia libstdc++ corespunzătoare;
  • În directorul de vârf al distribuţiei libstdc++, procedaţi astfel:
  • Cxx=gcc .configure CONFIGURE-OPTIONS

make

make install

Această procedură este identică la toate sistemele de operare sub UNIX.

O altă procedură de instalare este instalarea gcc ca parte a unui pachet. Revenim la fişierul README care printre multitudinile de sfaturi ce ne oferă, ne mai sugerează ca în loc să instalăm şi să construim gcc pe care mai apoi să-l utilizăm pentru a construi libstdc++, mai bine să mutăm directorul sursă gcc în directorul sursă libstdc++ şi construim totul deodată. Paşii care se parcurg în cazul acestei metode, sunt:

    • Primul pas e să mutăm directorul sursă al distribuţiei gcc într-un director din directorul sursă al libstdc++, după care îl redenumim gcc( libstdc++/gcc), cu comanda mv gcc-[versiune gcc]/libstdc++[versiune libstdc++];
    • În continuare vom da comanda patch în fişierul Install din directorul din vârf al distribuţiei libstdc++. Aceasta va permite să testăm compilatorul construit;
    • Un alt pas este să luăm o serie de teste pentru gcc şi să o mutăm în subdirectorul gcc din directorul libstdc++;
    • În directorul libstdc++, mai apoi, vom crea un director numit objdir şi vom da comanda configure[options] specificând sistemul ţintă în cazul în care se construieşte un pachet pentru mai multe platforme;
    • Fiecare opţiune de activare va avea disponibil şi una de dezactivare (idem pentru opţiunea with care va avea una without);
    • Utilizarea opţiunii prefix=numedir este bună pentru a specifica directorul pentru instalare care este diferit de cel prestabilit, adică usr/local. Opţiunea with-local-prefix=numedir este o altă opţiune care serveşte pentru specificarea directorului unde se instalează fişierele locale. Şi aici cel prestabilit este usr/local;
    • enable-shared este o opţiune pentru construcţia versiunii partajate ale bibliotecilor C++ din timpul rulării. Aici opţiunea prestabilită este disable-shared;
    • enable-multilib – este util pentru a construi mai multe biblioteci ţintă care să ofere suport pentru mai multe variantă ţintă. Opţiunea prestabilită, aici, este aceasta;
    • Mai avem două opţiuni with-gnu-as şi with-gnu-ld în care compilatorul presupune că asamblorul respectiv programul de legături GNU este disponibil;
    • Ca un următor pas este, ca în directorul objdir vom utiliza GNU make pentru a construi libstdc++;
    • Urmează să testăm compilatorul construit rulând make check în objdir;
    • Ca un ultim pas ar fi să rulăm make install în objdir pentru a instala soft-ul.

C-am astea sunt paşii de instalare a gcc în caz că nu-l avem inclus printre pachetele distribuţiei noastre. 

În final aş mai aminti că dacă nu avem nici un compilator pe sistemul nostru putem construi noi alta, adică putem construi un croscompilator a gcc însă pe un alt sistem, aceasta însemnând că apelând la ajutorul unui alt sistem care are un compilator, avem posibilitatea de a realiza o versiune gcc pe acel sistem, iar gcc-ul nou îl utilizăm pentru a face o copie gcc-ului pentru sistemul nostru fără compilator. Desigur puţini vor fi care vor parcurge acest pas de a construi gcc, dar cine va dori acest lucru o va putea face cu ajutorul documentaţiei care va veni împreună cu codul sursă gcc.

Sus

     

[Index] [Partea I-a] [Partea II-a] [Capitolul I] [Capitolul II] [Capitolul III] [Capitolul IV] [Bibliografie]