Dobry, dik za predosle reakcie
Kedze toto je serial, ktory sa zaobera kernelovymi vecami, tak sa to pytam tu, lebo je tu dost velka sanca, ze mi niekto odpovie...
Ako sa v linuxe dynamicky linkuje? Co robi pri linkovani kernel a co robi ld.so? Je to tak, ze kernel natiahne spustitelny subor a prip. kniznice (na ake miesto?) a potom sa linker stara o "linkovanie"?
A ked sa aplikacia spusta druhy raz, musi sa to znova linkovat? Nebolo by lepsie, len nahrat spust. subor na spravne miesto, tak aby to sedelo s uz predtym zlinkovanou (tou istou) aplikaciou a namapovat to?
Bol by som rad, keby mi to niekto vysvetlil, dost mi to neda spavat a na to, aby som sa vrtal v kerneli nemam ani cas a ani tak dobre neviem C.
Kvůli jednoduchosti kernel nemá žádnou podporu linkování. Linkování dělá kompletně program /lib/ld-linux.so.2. Kernel pouze namapuje ld-linux.so do paměti. Program a knihovny se linkují pomocí syscallu mmap. Dynamické knihovny musí být přeloženy jako speciální position-independent code (flags -fPIC u gcc), což způsobí, že kód bude fungovat bez ohledu na adresu, na které se nachází v paměti. Program být s tímto příznakem přeložen nemusí, protože je vždy na stejné adrese. Dynamické knihovny sice fungují i bez -fPIC, ale pak žerou paměť pro každý proces, který si je nalinkuje, a pomalu se zavádějí.
ld-linux.so do paměti namapuje program i knihovny a do speciálních míst za program i knihovny umisťuje tabulky odkazů na funkce a (v případě knihoven) proměnné.
Linkování může urychlit program prelink, který napsal Jakub Jelínek. Ten umožní, aby správce systému knihovny a programy "předlinkoval" --- vyrobí se hotové tabulky odkazů na funkce a proměnné ke každému programu a dynamické knihovně, při spouštění se nemusí vyhledávat symboly, a provede se pouze mmap těchto tabulek.