Erinevus lehekülje "Linuxis kompileerimine puust ja punaseks" redaktsioonide vahel

Allikas: Kuutõrvaja
 
(ei näidata sama kasutaja 14 vahepealset redaktsiooni)
3. rida: 3. rida:
  
 
Kuna programeerijatele oleks tüütu neid käske teostavaid koodijuppe uuest ja uuesti
 
Kuna programeerijatele oleks tüütu neid käske teostavaid koodijuppe uuest ja uuesti
kirjutada on tehtud neist eraldi funktsuioonid mis koondatud kogumikesse ehk ingliskeeles "libraries".
+
kirjutada on tehtud neist eraldi funktsioonid mis koondatud teekide nimelistesse kogumikesse (ingliskeeles "libraries").
Nii peavad programeerijad kirjutama algkoodi vaid viiteid (function calls) neile funktsioonidele.
+
Nii peavad programeerijad kirjutama algkoodi neile funktsioonidele vaid viiteid (function calls).
  
 
Sedamoodi funktsioone kasutava inimloetaval tekstikujul asetseva programmifaili
 
Sedamoodi funktsioone kasutava inimloetaval tekstikujul asetseva programmifaili
 
kompileerimine toimub järgnevalt.
 
kompileerimine toimub järgnevalt.
  
# Kompilaator programm loeb algkoodiks olevat faili ja mätsib selle tulemusel kokku asja mida kutsutakse object tüüpi failiks. Tegemist on binaarse (masinloetava) versiooniga programmeerija algkoodist kus ära märgitud kohad, milledes viidatud "libraries" asuvatele funktsioonidele.
+
# Kompilaator programm loeb algkoodiks olevat faili ja mätsib selle tulemusel kokku asja mida kutsutakse object tüüpi failiks. Tegemist on binaarse (masinloetava) versiooniga programmeerija algkoodist kus märgitud viited teekides asuvatele funktsioonidele.
 
+
# Järgmine samm on "linkimine" ehk siis käivitatakse programm nimega linker mis loeb läbi kompilaatori objektifailid, teegid ja asendab programeerija viited teekidest pärineva koodiga. Peale seda asendust on tulemuseks käivitatav koodifail.
# Järgmine samm on "linkimine" ehk siis käivitatakse programm nimega linker mis loeb läbi kompilaatori objektifailid, library failid ja asendab programeerija viited library failist pärineva koodiga. Peale seda asendust on tulemuseks käivitatav koodifail.
 
  
 
Linuxis tegeleb make nimeline käsurea programm nii kompileerimise kui ka linkimisega.  
 
Linuxis tegeleb make nimeline käsurea programm nii kompileerimise kui ka linkimisega.  
18. rida: 17. rida:
  
 
[[Pilt:Compile.gif]]
 
[[Pilt:Compile.gif]]
 +
 +
Ehk siis meil on näiteks koodifail nimega main.c, kompilaatoriga genereeritakse sellest main.o ning linker loob main.o failist omakorda lõpliku käivitatava main binaarfaili.
 +
 +
TODO
 +
 +
On olemas kaks põhilist linkimise viisi:
 +
*Staatilise linkimise puhul toimub sümbolite lahendamine vahetult pärast programmi kompileerimist; kõik viidatud teegiosad kopeeritakse samasse binaarfaili koos programmi enda koodiga.
 +
 +
*Dünaamilse linkimise puhul toimub sümbolite lahendamine programmi käivituse vői töö ajal. Mällu laetakse eraldi programmi binaarfail kui ka teegifailid, ning programmis kasutatud sümbolite viidad suunatakse teegifailile. Windows operatsioonisüsteemidel tunneb ära dünaamilised teegifailid nende laiendi ".DLL" järgi; Unix-laadsetes operatsioonisüsteemides kasutatakse eesliidet "lib" ning laiendit ".so".
 +
 +
ldd käsk
 +
 +
# ldd /usr/bin/mail
 +
linux-vdso.so.1 =>  (0x00007fff4d1ff000)
 +
libc.so.6 => /lib64/libc.so.6 (0x00007fb58cd9f000)
 +
/lib64/ld-linux-x86-64.so.2 (0x00007fb58d12b000)
 +
 +
Linuxis
 +
ldconfig -p
 +
 +
BSD's
 +
ldconfig -r
 +
 +
Praktiliselt kõikjal on linuxis kasutusel dünaamiline linkimine, s.t. elf sisaldab viiteid libradele. Kernel otsib enne elf-i käivitamist vajalikud librad ja mätsib kõik funktsioonide väljakutsed sümbolite järgi, vt ntx
 +
 +
$ readelf -s /usr/sbin/postfix
 +
...
 +
      1: 0000000000000000    0 FUNC    GLOBAL DEFAULT  UND getenv@GLIBC_2.2.5 (2)
 +
      2: 0000000000000000    0 FUNC    GLOBAL DEFAULT  UND free@GLIBC_2.2.5 (2)
 +
...
 +
 +
Ja
 +
 +
$ readelf -s /lib64/libc.so.6
 +
...
 +
  1295: 000000000003a920  213 FUNC    GLOBAL DEFAULT  12 getenv@@GLIBC_2.2.5
 +
  2209: 0000000000082850  136 FUNC    GLOBAL DEFAULT  12 free@@GLIBC_2.2.5
 +
...
 +
 +
Lõpus olev GLIBC_2.2.5 tähendab siin sümboli versiooni, mida uuendatakse ainult siis, kui funktsiooni käitumine muutub. Tegelikult siin /lib64/libc.so.6 pärit näiteks pakist glibc-2.19.
 +
 +
Kui glibc värskendamisel versioonihüpe pole väga suur, võib juhtuda, et kogu opsüsteem kasutab juba viimase versiooni sümboleid ja siis pole teiste programmide uuendamine ehk userlandi vajalik.
 +
 +
Ingliskeelsed viited
  
 
*http://www.aboutdebian.com/compile.htm
 
*http://www.aboutdebian.com/compile.htm
 +
 +
*http://www.freesoftwaremagazine.com/articles/gnu_coding_standards_applied_to_autotools
 +
 +
Eestikeelsed viited
 +
 +
* http://et.wikibooks.org/wiki/Programmeerimiskeel_C/Kompileerimine
 +
 +
* http://viki.pingviin.org/Kuidas_kompileerida_programmi_Linuxis
 +
 +
* http://et.wikipedia.org/wiki/Linkur

Viimane redaktsioon: 28. jaanuar 2015, kell 22:34

Enamus programme teevad nn "päringuid" (calls) operatsioonisüsteemi teenuste suunas. Näiteks: "ütle mulle jooksev kellaaeg" või "mis kasutajad on sisse loginud".

Kuna programeerijatele oleks tüütu neid käske teostavaid koodijuppe uuest ja uuesti kirjutada on tehtud neist eraldi funktsioonid mis koondatud teekide nimelistesse kogumikesse (ingliskeeles "libraries"). Nii peavad programeerijad kirjutama algkoodi neile funktsioonidele vaid viiteid (function calls).

Sedamoodi funktsioone kasutava inimloetaval tekstikujul asetseva programmifaili kompileerimine toimub järgnevalt.

  1. Kompilaator programm loeb algkoodiks olevat faili ja mätsib selle tulemusel kokku asja mida kutsutakse object tüüpi failiks. Tegemist on binaarse (masinloetava) versiooniga programmeerija algkoodist kus märgitud viited teekides asuvatele funktsioonidele.
  2. Järgmine samm on "linkimine" ehk siis käivitatakse programm nimega linker mis loeb läbi kompilaatori objektifailid, teegid ja asendab programeerija viited teekidest pärineva koodiga. Peale seda asendust on tulemuseks käivitatav koodifail.

Linuxis tegeleb make nimeline käsurea programm nii kompileerimise kui ka linkimisega.

Seda protsessi iseloomustab hästi allolev skeem:

Compile.gif

Ehk siis meil on näiteks koodifail nimega main.c, kompilaatoriga genereeritakse sellest main.o ning linker loob main.o failist omakorda lõpliku käivitatava main binaarfaili.

TODO

On olemas kaks põhilist linkimise viisi:

  • Staatilise linkimise puhul toimub sümbolite lahendamine vahetult pärast programmi kompileerimist; kõik viidatud teegiosad kopeeritakse samasse binaarfaili koos programmi enda koodiga.
  • Dünaamilse linkimise puhul toimub sümbolite lahendamine programmi käivituse vői töö ajal. Mällu laetakse eraldi programmi binaarfail kui ka teegifailid, ning programmis kasutatud sümbolite viidad suunatakse teegifailile. Windows operatsioonisüsteemidel tunneb ära dünaamilised teegifailid nende laiendi ".DLL" järgi; Unix-laadsetes operatsioonisüsteemides kasutatakse eesliidet "lib" ning laiendit ".so".

ldd käsk

# ldd /usr/bin/mail
	linux-vdso.so.1 =>  (0x00007fff4d1ff000)
	libc.so.6 => /lib64/libc.so.6 (0x00007fb58cd9f000)
	/lib64/ld-linux-x86-64.so.2 (0x00007fb58d12b000)

Linuxis

ldconfig -p

BSD's

ldconfig -r

Praktiliselt kõikjal on linuxis kasutusel dünaamiline linkimine, s.t. elf sisaldab viiteid libradele. Kernel otsib enne elf-i käivitamist vajalikud librad ja mätsib kõik funktsioonide väljakutsed sümbolite järgi, vt ntx

$ readelf -s /usr/sbin/postfix
...
     1: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND getenv@GLIBC_2.2.5 (2)
     2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND free@GLIBC_2.2.5 (2)
...

Ja

$ readelf -s /lib64/libc.so.6
...
  1295: 000000000003a920   213 FUNC    GLOBAL DEFAULT   12 getenv@@GLIBC_2.2.5
  2209: 0000000000082850   136 FUNC    GLOBAL DEFAULT   12 free@@GLIBC_2.2.5
...

Lõpus olev GLIBC_2.2.5 tähendab siin sümboli versiooni, mida uuendatakse ainult siis, kui funktsiooni käitumine muutub. Tegelikult siin /lib64/libc.so.6 pärit näiteks pakist glibc-2.19.

Kui glibc värskendamisel versioonihüpe pole väga suur, võib juhtuda, et kogu opsüsteem kasutab juba viimase versiooni sümboleid ja siis pole teiste programmide uuendamine ehk userlandi vajalik.

Ingliskeelsed viited

Eestikeelsed viited