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 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 jeder 2.0.x, pač pa se osredotočajo na razvoj jeder 2.1.x.
[J.H.M. Dassen]
Na pravilno nameščenem sistemu zahteva nameščanje GNU-jevskega programskega paketa štiri korake.
.tar.gz
v imeniku /usr/src/
,
ali kjerkoli že imate vaše izvorne datoteke, razširite in
dearhivirajte paket z ukazom:
# tar zxvf package-name.tar.gz
./configure
s katerimikoli
argumenti, ki jih potrebujete, v najvišjem imeniku arhiva izvorne
kode. Izbire, ki jih prepozna configure
so navadno
vsebovane v datoteki INSTALL
ali README
.make
. To bo zgradilo izvedljivi
program (ali programe) iz izvorne kode in lahko traja nekaj
minut ali nekaj ur, odvisno od hitrosti računalnika in velikosti
paketa.make install
. To bo namestilo prevedene
binarne datoteke, nastavitvene datoteke in vse knjižnice v ustrezne
imenike.
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.
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.
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 lahko imena datotek v imeniku
/lib/
izgledajo 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 simbolični 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 simbolično
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 simbolično 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.
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 Linuxovih projektov``, 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?.)
Č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
news: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
news: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
news:comp.sources.wanted
.
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.
Linuxovo jedro 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.
Pentiumov GCC 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.
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.
linux/*.h
in asm/*.h
?
Te datoteke so v imenikih /usr/include/linux
in
/usr/include/asm
. Vendar morata biti to pravzaprav simbolična
linka 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 simbolična 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
.
Glejte prejšnje vprašanje glede datotek z zaglavji.
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
.
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 ELF-ov format deljenih knjižnic. Glejte ELF-HOWTO
na mestu
ftp://metalab.unc.edu/pub/Linux/docs/HOWTO/
.
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.
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:
ftp://ftp.gnu.org/pub/gnu/
.
ftp://sipb.mit.edu/pub/pthread/
ali
ftp://ftp.ibp.fr/pub/unix/threads/pthreads/
.
Dokumentacije ni v paketu, a je dostopna na svetovnem spletu na strani
http://www.mit.edu:8001/people/proven/home_page.html
.
Novejše Linuxove knjižnice libc
vsebujejo izvorno kodo
pthreads
. GNU-jev prevajalnik
za programski jezik Ada na
ftp://metalab.unc.edu/pub/Linux/devel/lang/ada/gnat-3.01-linux+elf.tar.gz
vsebuje binarne datoteke, narejene iz te izvorne kode.
ftp://ftp.cs.washington.edu/pub/qt-001.tar.Z
.
Več podatkov najdete v tehničnem poročilu, dostopnim na istem mestu kot
ftp://ftp.cs.washington.edu/tr/1993/05/UW-CSE-93-05-06.PS.Z
.lwp
, dostopen na
ftp://gummo.doc.ic.ac.uk/rex
.
ftp://ftp.cs.fsu.edu:/pub/PART
.
Ta je zanimiva predvsem zato, ker vsebuje veliko postscriptnih člankov, ki
so uporabni, če želite izvedeti več o nitih. Ni neposredno uporabna v Linuxu.Za podrobnosti, prosim, stopite v stik z avtorji posameznih paketov.
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
.
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/
.