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

Allikas: Kuutõrvaja
22. rida: 22. rida:
 
TODO
 
TODO
  
There are two Linux C/C++ library types which can be created:
+
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.
  
*Static libraries (.a): Library of object code which is linked with, and becomes part of the application.
+
*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".
*Dynamically linked shared object libraries (.so): There is only one form of this library but it can be used in two ways.
 
Dynamically linked at run time but statically aware. The libraries must be available during compile/link phase. The shared objects are not included into the executable component but are tied to the execution.
 
Dynamically loaded/unloaded and linked during execution (i.e. browser plug-in) using the dynamic linking loader system functions.
 
  
 
ldd käsk
 
ldd käsk
53. rida: 51. rida:
  
 
* http://viki.pingviin.org/Kuidas_kompileerida_programmi_Linuxis
 
* http://viki.pingviin.org/Kuidas_kompileerida_programmi_Linuxis
 +
 +
* http://et.wikipedia.org/wiki/Linkur

Redaktsioon: 1. september 2013, kell 11:27

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

Ingliskeelsed viited

Eestikeelsed viited