Portál AbcLinuxu, 3. května 2025 00:49
Balíky můžou být v Linuxu linkované dvojím způsobem: Buď staticky nebo dynamicky.Omyl, linkují se binárky, které se balí do balíků společně s jinými soubory. Tahle drobná nepřesnost vede bohužel dále v textu k naprosto zcestným závěrům. Nadále budu statický balík považovat za běžný balík se staticky slinkovanými binárkami nebo s přibalenými dynamickými knihovnami (takhle se obvykle distribuují uzavřené komerční programy, pro naše účely je to totéž)
Výhoda dynamicky linkovaných balíků je ta, že se šetří místo na disku … Další výhoda je, že se šetří paměťNejvětší, ale zcela opomenutá výhoda je, že jedinou instanci binárky/knihovny lze snáze udržovat a upgradovat. Dnešní systémy mají tisíce knihoven a i jednoduché programy linkují mnoho z nich. Kdyby bylo všechno staticky linkované, vyžadoval by upgrade jedné knihovny reinstalaci mnoha balíků. zlib, jpeg nebo glib jsou příklady malých knihoven kde by kilobajtová změna reinstalovala prakticky celý systém. A i u méně exponovaných knihoven rozměry závisejících balíků podstatně převyšují velikost samotné knihovny - to je koneckonců princip celé věci. Neupgradovat všechny závislé balíky není řešení. Většina upgradů záplatuje nějaké chyby, tudíž o ně budu stát. Hlavně se ale nemůžu vyhnout upgradům které záplatují díry bezpečnostní.
U statických balíků neexistuje tak zvané peklo závislostí.A hned první tragicky omyl způsobený záměnou balíku za binárku. Závislosti jsou vlastnosti balíku a problémy s nimi jsou způsobeny špatně zabaleným balíkem nebo špatným balíčkovacím systémem. Statickým linkováním nebo balením knihoven se lze sice těmto problémům vyhnout, ale to je léčení příznaků místo příčin.
Ale musíme myslet taky na takové lidi, kteří nemají přístup k internetu. Ti nemůžou využít automatické řešení závislostiDitto, autor potřebuje změnit balíčkovací systém na takový, který umí vyčíslit závislosti předem. Třeba můj systém (portage) má možnost nechat si všechny závislosti vypsat do souboru vhodného k předhození wgetu. Dokonce jsem tak i jeden systém nainstaloval.
Statický balík je kompatibilní s různými distribucemi a verzemi Linuxu, je víceméně univerzální.Za prvé, čistě statickou binárku nelze ve skutečnosti udělat. I když vše slinkujeme se -static, bude binárka z ne úplně triviálních důvodů za běhu linkovat část libc. Bude sice podstatně odolnější, protože libc se mění málo, ale stoprocentní kompatibilita to není. Za druhé, což je mnohem důležitější, statické linkování neřeší změny v API, resp. řeší je tím, že jim brání. Přitom právě to je největší problém při přenášení balíků mezi distribucemi. Třeba balík z blbuntu nebude na mém systému chodit, ať už je slinkovaný jakkoliv, prostě proto že nemám Pulse Audio. Doma, nemaje tiskárnu, neběhám cups démona. Můžu mít/nemít FAM nebo jiné démony, jiný layout filesystému a práv, bezpečnostní moduly, adresářové služby, změny v kernelu et cetera et cetera. Přenositelnost mezi distribucemi a verzemi je podstatně složitější problém než jen linkování. Jediná spolehlivá metoda je pokusit se zastavit čas a neupgradovat vůbec nic. Na to ale není třeba statické linkování.
Tiskni
Sdílej:
Za prvé, čistě statickou binárku nelze ve skutečnosti udělat. I když vše slinkujeme se -static, bude binárka z ne úplně triviálních důvodů za běhu linkovat část libc. Bude sice podstatně odolnější, protože libc se mění málo, ale stoprocentní kompatibilita to není.Compiling without libc
/etc/nsswitch.conf
. A to i když je zbytek libc linkován staticky. Což je logické, během překladu nemůže vědět jestli na cílovém systému nebude náááhodou třeba NIS Ditto, autor potřebuje změnit balíčkovací systém na takový, který umí vyčíslit závislosti předem. Třeba můj systém (portage) má možnost nechat si všechny závislosti vypsat do souboru vhodného k předhození wgetu. Dokonce jsem tak i jeden systém nainstaloval.Deb a Yum je zase umějí postahovat do předem zadaného adresáře.
Cannot mix incompatible Qt libraries
a nespusti se. uz sem to hlasil v AURu a taky primo autorovi, ale oba delaji jako by to vsem fungovalo a zadnej problem neexistoval ...
LD_LIBRARY_PATH=./lib ldd xnview | grep Qt
a potom v lib adresári LD_LIBRARY_PATH=. ldd *.so.4 | grep Qt
či tam nenájdeš kde sa vlastne používa systémové Qt. (predpokladám ale, že žiadny problém nenájdeš, práve kvôli Xn v názvoch knižníc)
[kotyz@behemot XnViewMP-026]$ LD_LIBRARY_PATH=./lib ldd xnview | grep Qt
libQtWebKitXn.so.4 => ./lib/libQtWebKitXn.so.4 (0xb66f5000)
libQtGuiXn.so.4 => ./lib/libQtGuiXn.so.4 (0xb5be3000)
libQtCoreXn.so.4 => ./lib/libQtCoreXn.so.4 (0xb593d000)
libQtXmlPatternsXn.so.4 => ./lib/libQtXmlPatternsXn.so.4 (0xb544c000)
libQtNetworkXn.so.4 => ./lib/libQtNetworkXn.so.4 (0xb5315000)
libQtSvgXn.so.4 => ./lib/libQtSvgXn.so.4 (0xb52bb000)
libQtXmlXn.so.4 => ./lib/libQtXmlXn.so.4 (0xb5271000)
[kotyz@behemot lib]$ LD_LIBRARY_PATH=. ldd *.so.4 | grep Qt
libQtCore.so.4:
libQtCoreXn.so.4:
libQtGui.so.4:
libQtCoreXn.so.4 => ./libQtCoreXn.so.4 (0xb6a07000)
libQtGuiXn.so.4:
libQtCoreXn.so.4 => ./libQtCoreXn.so.4 (0xb69bd000)
libQtNetwork.so.4:
libQtCoreXn.so.4 => ./libQtCoreXn.so.4 (0xb73a8000)
libQtNetworkXn.so.4:
libQtCoreXn.so.4 => ./libQtCoreXn.so.4 (0xb74ea000)
libQtOpenGL.so.4:
libQtGuiXn.so.4 => ./libQtGuiXn.so.4 (0xb6bef000)
libQtCoreXn.so.4 => ./libQtCoreXn.so.4 (0xb6949000)
libQtOpenGLXn.so.4:
libQtGuiXn.so.4 => ./libQtGuiXn.so.4 (0xb6c41000)
libQtCoreXn.so.4 => ./libQtCoreXn.so.4 (0xb699b000)
libQtSvg.so.4:
libQtGuiXn.so.4 => ./libQtGuiXn.so.4 (0xb6c63000)
libQtCoreXn.so.4 => ./libQtCoreXn.so.4 (0xb69bd000)
libQtSvgXn.so.4:
libQtGuiXn.so.4 => ./libQtGuiXn.so.4 (0xb6c1b000)
libQtCoreXn.so.4 => ./libQtCoreXn.so.4 (0xb6975000)
libQtWebKit.so.4:
libQtXmlPatternsXn.so.4 => ./libQtXmlPatternsXn.so.4 (0xb60d3000)
libQtGuiXn.so.4 => ./libQtGuiXn.so.4 (0xb560f000)
libQtNetworkXn.so.4 => ./libQtNetworkXn.so.4 (0xb54d8000)
libQtCoreXn.so.4 => ./libQtCoreXn.so.4 (0xb5231000)
libQtWebKitXn.so.4:
libQtXmlPatternsXn.so.4 => ./libQtXmlPatternsXn.so.4 (0xb61ef000)
libQtGuiXn.so.4 => ./libQtGuiXn.so.4 (0xb572b000)
libQtNetworkXn.so.4 => ./libQtNetworkXn.so.4 (0xb55f4000)
libQtCoreXn.so.4 => ./libQtCoreXn.so.4 (0xb534d000)
libQtXml.so.4:
libQtCoreXn.so.4 => ./libQtCoreXn.so.4 (0xb75c9000)
libQtXmlPatterns.so.4:
libQtNetworkXn.so.4 => ./libQtNetworkXn.so.4 (0xb71d7000)
libQtCoreXn.so.4 => ./libQtCoreXn.so.4 (0xb6f31000)
libQtXmlPatternsXn.so.4:
libQtNetworkXn.so.4 => ./libQtNetworkXn.so.4 (0xb7153000)
libQtCoreXn.so.4 => ./libQtCoreXn.so.4 (0xb6ead000)
libQtXmlXn.so.4:
libQtCoreXn.so.4 => ./libQtCoreXn.so.4 (0xb752b000)
libQtGuiXn.so.4 => ./libQtGuiXn.so.4 (0xb6d8a000)
libQtCoreXn.so.4 => ./libQtCoreXn.so.4 (0xb6ae4000)
Statickým linkováním nebo balením knihoven se lze sice těmto problémům vyhnout,I to pouze omezeně. Velká část dependency hellu vzniká jinými typy závislostí než závislostmi na dynamicky linkovaných knihovnách.
Vynikající! Něco takového jsem už dlouho chtěl. Proti jiným distribucím je to velký pokrok. Výhoda je, že každý program má svůj podadresář a v něm všechny soubory, které k tomu programu patří. Všechno je přehledně uspořádané, roztříděné a je pěkně vidět, co k čemu patří. Na rozdíl od jiných distribucí, ve kterých jsou soubory všech programů různě rozhazané po celém systému, bez jakéhokolv třídění, je v tom nepořádek a je to velmi nepřehledné. Já vím, že existují skripty, ve kterých je zapsané, ke kterému programu který soubor patří, takže přidat nebo odebrat program, se vším, co k němu patří, není problém, ale není to ono. Přijde mi to stejné, jak kdybych měl nepořádek ve věcech a všechny věci různě rozhazané a netříděné a vůbec neměl uklizené a místo úklidu bych si pořídil sešit, do kterého si jenom zapíšu, kde mám kterou věc, abych ji našel. Právě proto se mi Gobo Linux líbí, protože mám rád pořádek. Líbí se mi taky jakým způsobem jsou sestavené balíky, způsob instalace a odinstalace balíků, a taky to, že má oproti jiným distribucím přehlednější kompilací. Zřejmě bych našel i další výhody této distribuce.
Začal jsem se o Gobo Linux zajímat, ale mám pocit, že se asi přestal vyvíjet, protože nikde na internetu jsem neobjevil novější verzi, než z roku 2006. Stejně tak novější články jsem na internetu nenašel. Když jsem se díval do repozitářů Gobo linuxu, verze programů jsou tam dost zastaralé a některé novější programy tam nejsou vůbec. Například Audacity je tam nanejvýš ve verzi 1.2.3, Jamin tam není vůbec a tak dále. Tak by mě zajímalo, jak je to s vývojem této distribuce. Opravdu se přestala vyvíjet? Pokud se to přestalo vyvíjet, je to škoda, protože nic tak vynikajícího jsem neviděl. Nebo se změnil jenom název, jako například Mandrake na Mandrivu?
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.