bezpecny upgrade systemu
Dan Lukes
dan at obluda.cz
Thu Oct 20 11:49:16 CEST 2005
Divacky Roman wrote:
> nepochopil jsem jaka je logika v meneni verzi knihovena ale urcite to neni tak
> jak to rikas (prestoze to zni logicky)
Ta pasaz o "minor" cislech byla v soucasnosti uz opravdu neplatna, ta
pasaz tykajici se "major" cisel plati.
> proto to libmapovani vetsinou chodi...
Vetsinou chodi znamena "obcas nechodi". V zavislosti na tom co se
zmenilo a jake volas funkce knihovny s jakymi parametry. A to je presne
to, co jsem rikal ja.
> nehlede nato - api takovych tech "fakt zakladnich" (libc, libpthread) knihoven je definovano
> mimo fbsd (posix, ISO C atd.) tj. menit api ani nejde (nemluvim o abi)
No, jenze tady prave mluvime o ABI. Linkujes uz prelozene veci a ty
spolu komunikuji na binarni urovni. Jestlize knihovni funkce vracela
strukturu sTest a program z ni smel pro sve ucely pouzivat polozku
sTest->name a nova verze knihovny to dela totez, pak API se nezmenilo (a
posiz, ISO a dalsi certi muzou byt klidni). API se nezmenilo, to
znamena, ze muzes vzit zdrojove kody a ony pujdou znovu PRELOZIT pri
zachovani identicke funkcnosti jako puvodne.
Ona nova verze knihovny se stejnym API ale ma jine ABI - poradi polozek
v one strukture je jine a polozka 'name' neni "po novu" hned na zacatku
struktury, ale az na offsetu +4. Pokud program znovu prelozis, pak se
pouziji aktualizovane header soubory a program bude 'name' hledat na
spravnem miste. Pokud program neprelozis, ale jen prilinkujes k nove
verzi knihovny, pak program dostane strukturu - a tak jak je prelozen -
v ni 'name' pouziva na puvodnim offsetu 0.
Dopady na funkcnost software jsou nepredikovatelne. Nektere knihovni
funkce funguji beze zmenu (at uz proto, ze jejich ABI zustalo nezmenene
nebo proto, ze program pouziva jen takove promenne, ktere, nahodou, jsou
na stejnych mistech jako byly v minule verzi), jine nefunguji vubec,
protoze nesoulad v promennych je prilos velky, nektere "jen" delaji neco
jineho nez maji - napriklad nikdy kladne neoveri dodane jmeno a heslo,
protoze knihovan nehleda v predanych parametrech jmeno a heslo tam, kde
ji ho pripravil program, ale jinde, takze ke shode nedojde).
Uz je jasnejsi, proc "prilinkovani knihovny jine verze" funguje jen
statisticky ?
> to ze to libmapovani neni ciste a pekne je jasne ale funguje to
No, to je prave predmet sporu. Ano, muze to dokonce i fungovat. Jenze
taky nemusi. A nelze bohuzel snadno poznat, ktera varianta nastane.
Nekdy dokonce neni ani snadne poznat, ktera varianta nastala (v dobe,
kdy to uz provozujes). Obzvlast neprijemne by to mohlo byt kdyz si
podobnym zpusobem prilinkujes k zalohovacimu programu jinou
'libarchive'. Vsechno bude fungovat skvele. Az za tri roky budes tu
zalohu potrebovat a archiv ti nepujde rozbalit, protoze "lhani pri
vytvareni archivu" zpusobilo, ze archiv ma vnitrne vadnou strukturu,
kterou dokaze pouzit jen presne stejna "lziva kombinace" programu a
knihovny, budes si proste muset vzpomenout jakou presnou kombinaci jsi
pri zalohovani pouzil. A, po trech letech, takovou kombinaci znovu
sehnat a stvorit.
Ne, ze bych ti to pral doopravdy. To je jen priklad toho, jak je
nebezpecne lhat. I kdyz lzes jen svym programum ...
Dan
More information about the Users-l
mailing list