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]
Na ispravno instaliranom sustavu instalacija GNU softverskog paketa se sastoji od četiri koraka.
tar zxvf ime-paketa.tar.gz
./configure
u najvišem direktoriju otpakirane
izvorne arhive uz kojegod vama potrebne argumente. Opcije koje
configure
prepoznaje obično su opisane u datoteci INSTALL
ili
README
.
make
. To će iz izvornog koda izgraditi izvršni program
(ili programe) i može potrajati nekoliko minuta ili sati, ovisno o
brzini računala i veličini paketa.
make install
. To će u odgovarajuće direktorije
instalirati dobivene izvršne i konfiguracijske datoteke te librarye.
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.
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.
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.9Ovo 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/ ldconfigNemojte 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* /libOpet, 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.
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.
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.
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.
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
.
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
.
Na ELF-u,
gcc -fPIC -c *.c gcc -shared -Wl,-soime,libfoo.so.1 -o libfoo.so.1.0 *.oAko 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/.
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.
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.
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.
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.