Hlavní navigace

Unixová komprese v praxi: UPX

Petr Krčmář

Používáte starší stroj s malým diskem nebo chcete prostě ušetřit nějaký ten megabajtík? Stahujte UPX!

Řada z nás, Linuxáků, ještě pořád používá počítače, které už dávno nepatří mezi špičkové stroje, ale je nám líto je vyhodit, protože pro nás můžou pořád ještě udělat dost práce. Co ale dělat, když nám na takovém stroji začíná pomalu docházet místo na disku a my ještě nějaké potřebujeme? Komprimovaný souborový systém je pro zápis nevhodný, smazat už nic nemůžeme. Nemusíme ale hned přistupovat k výměně disku za větší, když máme UPX.

UPX (Ultimate Packer for eXecutables) je výkonný kompresní program, určený pro kompresi spustitelných souborů různých formátů. Podporuje formáty atari/tos, djgpp2/coff, dos/com, dos/exe, dos/sys, linux/386, rtm32/pe, tmt/adam, watcom/le, in32/pe, vmlinuz/386, linux/elf386 a ps1/exe. Umí zkomprimovat i skripty. Jak vidíte, je jich hodně, nechybí linuxové elf386, ale ani uživatelé Windows nepřijdou zkrátka, existuje i verze pro ně.

UPX používá kompresní knihovnu NRV, která ovšem není free. Je velmi výkonná a je navržena pro rychlou kompresi binárních dat. Můžete taky použít free implementaci kompresního algoritmu UCL, která je sice kompatibilní, ale už ne tak výkonnou variantou.

Velkou výhodou UPX je, že ke komprimovanému souboru přidá ještě spustitelný kód, který umožní automatickou transparentní dekompresi a následné spuštění souboru, takže i když je binárka komprimovaná, lze ji bez problému spustit a samorozbalovací kód, který do ní UPX přidal, se postará o dekompresi. V poslední verzi přináší UPX velmi příjemnou novinku, a tou je přímá dekomprese ELF binárek do paměti. Není tedy potřeba žádný odkládací prostor na disku, kam by se soubory před spuštěním rozbalovaly, jak je tomu u jiných linuxových formátů. Díky dobré práci s pamětí se ale ani při tomto neprojeví výraznější zpomalení. Na potřebu odkládacího tmp adresáře ale nesmíte zapomínat při použití například u bootovatelné­ho CD.

Na stránkách projektu jsou k dispozici jak zdrojové kódy, tak již zkompilované balíčky pro Linux, MS Windows a DOS.

Použití je velmi jednoduché. Jako parametr stačí zadat jméno binárky, kterou chceme komprimovat. Uvidíme pěkný průběh komprese a hotovo, soubor je zkomprimován. Jeho původní podoba zmizí, pokud nepoužijeme parametr -k, který nám umožní zachování původního souboru, za jehož název se vloží tečka a vlnka. Pokud potřebujeme původní soubor, použijeme parametr -d (jako decompress).

Pro uživatele MSWindows jsou v UPX velice zajímavé možnosti komprese ikon v souborech. Můžete zkomprimovat všechny, žádnou, nebo všechny kromě první. Komprimovaný program si pak zachová svoji původní ikonu.

Další volbou, která se může hodit, je -l. Takto UPX zobrazí informace o zkomprimovaném souboru jako komprimovaná velikost, původní velikost, kompresní poměr a podobně.

Zajímalo mě, jakých výsledků lze s UPX dosáhnout v praxi. Udělal jsem si proto kopii adresářů /bin, /sbin, /usr/bin do jednoho pracovního adresáře. Celá tahle „kompilace“ obsahovala 1377 souborů a zabírala 107 MB prostoru na disku. Pak jsem všechny soubory nechal zkomprimovat pomocí UPX.

Komprese trvala na Duronu 1.1 GHz přesně 5 minut a 41 sekund. Výsledkem byl adresář o velikosti 49.3 MB. Myslím, že je to solidní výsledek. Padesát ušetřených megabajtů může být někdy opravdu hodně.

Nevýhodou UPX je, že na komprimované soubory nelze použít ldd, přesněji řečeno možné to je, ale nic kloudného se nedozvíte. Stejně na tom budete i při použití size. Soubor je tedy nejdříve nutno rozbalit. Další nevýhodou může být zpomalení při startu některých aplikací. Bohužel jsem neměl k dispozici žádný pomalejší stroj, na kterém bych vyzkoušel rozdíl ve startu nějakého programu. Ale budu rád, když to někdo třeba s 386kou zkusí a napíše do diskuse pod článkem rozdíl v době startu. Na silnějších strojích je rozdíl nepozorovatelný.

UPX se nehodí pro všechny druhy spustitelných souborů. Programy, které při práci čtou data z vlastního souboru (typicky některé perlové skriptíky) nebudou po kompresi pomocí UPX fungovat, protože uvidí jenom komprimovanou podobu, se kterou si nedokáží poradit. Dekomprimovaná kopie z tmp se totiž maže ihned po spuštění. Také se nedoporučuje komprimovat soubory se sticky-bitem kvůli hrozícím bezpečnostím problémům. Rovněž knihovny ke kompresi spíše nedoporučuji, protože pak nefunguje sdílení knihoven v paměti a pro každou aplikaci musí být v paměti samostatná kopie, což zvláště na již zmíněných starších strojích může dělat problémy.

I přes některé záporné vlastnosti plynoucí již z principu komprese spustitelných programů je UPX velmi užitečným nástrojem, který si jistě najde své místo na discích mnoha z nás.

Našli jste v článku chybu?