[ LUGOS ] ld ne najde libX11

Andrej Presern andrejp na luz.fe.uni-lj.si
Sre Dec 10 16:11:17 CET 1997


Metod Kozelj wrote:
> 
> Howdy!
> 
> > > Tole v resnici ne pravi loader temvec linker. Ce jaz kaj vem, potem
> > > linker po defaultu isce knjiznice samo v /lib in /usr/lib.
> > > Vse ostale lokacije mu moras povedat z -L/path/to/libraries
> >
> > Zraven pa se pogleda v dire, ki so navedeni v /etc/ld.so.conf.
> 
> Wrong, wrong, wrong.
> 
> Mesate jabolka in jablane.
> 
> LOADER /lib/ld.so gleda v /etc/ld.so.cache
>    poganja ga ... hmmm ... kernel? ... ko se pozene program. ld.so potem
>    nalozi vse potrebne sharane knjiznice, katerih lokacije najde v
>    /etc/ld.so.cache. Poleg teh lokacij poisce sharane knjiznice se v
>    nekaterih direktorijih: nekateri so prevedeni v sam loader, drugi
>    so nasteti v spremenljivki LD_LIBRARY_PATH, tretji pa kar v sam
>    executable.
> 
> KONFIGURATOR /sbin/ldconfig gleda v /etc/ld.so.conf in naredi  /etc/ld.so.cache
>    Navadno se ga pozene ob startu sistema (iz rc skript), ce pa se
>    instalira nove sharane knjiznice, pa tudi vmes.
> 
> LINKER /usr/bin/ld iz .o fajlov z uporabo knjiznic (staticnih in sharanih)
>    naredi executable. No, pa se kaj drugega, recimo sharane knjiznice.
>    Navadno ga ne klicemo direktno, ampak ga klice kar prevajalnik.
>    Poti, v katerih isce knjiznice, ki jih mora linkati, so deloma
>    prevedene v sam program, ostale pa mu moramo podati kot opcije
>    (-L/prva/pot -L/druga/pot ...). V executable shrani tudi direktorije,
>    v katerih naj LOADER potem isce knjiznice. Navadno vkljuci vse
>    poti, podane z -L, lahko pa mu ukazemo dodati se kaksno pot.
> 
> Upam, da po zgornji razlagi ne bo vec mesanja jabolk in jablan.

To, cemur ti pravis LOADER, je v resnici ELF interpreter. ELF, oz.
Executable Linkable Format je format, ki, kot pove ime, definira
obliko izvrsilnih in povezljivih datotek, in ki vsebuje podporo
razlicnim vrstam sistemov. Ta podpora je izvedena v obliki t.i.
'interptererja', ki zna izvrsiti posamezne oblike izvrsilnih
datotek. Ce so datoteke linkane staticno, obicajno interpreter ni
naveden, ce pa so datoteke linkane dinamicno, je interpreter tisti,
ki nalozi deljene knjiznice, ki jih program potrebuje za svoje
normalno delovanje (zato se temu interpreterju vcasih rece tudi
run-time linker). Tisti, ki ste presaltali na glibc oz. imate
sistem z obema verzijama libc (libc5 in libc6 oz. glibc), ste
verjetno ze opazili, da imate v /lib dva taksna interpreterja,
ld-linux.so.1, ki je interpreter za staro libc (5), in
ld-linux.so.2, ki je interpreter za novo libc (glibc, oz. libc 6).

Konfigurator, oz. ldconfig, je pomozni program interpreterja, ki
pohitri iskanje deljenih knjiznic, ki jih dolocen program potrebuje
za svoje normalno izvrsevanje, saj jih lahko hitro poisce v svojem
cacheju, namesto da bi jih ob zagonu vsakega programa iskal po celem
sistemu.

Linker oz. ld v program obicajno ne shrani direktne poti do knjiznic,
ampak le navede njihova imena in verzije, iskanje konkretne poti do
knjiznice pa prepusti interpreterju, saj nimajo vsi sistemi knjiznic
shranjenih na istem mestu, kar bi ob binarni distribuciji seveda
povzrocalo nemalo preglavic.

Ob zagonu programa kernel najprej nalozi image datoteke (enostaven
mmap(), cesar stranski efekt je page loading on demand), nato pa, ce
v datoteki obstaja posebna sekcija .interp, v kateri je zapisana pot
do run-time linkerja, nalozi program, ki je naveden v tej sekciji
in mu prepusti kontrolo.

Andrej





Dodatne informacije o seznamu Starilist