Naprej Nazaj Kazalo

5. Prenos, prevajanje in dobivanje programov

5.1 Kako prevedem programe?

Večina programja za Linux je napisana v jeziku C in prevedena s prevajalnikom GNU C (GCC). GCC je del vsake distribucije Linuxa. Najnovejša različica prevajalnika, dokumentacija in popravki so dostopni na ftp://ftp.gnu.org/pub/gnu/.

Programi, napisani v C++, se morajo prevesti s prevajalnikom GNU G++, ki je tudi del distribucije Linuxa in dostopen na istem mestu kakor GCC.

Za gradnjo jeder različice 2.0.x in poznejših boste potrebovali GCC različice 2.7.2.x. Poskus prevajanja jedra Linuxa z drugim prevajalnikom, kot so GCC 2.8.x, EGCS, ali PGCC, lahko povzroči težave zaradi odvisnosti kode od posebnosti GCC. Jedra različic 2.2, 2.4 in razvojna jedra 2.5 bi se morala pravilno prevesti tudi z novejšimi prevajalniki.

Podatki o prevajalniku EGCS so na naslovu http://www.gnu.org/software/gcc/gcc.html.

Vedite tudi, da v današnjem času razvijalci jedra ne odgovarjajo na obvestila o hroščih starejših jeder, temveč se osredotočajo na razvoj jeder 2.5.x in vzdrževanje jeder 2.2.x in 2.4.x.

[J.H.M. Dassen, Axel Boldt]

5.2 Kako namestim gnujevsko programje?

V pravilno nameščenem sistemu zahteva nameščanje gnujevskega programskega paketa štiri korake.

  1. Z arhivom .tar.gz v imeniku /usr/src/ ali kjerkoli že imate svoje izvirne datoteke, razširite in dearhivirajte paket z ukazom:
    # tar zxvf package-name.tar.gz
    
  2. Poženite skript ./configure s katerimikoli argumenti, ki jih potrebujete, v najvišjem imeniku arhiva izvirne kode. Izbire, ki jih prepozna configure, so navadno zajete v datoteki INSTALL ali README.
  3. Poženite make. To bo zgradilo izvedljivi program (ali programe) iz izvirne kode in lahko traja nekaj minut ali nekaj ur, odvisno od hitrosti računalnika in velikosti paketa.
  4. Poženite make install. To bo namestilo prevedene binarne datoteke, nastavitvene datoteke in vse knjižnice v ustrezne imenike.

5.3 Kje lahko dobim javo?

Na naslovu http://java.sun.com/java/ je okolje za poganjanje jave podjetja Sun Microsystems.

Lahko dobite tudi izvirno kodo, ki jo je licenciralo podjetje Sun Microsystems.

Domača stran prevajalnika za Javo Jikes podjetja IBM je na http://www10.software.ibm.com/developerworks/opensource/jikes.

Za Linux je na voljo tudi različica brkljalnika HotJava, ki ga izdeluje Sun; glej http://www.java.sun.com/products/hotjava/.

Kaffe, različica jave s prosto izvirno kodo, je na http://www.kaffe.org/.

Na naslovu http://www.blackdown.org/java-linux.html je stran z viri prostih in komercialnih paketov za javo.

Netscape Communicator ima svojo različico okolja za poganjanje jave, zato imate za pregledovanje spletne javanske grafike morda že na voljo različico navideznega stroja in ustrezne knjižnice za javo. Communicator lahko prenesete z http://www.netscape.com/.

5.4 Kako prenesem XXX na Linux?

Unixovski programi se na splošno zelo lepo prenašajo med različnimi Unixi. Preprosto upoštevajte namestitvena navodila. Če ne veste odgovorov na nekatera vprašanja med namestitvenim postopkom -- in tudi ne veste, kako bi jih izvedeli -- lahko ugibate, toda to pogosto privede do hroščatih programov. V tem primeru raje prosite koga drugega, naj vam naredi prenos.

Če imate bsdjevski program, lahko poskusite z -I/usr/include/bsd in -lbsd na primernem mestu v prevajalskih vrsticah.

5.5 Kaj je ld.so in kje ga dobim?

Ld.so je dinamični nalagalnik knjižnic. Včasih je imela vsaka binarna datoteka, ki je uporabljala deljene knjižnice, na začetku 3 Kb začetne kode, ki je poiskala in naložila deljene knjižnice. Dandanes je ta koda zajeta v posebni deljeni knjižnici, /lib/ld.so, v kateri jo lahko binarne datoteke najdejo. Tako porablja manj diskovnega prostora in jo lahko preprosteje nadgradimo.

Knjižnico ld.so dobite z mesta ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ in njegovih zrcalnih mest. V času nastanka teh PZV je zadnja različica ld.so.1.9.5.tar.gz.

/lib/ld-linux.so.1 je ista stvar za format ELF (glej razdelek Kaj je pravzaprav s tem ELF? Z glibc?) in jo dobite v istem paketu kakor nalagalnik za format a.out.

5.6 Kako nadgradim knjižnice, ne da bi sesul svoj sistem?

Pozor: Preden začnete izvajati ta postopek, morate imeti za vsak slučaj pripravljeno rešilno disketo. Lahko gre kaj narobe!

Ta postopek je še posebej težak, če nadgrajujete zelo stare knjižnice, kot so libc4. V tem primeru morate obdržati libc4 v istem sistemu skupaj s knjižnicami libc5, saj jih lahko programi še vedno potrebujejo. Isto velja za nadgradnjo knjižnic libc5 na še novejše knjižnice glibc2.

Problem pri nadgradnji dinamičnih knjižnic je, da v trenutku, ko odstranite stare knjižnice, pripomočki, ki jih potrebujete pri nadgradnji na novo različico knjižnic, ne delujejo več. Na voljo so načini, da se temu izognemo. Eden od njih je, da začasno postavimo dodaten izvod pogonskih knjižnic, ki so v imeniku /lib/, v /usr/lib/ ali /usr/local/lib/ ali drug imenik, naveden v datoteki /etc/ld.so.conf.

Zgled: Pri nadgradnji knjižnic libc5 so lahko imena datotek v imeniku /lib/ videti takole:

libc.so.5
libc.so.5.4.33
libm.so.5
libm.so.5.0.9
To so knjižnice za C in matematične knjižnice. Prepišite jih v drug imenik, naveden v /etc/ld.so.conf, kot je, denimo, /usr/lib/.
# cp -df /lib/libc.so.5* /usr/lib/
# cp -df /lib/libm.so.5* /usr/lib/
# ldconfig
Preverite, ali ste pognali ldconfig in s tem osvežili nastavitev knjižnic.

Datoteki libc.so.5 in libm.so.5 sta simbolni povezavi do resničnih knjižničnih datotek. Ko nadgrajujete, se nove povezave ne bodo ustvarile, če imate še vedno stare, razen če uporabite zastavico -f ukaza cp. Zastavica -d ukaza cp bo prepisala simbolno povezavo samo, in ne datoteke, na katero kaže.

Če morate neposredno prepisati povezavo na knjižnico, uporabite zastavico -f ukaza ln.

Na primer, za prepis novih knjižnic čez stare poskusite tole. Najprej naredite simbolno povezavo do nove knjižnice, potem prepišite knjižnice in povezave do njih v imenik /lib/ z naslednjimi ukazi:

# 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
Spet po prepisu knjižnic ne pozabite pognati programa ldconfig.

Če ste zadovoljni s pravilnim delovanjem novega sistema, lahko odstranite začasne izvode starih knjižnic z imenika /usr/lib/ ali kamorkoli ste jih že prekopirali.

5.7 Ali lahko uporabljam kodo ali prevajalnik, preveden za 486, na moji 386?

Da, če to ni jedro.

Izbor -m486 prevajalnika GCC, ki se uporablja za prevajanje izvedljivih datotek za procesorje x486, zgolj spremeni določene optimizacije. Rezultat so nekoliko večje binarne datoteke, ki tečejo nekoliko hitreje v 486. Še vedno delujejo v 386, čeprav res malo počasneje.

Jedro Linuxa od različice 1.3.35 naprej uporablja posebne ukaze procesorja 486 ali Pentium, če je prevedeno posebej za 486 ali Pentium. Tako prevedenega jedra torej ne morete uporabiti v procesorju 386.

GCC lahko nastavite za delo s 386 ali 486; edina razlika je v tem, da nastavitev za 386 privzame izbiro -m386, nastavitev za 486 pa -m486. V obeh primerih lahko to prekličete ob posameznem prevajanju ali s spremembo datoteke /usr/lib/gcc-lib/i*-linux/n.n.n/specs.

Na voljo je alfa različica prevajalnika GCC, ki zna napraviti optimizacije za 586, vendar je precej nezanesljiva, posebej pri nastavitvah za velike optimizacije. GCC za Pentium najdete na ftp://tsx-11.mit.edu/pub/linux/ALPHA/pentium-gcc/.

Navadni GCC za 486 z uporabo izbire -m386 izdela kodo, ki je boljša za Pentium ali vsaj malo krajša.

5.8 Kaj naredi gcc -O6?

Trenutno isto kakor -O2 (GCC 2.5) ali -O3 (GCC 2.6, 2.7). Katerokoli število, večje od tega, naredi trenutno isto. Datoteke Makefile novejših jeder uporabljajo izbiro -O2 in verjetno bi jo morali tudi vi.

5.9 Kje so datoteke linux/*.h in asm/*.h?

Datoteki /usr/include/linux in /usr/include/asm sta pogosto simbolni povezavi do imenikov z glavami za izvirno kodo jedra. Navadno so glave jedra v imeniku /usr/src/kernel*/.

Če nimate izvirne kode jedra, jo nekje dobite; glej razdelek Kako nadgradim/prevedem jedro?.

Potem uporabite ukaz rm, da odstranite vse smeti, in ukaz ln za ustvarjanje povezav:

$ 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

Datoteke v zbirniku ležijo v imenikih, odvisnih od arhitekture, zato morate v računalnikih PC povezati /usr/src/include/asm na /usr/src/linux/include/asm-i386, v sistemih Sun Sparc na /usr/src/linux/include/asm-sparc, na PowerPC na /usr/src/linux/include/asm-ppc in tako naprej.

Opazili boste tudi, da morate morda pri novem jedru napisati make config. S tem naredite datoteko linux/autoconf.h.

5.10 Kaj naj storim glede napak pri prevajanju jedra?

Glej prejšnje vprašanje glede datotek z glavami.

Spomnite se, da morate pri uporabi popravkov vedno uporabiti izbiro -p0 ali -p1, sicer se lahko popravki uporabijo povsem napačno. Podrobnosti si oglejte v priročniku za program patch (man patch).

Sporočilo povezovalnika o neprepoznani izbiri -qmagic

ld: unrecognized option `-qmagic'
pomeni, da morate dobiti novejši povezovalnik z mesta ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ v datoteki binutils-2.8.1.0.1.bin.tar.gz.

5.11 Kako naredim deljeno knjižnico?

Za format ELF takole:

$ gcc -fPIC -c *.c
$ gcc -shared -Wl,-soname,libfoo.so.1 -o libfoo.so.1.0 *.o

Za format a.out vzemite arhiv tools-n.nn.tar.gz z naslova ftp://tsx-11.mit.edu/pub/linux/packages/GCC/src/. V arhivu je dokumentacija, ki vam pove, kaj storite. Upoštevajte, da so deljene knjižnice za format a.out zelo kočljiva zadeva. Razmislite o nadgradnji vaših knjižnic na deljene knjižnice vrste ELF. Glej ELF-HOWTO na ftp://metalab.unc.edu/pub/Linux/docs/HOWTO/.

5.12 Zakaj so moji programi tako veliki?

Najpogostejši vzrok velikih izvedljivih datotek s prevajalnikom za ELF (glej razdelek Kaj je pravzaprav s tem ELF? Z glibc?) je, da ni ustreznih povezav .so s knjižnicami, ki jih imate. Za vsako knjižnico, kot npr. libc.so.5.2.18, ki jo imate, mora biti na voljo ustrezna povezava.

Pri prevajalniku za a.out je pogost vzrok prevelikih izvedljivih datotek zastavica povezovalnika (prevajalnika) -g. Ta naredi (poleg razhroščevalne informacije v izhodni datoteki) tudi program, ki je povezan statično, torej program, ki zajema kopijo C-jevske knjižnice, namesto reference nanjo.

Drugo, vredno preiskave, sta optimizacijski izbiri -O in -O2 (glej dokumentacijo prevajalnika GCC) in izbira -s (ali ukaz strip), ki zbriše podatke o simbolih iz izvedljive datoteke (in s tem onemogoči razhroščevanje).

Morda si boste zaželeli uporabiti izbiro povezovalnika -N pri zelo majhnih izvedljivih datotekah (skupaj z -N manjših od 8 Kb), a tega raje ne počnite, če ne razumete posledične spremembe v delovanju, in definitivno nikoli pri prevajanju demonov.

5.13 Ali Linux podpira niti ali procese lightweight?

Podobno kakor Unixov večopravilni model s procesi heavyweight, ki je seveda del standardnega jedra Linuxa, je na voljo tudi več izvedb procesov vrste lightweight ali niti. Novejša jedra udejanjajo model niti, imenovan kthreads. Poleg tega so za Linux dostopni še naslednji paketi:

Če vas zanimajo podrobnosti, prosim, stopite v stik z avtorji posameznih paketov.

5.14 Kje lahko dobim lint za Linux?

V gnujevski prevajalnik za C (gcc), ki se uporablja v sistemih vrste Linux, je vgrajena bolj ali manj enaka funkcionalnost. Izpis večine uporabnih opozoril dobite z uporabo izbire -Wall. Več o tem si preberite v priročniku za GCC (v Emacsu napišite F1-i in izberite poglavje o GCC).

Na voljo je prosto dostopen program, imenovan lclint, ki dela isto kakor standardni lint. Napovedi in izvirna koda so dostopni na ftp://larch.lcs.mit.edu/pub/Larch/lclint, na svetovnem spletu glej stran http://lclint.cs.virginia.edu/.

5.15 Kje lahko najdem kermit za Linux?

Kermit se razširja s pravicami razširjanja, ki se razlikujejo od GPL. Izvirna koda in nekatere izvedljive datoteke so dostopne na ftp://kermit.columbia.edu/.

Spletna stran projekta Kermit na Columbia University je na naslovu http://www.columbia.edu/kermit/.

5.16 Kako lahko v Linuxu uporabljam kabelski modem?

Spletna stran CablemodemInfo in xDSL na http://www.cablemodeminfo.com/ ima razdelek, posvečen Linuxu.

Glej tudi spis Cable-Modem-HOWTO iz projekta LDP.

5.17 Ali je v Linuxu na voljo program za ICQ?

Več odjemnikov za ICQ je dostopnih na metalab.unc.edu. (Glej Kako dobim stvari za Linux po FTP-ju?.) Sam ICQ nima odjemnika za Linux, na http://www.mirabilis.com/download/ pa je javanski odjemnik.


Naprej Nazaj Kazalo