Naprej Nazaj Kazalo

5. Prenos, prevajanje in dobivanje programov

5.1 Kako prevedem programe?

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

Programi, napisani v C++, se morajo prevesti s prevajalnikom GNU G++, ki je tudi vključen v distribucije Linuxa in dostopen na istem mestu kot 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, dokler razvijalci jedra ne spremenijo kode tako, da se bo pravilno prevedla tudi s prevajalniki, različnimi od GCC 2.7.2.x.

Podatki o prevajalniku EGCS so na naslovu http://egcs.cygnus.com/.

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

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

5.2 Kako namestim GNU-jevsko programje?

Na pravilno nameščenem sistemu zahteva nameščanje GNU-jevskega programskega paketa štiri korake.

5.3 Kje lahko dobim Javo?

Paketa Java Developer's Kit (JDK) 1.2 in Java Runtime Environment (JRE) 1.2, ki ju razvijata Sun Microsystems in Blackdown Consulting, sta na http://java.sun.com/. Na naslovu http://www.blackdown.org/java-linux/mirrors.html je seznam strežnikov za jemanje prek FTP.

Dobite lahko tudi izvorno kodo, katere licenca je v lasti podjetja Sun Microsystems.

Kaffee, različica Jave s prosto izvorno kodo, je na http://www.transvirtual.com/products/.

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

Za Linux obstaja tudi različica brkljalnika HotJava, ki ga izdeluje Sun, glejte http://www.java.sun.com/products/hotjava/.

Netscape Communicator prihaja z lastno 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?

Unixaški programi se v splošnem 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 izvedeli - lahko ugibate, toda to pogosto privede do hroščatih programov. V tem primeru raje prosite koga drugega, da vam naredi prenos.

Če imate BSD-jevski 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 vsebovana v posebni deljeni knjižnici, /lib/ld.so, kjer jo lahko binarne datoteke najdejo. Tako porablja manj diskovnega prostora in jo lahko preprosteje nadgradimo.

Knjižnico ld.so lahko 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 (glejte razdelek ,,Kaj je pravzaprav s tem ELF-om?``) in pride v istem paketu, kot 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 na iste 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č. Obstajajo načini, da se temu izognemo. Eden od načinov 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.

Primer: 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
Prepričajte se, da boste pognali ldconfig in s tem osvežili nastavitev knjižnic.

Datoteki libc.so.5 in libm.so.5 sta simbolni povezavi na resnični knjižnični datoteki. 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 na nove knjižnice, potem prepišite knjižnice in povezave na 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 skopirali.

5.7 Je že kdo prenesel/prevedel/napisal XXX za Linux?

Najprej poglejte na ,,zemljevid programja za Linux``, Linux Software Map, na mestu ftp://metalab.unc.edu/pub/Linux/docs/linux-software-map in na druge arhive za FTP. Na spletnem naslovu http://www.boutell.com/lsm/ je iskalnik.

Glejte mesta za FTP iz razdelka ,,Kako lahko dobim stvari za Linux po FTP-ju?``. Najprej poiščite ključne besede v datotekah ls-lR ali INDEX.

Poglejte tudi v ,,zemljevid projektov za Linux``, Linux Projects Map, ftp://ftp.ix.de/pub/ix/Linux/docs/Projects-Map.gz.

Na spletnem naslovu http://lfw.linuxhq.com/ je tudi iskalnik stvari za Linux po arhivih FTP.

Poglejte tudi spletno stran Freshmeat, na kateri so vsak dan objavljene novosti za Linux. Najdete jo na http://www.freshmeat.net/; zares je kul, čeprav logotip spominja na mačjo hrano. (Glejte razdelek ,,Kakšna periodika na zvezi ali zastonj obstaja za Linux?``.) Freshmeat je pravzaprav stran s kazalom, ki se venomer osvežuje s podatki o novih ali osveženih programih za Linux.

Če ne najdete ničesar, lahko prenesete izvorno kodo programa in ga sami prevedete. Glejte razdelek ,,Kako prenesem XXX na Linux?``. Če gre za velik programski paket, ki potrebuje nekaj prilagoditev, pošljite sporočilo v comp.os.linux.development.apps.

Ko prevedete večji program, ga, prosim, uvrstite v enega ali več FTP arhivov in obvestite javnost s sporočilom v comp.os.linux.announce (pošljite vaše sporočilo na < linux-announce@news.ornl.gov>).

Možno je, da je že kdo napisal prosto verzijo uporabnega programa, ki ga potrebujete. Navodila za iskanje izvorne kode najdete v PZV novičarske skupine comp.sources.wanted.

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

Da, če to ni jedro.

Izbira -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 na 486. Še vedno delujejo na 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 na 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.

Obstaja alfa verzija 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. Priporočam raje uporabo navadnega GCC za 486; govori se, da uporaba izbire -m386 izdela kodo, ki je boljša za Pentium ali je vsaj malo krajša.

5.9 Kaj naredi gcc -O6?

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

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

Te datoteke so v imenikih /usr/include/linux in /usr/include/asm. Vendar morata biti to pravzaprav simbolni povezavi do izvorne kode jedra v imeniku /usr/src/linux, ne prava imenika. Navadno so glave jedra v imeniku /usr/src/kernel*/.

Če nimate izvorne kode jedra, jo nekje dobite; glejte razdelek ,,Kako nadgradim/prevedem svoje 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

/usr/src/linux/include/asm je simbolna povezava na imenik asm-<arch>. Ta je odvisen od strojne zasnove računalnika. Če ste pravkar odpakirali vaše drevo izvorne kode jedra, morate uporabiti make symlinks. Opazili boste tudi, da morate morda pri novem jedru napisati make config. S tem naredite datoteko linux/autoconf.h.

5.11 Pri prevajanju jedra dobivam sporočila o napakah

Glejte 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. Za podrobnosti glejte priročnik 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.12 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 tipa ELF. Glejte ELF-HOWTO na mestu ftp://metalab.unc.edu/pub/Linux/docs/HOWTO/.

5.13 Moje izvedljive datoteke so (zelo) velike.

Pogost vzrok velikih izvedljivih datotek s prevajalnikom za ELF (glejte razdelek ,,Kaj je pravzaprav s tem ELF-om?``) je neobstoj ustreznih povezav .so na knjižnice, ki jih imate. Za vsako knjižnico kot npr. libc.so.5.2.18, ki jo imate, mora obstajati ustrezna povezava, kot npr. libc.so. Ustvarite jo nekako takole:

# ln -sf libc.so.5.2.18 libc.so

S prevajalnikom za a.out je pogost vzrok prevelikih izvedljivih datotek povezovalnikova (prevajalnikova) zastavica -g. Ta naredi (poleg razhroščevalne informacije v izhodni datoteki) tudi program, ki je povezan statično, torej program, ki vsebuje kopijo C-jevske knjižnice, namesto reference na njo.

Ostale stvari, vredne preiskave, sta optimizacijske izbiri -O in -O2 (glejte dokumentacijo prevajalnika GCC) in izbira -s (ali ukaz strip), ki pobriše podatke o simbolih iz izvedljive datoteke (in s tem onemogoči razhroščevanje).

Morda si boste zaželeli uporabiti povezovalnikovo izbiro -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.14 Ali Linux podpira niti ali procese lightweight?

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

Za podrobnosti, prosim, stopite v stik z avtorji posameznih paketov.

5.15 Kje lahko dobim lint za Linux?

V GNU-jevski prevajalnik za C (gcc), ki se uporablja na sistemih tipa Linux, je vgrajena bolj ali manj enaka funkcionalnost. Izpis večine uporabnih opozoril dobite z uporabo izbire -Wall. Za več informacij berite priročnik za GCC (v Emacsu napišite control-h in potem i in izberite poglavje o GCC).

Obstaja prosto dostopen program imenovan lclint, ki dela isto stvar, kot standardni lint. Najave in izvorna koda so dostopni na ftp://larch.lcs.mit.edu/pub/Larch/lclint, na svetovnem spletu glejte stran http://larch-www.lcs.mit.edu:8001/larch/lclint.html.

5.16 Kje lahko najdem kermit za Linux?

Kermit se razširja s pravicami razširjanja, ki se razlikujejo od GPL. Izvorna 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.17 V Linuxu želim uporabljati kabelski modem

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


Naprej Nazaj Kazalo