Nefunkcni py-lxml

Dan Lukes dan at obluda.cz
Mon Sep 21 22:03:08 CEST 2009


Miroslav Prýmek napsal/wrote, On 09/21/09 20:27:
>>> --> Vsiml jsem si, ze portupgrade vypisuje "Backing up the old version",
>>> ale nejak netusim, kde ji najit...

Tak to zhlavy nevim. Bud' ti poradi nekdo tady, nebo Google, nebo si 
vytvoreny balik anjdes findem.

> Je to treba tady: http://www.freebsd.org/doc/en/books/handbook/anoncvs.html

Tam to vypada, ze vycet "anoncvs" serveru je uplny a neprilis dlouhy. 
Jinak je ale stranka zastarala - uvadena "cena" za pouziti cvsup 
(nutnost instalace programu) jzi delsi dobu neplati. C varianta tohoto 
programu, csup, je soucasti zakladni instalace.

> Nicmene v tomhle jsme si nerozumeli - kdyz jsem psal "po kompilaci", tak 
> jsem tim myslel "kompilaci balicku"
> - kompilaci, linkovani, ...., instalaci. Takze spravne otazka mela znit 
> "jaktoze se balicek bez problemu prelozi
> a nainstaluje, kdyz mu chybi nejaky symbol v knihovne, kterou pouziva" - 


Tak zaprve - my se celou dobu bavime o problemu pri pouziti knihovny:

> ImportError: /usr/local/lib/python2.5/site-packages/lxml-2.2.1-py2.5-freebsd-7.2-RELEASE-i386.egg/lxml/etree.so: Undefined symbol "xsltProcessOneNode" 

Nas problem je, ze knihovna etree.so vyzaduje, aby nekdo z venku (v 
tomto pripade dokonce vime kdo - libxml knihovna) dodal implementaci 
symbolu a ona ho nedodava.

Jinak ale - moje vysvetleni bylo zjednodusene a ty se ptas an neco, co 
zjednoduseny vyklad nepostihl. Zaprve jsem zanedbal rozdil mezi 
statickymi a dynamickymi knihovnami (a linkovanim) a za druhe jsem 
nezminil, ze "linkovani" nemusi nutne probehnout v jednom kroku.

Zacnu tim druhym - muzes slinkovat dva objekty a ziskat objekt novy. Ten 
muze byt znovu predmetem linkovani pozdeji.

To prvni je slozitejsi. Kdyz jsem mluvil o finalnim spustitelnem 
programu tak ve skutecnosti ne kazdy program, ktery ti lezi na disku je 
v tomto stavu. Uvaz ze urcite funkce pouziva prakticky kazdy program. 
malloc(), printf(), exit(), ...

Kdyby byly vsechny programy ulozeny na disku v tim stavu, v jakem jsem 
zjednodusene popsal - to jest - u kazdeho symbolu by byla nakonec 
pripojena i implementace, byla by spousta kodu v naprosto identicke 
variante na disku mnoho a mnohokrat. To je jednak skoda mista na disku, 
druhak, totez by platilo i pri natazeni kodu programu do pameti pri 
spusteni. Co spusteny program, to pamet zabrana identickou implementaci 
funkce exit().

Ve lze jako spustitelny soubor na disk ulozit nedolinkovany "polotovar" 
s odkazem na (dynamicke) knihovny, ktere je treba dolinkovat, nez bude 
mozne kod spustit. To co lezi na disku jako spustitelny program tak 
jeste neni primo spustitelne - jeste to musi prijit poslednim 
(dynamickym) linkovanim, ktere se provadi v okamziku, kdy prijevis zajem 
program spustit. A tak vetsian programu v sobe exist() nema - jen 
nevyreseny symbol "exit". A k tomu informaci, ze k programu je treba 
pripojit libc. V te se implementace exit() nachazi. Pro vsechny takove 
polotovary je tak na disku implementace exit jen jednou - a co je jeste 
lepsi - jen jednou bude i v pameti bez ohledu na to, kolik programu 
pouzivajicich tuto funkci z dynamicke knihovny pobezi.

Ma to ale jeden negativni efekt - muze se stat, ze "polotovar" nepujde 
spustit. Staci aby libc chybela nebo byla poskozena. Nebo tam byla nova 
verze, ve ktere implementace exit() chybi.

To posledni popisuje pripad, ktery se stal tobe.

> No a me slo o to, ze nevim, jak vnitrne to linkovani presne funguje - 
> predpokladam,
> ze .so objekt ma v sobe nejaky zaznam "potrebuju objekty libprvni.so.1 a 
> libdruha.so.2"
> a pak ma seznam nedefinovanych symbolu, kterej se ale resi az tehdy, kdy 
> se symbol skutecne
> pouzije nebo co...

V podstate presne tak.

.so (shared object, sdilena nebo take dynamicka knihovna) je normalni 
objekt v tom smyslu, ze obsahuje seznam "toto exportuju pripadnym dalsim 
zajemcum" a "toto jsou moje nevyresene symboly". Navic (v porovnani se 
statickymi .o objekty) ma seznam dalsich dynamickych knihoven, ktere se 
automaticky pridaji do seznamu linkovanych objektu jakmile je pridana 
tato knihovna.


> Pomoci ldd potom muzu zjistit, jestli jsou k dispozici vsechny tyhle 
> objekty, 

Ano

> ale nezjistim, jestli
> jsou k dispozici skutecne vsechny symboly, ktery jsou nedefinovany...

Ano. To se zjisti jedine tak, ze nechas probehnout linkovani. navzdory 
tomu, ze jsem nahore napsl, ze finalni linkovani probiha az v ramci 
spusteni, i to bylo trochu zjednoduseni. Muzes zadat "pokusne slinkuj, 
ale vysledek nespusti" (man rdlt hledej LD_TRACE_LOADED_OBJECTS)


> # gcc -shared myapp.o -o libmyapp.so
> prestoze je tam ten nedefinovanej symbol myLibFunc (v knihovne je 
> myLibFuncX)

Jasne - vyrabis knihovnu. V te je normalni, ze existuji nezresolvene 
symboly.


> Porad nerozumim tomu, proc je mozny vytvorit knihovnu, ktera ma nejaky 
> nedefinovany symboly, ktery nejsou v dobe jejiho prekladu k dispozici v zadne z 
> knihoven, ktery linkuje

Asi to moje vysvetlovani neni tak dobre. Rikal jsem, ze kompilace je vec 
s linkovanim zcela nesouvisejici. Otazka "jake jsou symboly v knihovnach 
v okamziku kompilace" nema smysl.

Jinak je ale odpoved "a proc ne" ?

Jestli takovy vysledek nechces, tak ho nedelej. Okontrolovat, jestli to 
nastalo nebo ne, muzes, jestli se tak rozhodnes.

Jsou ale situace, kdy to tak muzes chtit. Nakonec - nevytvaris finalni 
produkt, ten se bude vytvaret az nekdy jindy (a mozna nekde uplne 
jinde). Tam nekde mozna vse potrebne k dispozici bude. Neni duvod ti 
branit abys tady a ted nesmel vytvorit "polotovar", ktery pak a tam 
uspesne pouzijes. Ze tady nemas knihovnu k dispozici ? A proc. 
Nepotrebujes ji - tady to spustet nechces. Tady kompilujes (a mozna 
provadis nektere dilci linkovaci kroky, ne vsak finalni sestaveni).



						Dan



P.S. Mam dojem, ze se zaciname dotykat hranice off-topis - a to navic z 
te spatne strany. Tohle co tu probirame jsou dost obecne veci, s FreeBSD 
souvisejici jen v tom smyslu, ze "tam je to taky tak". Trochu se obavam, 
ze se blizime tomu, kdy by to uz mohlo nekoho, pravem, obtezovat. Pokud 
si nekdo prave rika "konecne ho to napadlo" - neobavejte se v takovych 
pripadech postezovat si moderatorovi (mimo konferenci). Zajisti, aby se 
to nedelo. S takrka nulovou zpetnou vazbou je nekdy tezke odhadnout, co 
je zajimave/uzitecne a co nudne a obtezujici.




More information about the Users-l mailing list