Sljedeći dio Prethodni dio Sadržaj

5. Portiranje, kompajliranje i nabavljanje programa

5.1 Kako se programi kompajliraju?

Većina programa za Linux napisana je u C-u i kompajlirana kompajlerom GNU C. GCC je dio svake distribucije Linuxa. Najnovija verzija kompajlera, dokumentacije i zakrpa nalaze se na ftp://ftp.gnu.org/pub/gnu/.

Programi napisani u C++ moraju se kompajlirati kompajlerom GNU G++, koji je također uključen u distribucije Linuxa i dostupan na istom mjestu kao i GCC.

Za kompajliranje kernela verzije 2.0.x potreban vam je GCC verzije 2.7.2.x. Pokušavanje kompajliranja Linux kernela drugim kompajlerom, kao što je GCC 2.8.x, EGCS ili PGCC, može uzrokovati probleme dok se ne srede zavisnosti koda o 2.7.2.x kompajlerima.

Informacije o kompajleru EGCS nalaze se na http://egcs.cygnus.com.

Primjetite da ljudi koji razvijaju kernel za sada ne odgovaraju na zahtjeve za ispravkama grešaka u kernelima verzije 2.0.x, nego se usredotočuju na razvoj verzija 2.1.x.

[J. H. M. Dassen]

5.2 Kako instalirati GNU programe?

Na ispravno instaliranom sustavu instalacija GNU softverskog paketa se sastoji od četiri koraka.

5.3 Kako portirati XXX na Linux?

Unix programima obično ne treba puno portiranja. Jednostavno slijedite upute za instalaciju. Ako ne znate -- i ne znate kako saznati -- odgovore na neka od pitanja tokom postupka instalacije, možete pogađati, no to obično urodi programom s greškama. U tom ćete slučaju vjerojatno bolje proći ako nekog drugog zamolite da napravi port.

Ako imate BSD-olik program, pokušajte koristiti -I/usr/include/bsd i -lbsd na odgovarajućim mjestima naredbi za kompajliranje.

5.4 Što je ld.so i gdje ga nabaviti?

ld.so dinamički učitava librarye. Svaka izvršna datoteka koja koristi djeljene librarye nekada je imala oko 3 KB koda za pokretanje koji bi saznao i učitao djeljene librarye. Sada je taj kod stavljen u poseban djeljeni library, /lib/ld.so, gdje ga mogu naći sve izvršne datoteke, pa on troši manje prostora na disku i lakše ga je nadograditi.

ld.so se može nabaviti s ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ i njegovih mirrora. Dok ovo pišem, najnovija verzija je ld.so.1.9.5.tar.gz.

/lib/ld-linux.so.1 je ista stvar za ELF (pitanje Što znači sve ovo s ELF-om?) i dolazi u istom paketu kao i a.out loader.

5.5 Kako nadograditi librarye bez raspadanja sustava?

Napomena: Pri ovom postupku uvijek imajte pri ruci rescue disketu za vjerojatan slučaj da nešto pođe krivo!

Ovaj postupak je mukotrpan, pogotovo ako nadograđujete vrlo stare librarye kao što je libc4. No trebali bi moći zadržati libc4 na istom sustavu s libc5 libraryima koji ih još trebaju. Isto vrijedi i za nadograđivanje s libc5 na još noviji glibc2 library.

Problem kod nadogradnje dinamičkih librarya je to što, čim izbrišete stare librarye, alati koji vam trebaju za nadograđivanje na novu verziju ne rade. To se može zaobići na nekoliko načina. Jedan je privremeno staviti dodatni primjerak dinamičkih librarya, koji su u /lib/, u /usr/lib/ ili /usr/local/lib/, ili neki drugi direktorij koji je uvršen u datoteku /etc/ld.so.conf.

Na primjer, kod nadogradnje libc5 librarya, datoteke u /lib/ bi izgledale otprilike ovako:

libc.so.5
libc.so.5.4.33
libm.so.5
libm.so.5.0.9
Ovo su C i matematički libraryi. Kopirajte ih u neki direktorij koji je u /etc/ld.so.conf, kao što je /usr/lib/.

cp -df /lib/libc.so.5* /usr/lib/
cp -df /lib/libm.so.5* /usr/lib/
ldconfig
Nemojte zaboraviti pokrenuti ldconfig kako bi se konfiguracija librarya osvježila.

Datoteke libc.so.5 i libm.so.5 su simboličke veze na prave librarye. Kod nadogradnje nove se veze neće stvoriti ako stare još uvijek postoje, osim ako uz cp koristite opciju -f. Zbog opcije -d kopiraju se same veze, a ne datoteke na koje one pokazuju.

Ako izravno morate prebrisati vezu na library, koristite -f opciju za ln.

Na primjer, za kopiranje novih librarya preko starih, probajte ovo. Prvo napravite simboličku vezu na nove librarye, a zatim kopirajte i librarye i veze u /lib/ slijedećim naredbama.

ln -sf ./libm.so.5.0.48 libm.so.5
ln -sf ./libc.so.5.0.48 libc.so.5
cp -df libm.so.5* /lib
cp -df libc.so.5* /lib
Opet, nakon kopiranja librarya sjetite se pokrenuti ldconfig.

Ako ste zadovoljni i sve ispravno radi, možete obrisati privremene primjerke starih librarya iz /usr/lib/ ili gdje ste ih već kopirali.

5.6 Je li netko portirao/kompajlirao/napisao XXX za Linux?

Najprije potražite u Linux Software Mapu -- nalazi se na ftp://sunsite.unc.edu/pub/Linux/docs/linux-software-map i drugim FTP arhivama. Pretraga preko WWW-a može se obaviti na http://www.boutell.com/lsm/.

Provjerite FTP arhive (pitanje Gdje da FTP-om nabavim Linux materijale?) -- odgovarajućim nizovima pretražite datoteke ls-lR ili INDEX.

Također pogledajte Linux Projects Map, ftp://ftp.ix.de/pub/ix/Linux/docs/Projects-Map.gz.

Za Linux FTP arhive postoji pretraživač, na http://lfw.linuxhq.com/.

Također provjerite na Freshmeat WWW stranicama, http://www.freshmeat.net/, koje su stvarno kul. (Pogledajte Koje besplatne publikacije na Internetu govore o Linuxu?.)

Ako ništa ne nađete, možete sami skinuti izvorni kod programa i kompajlirati ga. Pogledajte Kako portirati XXX na Linux?. Ako je to veći paket koji zahtjeva portiranje, pošaljite poruku u comp.os.linux.development.apps.

Ako kompajlirate veći program, molim vas, pošaljite ga na jednu ili više FTP arhiva, uz poruku na comp.os.linux.announce (svoju poruku predajte na linux-announce@news.ornl.gov).

Ako tražite aplikaciju, netko je vjerojatno već napisao besplatnu verziju. comp.sources.wanted FAQ ima upute za traženje izvornog koda.

5.7 Mogu li koristiti kod ili kompajler kompajliran za 486 na svojoj 386?

Da, ako to nije kernel.

GCC-ova opcija -m486 koja se koristi pri kompajliranju izvršnih datoteka za x486 strojeve mijenja samo određene optimizacije. To rezultira u malčice većim datotama koje rade ponešto brže na 486. No, još uvijek dobro rade na 386, uz manje pogoršanje performansi.

Međutim, od verzije 1.3.35 kernel koristi instrukcije specifične za 486 ili Pentium ako je konfiguriran za 486 ili Pentium, pa ga se ne može koristiti na 386.

GCC se može konfigurirati za 386 ili 486; jedina je razlika što konfiguriranje za 386 -m386 čini predodređenim, a konfiguriranje za 386 predodređenim čini -m486; u svakom slučaju može ih se nadjačati prilikom kompajliranja ili mijenjanjem /usr/lib/gcc-lib/i*-linux/n.n.n/specs.

Postoji alfa verzija GCC-a koja zna dobro optimizirati za 586, ali je prilično nepouzdana, osobito kod visokih optimizacija. Pentium GCC može se naći na tsx-11.mit.edu u /pub/linux/ALPHA/pentium-gcc/. Preporučio bih korištenje običnog 486 GCC-a; čuo sam da korištenje -m386 daje kod koji bolje odgovara Pentiumu ili je barem malčice manji.

5.8 Što znači gcc -O6?

Za sada isto što i -O2 (GCC 2.5) ili -O3 (GCC 2.6, 2.7). Bilo koji broj veći od toga za sada radi istu stvar. Makefileovi novijih kernela koriste -O2, pa bi vjerojatno trebali i vi.

5.9 Gdje su linux/*.h i asm/*.h?

Datoteke /usr/include/linux i /usr/include/asm su često simboličke veze na direktorije u kojima su kernel headeri. Oni se obično nalaze u /usr/src/kernel*/.

Ako nemate izvorni kod kernela, skinite ga -- pogledajte Kako nadograditi/ponovo kompajlirati kernel?.

Zatim pomoću rm izbrišite bilo kakvo smeće i preko ln napravite veze:

rm -rf /usr/include/linux /usr/include/asm
ln -sf /usr/src/linux/include/linux /usr/include/linux
ln -sf /usr/src/linux/include/asm /usr/include/asm
/usr/src/linux/include/asm je simbolička veza na asm-<arh> direktorij specifičan za određenu arhitekturu -- ako imate svježe otpakiran izvorni kod kernela, morate napraviti simboličke veze. Također, kod svježe otpakiranog kernela morate pokrenuti make config kako bi se stvorio linux/autoconf.h.

5.10 Dobivam greške kod kompajliranja kernela.

Pogledajte prethodno pitanje o zaglavnim datotekama.

Nemojte zaboraviti kod primjenjivanja zakrpe na kernel koristiti opciju -p0 ili -p1: inače bi zakrpa mogla biti krivo primjenjena. Za detalje pogledajte man stranicu patcha.

ld: unrecognised option `-qmagic' znači da vam treba noviji linker iz ftp://tsx-11.mit.edu/pub/linux/packages/GCC/, u datoteci binutils-2.8.1.0.1.bin.tar.gz.

5.11 Kako napraviti djeljeni library?

Na ELF-u,

gcc -fPIC -c *.c
gcc -shared -Wl,-soime,libfoo.so.1 -o libfoo.so.1.0 *.o
Ako imate a.out, nabavite tools-n.nn.tar.gz s tsx-11.mit.edu u /pub/linux/packages/GCC/src/. Dolazi s dokumentacijom koja će vam objasniti što treba napraviti. Primjetite da su a.out djeljeni libraryi vrlo složena stvar. Razmislite o nadogradnji na ELF. Pogledajte ELF HOWTO na ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/.

5.12 Moje izvršne datoteke su (vrlo) velike.

Na ELF kompajleru (pogledajte Što znači sve ovo s ELF-om?) najčešći uzrok velikih izvršnih datoteka je nedostatak odgovarajuće .so veze na korišteni library. Na svaki library kao što je libc.so.5.2.18 trebala bi postojati odgovarajuća veza, odnosno libc.so.

Uz a.out kompajler najčešći uzrok velikih izvršnih datoteka je -g, opcija linkera (kompajlera). To daje (uz informacije za pronalaženje grešaka) program koji je statički vezan, tj. takav koji u sebi sadrži C library umjesto korištenja dinamičkih veza.

Druge stvari koje bi trebalo istražiti su -O i -O2, koje uključuju optimiziranje (pogledajte dokumentaciju GCC-a) i -s (odnosno naredba strip) koji u izvršnoj datoteci briše informacije o simbolima (tako čineći traženje grešaka potpuno nemogućim).

Možda ćete na vrlo malim izvršnim datotekama koristiti -N (manje od 8 KB uz -N), ali to ne činite ako ne razumijete njegov utjecaj na brzinu, a pogotovo ne na demonima.

5.13 Podržava li Linux višenitnost ili lakše procese?

Uz Unixov model višezadaćnosti koji uključuje teže procese, što je naravno dio standardnog kernela Linuxa, ima nekoliko implementacija lakših procesa ili niti. Noviji kerneli koriste model niti kthreads. Također, za Linux postoje ovi paketi:

Za detalje kontaktirajte autore paketa.

5.14 Gdje se nalazi lint za Linux?

Otprilike jednaka funkcionalost ugrađena je u GCC. Za većinu korisnih dodatnih upozorenja koristite opciju -Wall. Za više detalja pogledajte priručnik GCC-a (u Emacsu pritisnite ctrl-h, zatim i, pa odaberite GCC).

Postoji besplatan program, lclint, koji radi otprilike isto što i tradicionalni lint. Najava i izvorni kod mogu se naći na ftp://larch.lcs.mit.edu/pub/Larch/lclint/; na WWW-u pogledajte http://larch-www.lcs.mit.edu:8001/larch/lclint.html.

5.15 Gdje se nalazi kermit za Linux?

Kermit se distribuira pod ne-GPL licencom koja uvjete njegove distribucije čini ponešto različitim. Izvorni kod i neke izvršne datoteke mogu se naći na kermit.columbia.edu.

WWW stranica Columbia University Kermit projekta je http://www.columbia.edu/kermit.


Sljedeći dio Prethodni dio Sadržaj