вторник, 20 апреля 2010 г.

Создание LiveCD Slackware based: ч.4.2 Откручиваем GTK+2 от HTPC

Сейчас мы рассмотрим прием, который в дальнейшем будем активно применять.
Суть в следующем. на HTPC установлена программа для работы с джойстиком Rejoystick которая для своей работы требует GTK+2 интерфейс. Сама программа весит 14 килобайт, а GTK более 10 МЕГАбайт. Такое положение меня совершенно не устраивает. Но rejoystck прекрасно работает в демоническом режиме, протестирована мною более года, под нее давно написаны скрипты и конфиги, одним словом - отказываться я от нее не собираюсь. Что же делать? Все очень просто, от GTK мы оставим в системе только те динамические библиотеки которые нужны для работы программы Rejoystick, а остальное удалим. таким образом у нас вместо шести пакетов gtk+2 будет один свой что-то вроде rejoystck-lib или если следовать slackware-style один пакет rejoystick содержащий саму программу и его зависимости.

Ближе к делу. Вводим список слинкованых библиотек:
ldd /usr/local/bin/rejoystick
        linux-gate.so.1 =>  (0xffffe000)
        libXtst.so.6 => /usr/lib/libXtst.so.6 (0xb774f000)
        libgthread-2.0.so.0 => /usr/lib/libgthread-2.0.so.0 (0xb774b000)
        libSDL-1.2.so.0 => /usr/lib/libSDL-1.2.so.0 (0xb76ba000)
        libXrandr.so.2 => /usr/lib/libXrandr.so.2 (0xb76b3000)
        libvga.so.1 => /usr/lib/libvga.so.1 (0xb7634000)
        libpthread.so.0 => /lib/libpthread.so.0 (0xb7614000)
        libgtk-x11-2.0.so.0 => /usr/lib/libgtk-x11-2.0.so.0 (0xb7287000)
        libgdk-x11-2.0.so.0 => /usr/lib/libgdk-x11-2.0.so.0 (0xb71fe000)
        libatk-1.0.so.0 => /usr/lib/libatk-1.0.so.0 (0xb71e4000)
        libgdk_pixbuf-2.0.so.0 => /usr/lib/libgdk_pixbuf-2.0.so.0 (0xb71cc000)
        libpangocairo-1.0.so.0 => /usr/lib/libpangocairo-1.0.so.0 (0xb71c2000)
        libpangoft2-1.0.so.0 => /usr/lib/libpangoft2-1.0.so.0 (0xb719a000)
        libpango-1.0.so.0 => /usr/lib/libpango-1.0.so.0 (0xb7159000)
        libcairo.so.2 => /usr/lib/libcairo.so.2 (0xb70eb000)
        libXrender.so.1 => /usr/lib/libXrender.so.1 (0xb70e2000)
        libX11.so.6 => /usr/lib/libX11.so.6 (0xb6fc7000)
        libXext.so.6 => /usr/lib/libXext.so.6 (0xb6fb9000)
        libpng12.so.0 => /usr/lib/libpng12.so.0 (0xb6f77000)
        libfontconfig.so.1 => /usr/lib/libfontconfig.so.1 (0xb6f4e000)
        libexpat.so.0 => /usr/lib/libexpat.so.0 (0xb6f2e000)
        libfreetype.so.6 => /usr/lib/libfreetype.so.6 (0xb6eb8000)
        libz.so.1 => /usr/lib/libz.so.1 (0xb6ea4000)
        libm.so.6 => /lib/libm.so.6 (0xb6e7e000)
        libgobject-2.0.so.0 => /usr/lib/libgobject-2.0.so.0 (0xb6e43000)
        libgmodule-2.0.so.0 => /usr/lib/libgmodule-2.0.so.0 (0xb6e40000)
        libdl.so.2 => /lib/libdl.so.2 (0xb6e3c000)
        libglib-2.0.so.0 => /usr/lib/libglib-2.0.so.0 (0xb6d69000)
        libc.so.6 => /lib/libc.so.6 (0xb6c09000)
        librt.so.1 => /lib/librt.so.1 (0xb6bff000)
        libxcb.so.1 => /usr/lib/libxcb.so.1 (0xb6be7000)
        libXau.so.6 => /usr/lib/libXau.so.6 (0xb6be4000)
        libXdmcp.so.6 => /usr/lib/libXdmcp.so.6 (0xb6bdf000)
        /lib/ld-linux.so.2 (0xb7755000)
        libXcomposite.so.1 => /usr/lib/libXcomposite.so.1 (0xb6bdc000)
        libXdamage.so.1 => /usr/lib/libXdamage.so.1 (0xb6bd9000)
        libXfixes.so.3 => /usr/lib/libXfixes.so.3 (0xb6bd3000)
        libgio-2.0.so.0 => /usr/lib/libgio-2.0.so.0 (0xb6b6f000)
        libXinerama.so.1 => /usr/lib/libXinerama.so.1 (0xb6b6c000)
        libXi.so.6 => /usr/lib/libXi.so.6 (0xb6b63000)
        libXcursor.so.1 => /usr/lib/libXcursor.so.1 (0xb6b5a000)
        libexpat.so.1 => /usr/lib/libexpat.so.1 (0xb6b39000)
        libpixman-1.so.0 => /usr/lib/libpixman-1.so.0 (0xb6ae8000)

нам нужно найти вхождения этих библиотек в пакеты GTK+2 список которых был приведен в оригинальной статье: glib2, cairo, pango, atk,jasper, gtk+2
cd /var/log/packages
for i in `ldd /usr/local/bin/rejoystick|awk {'print $1'}`;do cat glib2* cairo* pango* atk* jasper* gtk+2*|grep $i;done
usr/lib/libgthread-2.0.so.0.1800.4
usr/lib/libgtk-x11-2.0.so.0.1400.7
usr/lib/libgdk-x11-2.0.so.0.1400.7
usr/lib/libatk-1.0.so.0.2609.1
usr/lib/libgdk_pixbuf-2.0.so.0.1400.7
usr/lib/libpangocairo-1.0.so.0.2203.1
usr/lib/libpangoft2-1.0.so.0.2203.1
usr/lib/libpango-1.0.so.0.2203.1
usr/lib/libcairo.so.2.10800.6
usr/lib/libgobject-2.0.so.0.1800.4
usr/lib/libgmodule-2.0.so.0.1800.4
usr/lib/libglib-2.0.so.0.1800.4
usr/lib/libgio-2.0.so.0.1800.4

осталось сформировать из этих файлов свой пакет, удалить стандартные заменив их одним своим
mkdir /tmp/rejoystick /tmp/rejoystick/usr /tmp/rejoystick/usr/bin /tmp/rejoystick/usr/lib
cp /usr/local/bin/rejoystick /tmp/rejoystick/bin
for k in $(for i in `ldd /usr/local/bin/rejoystick|awk {'print $1'}`;do cat glib2* cairo* pango* atk* jasper* gtk+2*|grep $i;done|sed "s/^usr/\/usr/");do cp $k /tmp/rejoystick/usr/lib;done
cd /tmp/rejoystick
/sbin/makepkg -l y -c n /tmp/rtorrent-i486-my.txz

Подведем итоги. мы получили пакет размером 2MB против того что было 8MB, причем это размер сжатых LZMA пакетов, в реальной системе экономия RAM будет более 10-20 MB.
Таким образом у нас "и волки сыты и овцы целы". Мы удалили из системы только те библиотеки которые нам действительно не нужны были и оставили только те которые были необходимы.

Где еще можно применить этот метод? rtorrent это пакет из одной програмы + документация. его зависимости: libsigc++, libtorrent, xmlrpc-c. Более половины пакета xmlrpc-c для работы rtorrent вобще не нужна. список неоходимых библиотек:
libsigc-2.0.so.0.0.0
libtorrent.so.11.0.5
libxmlrpc.so.3.21
libxmlrpc_server.so.3.21
libxmlrpc_util.so.3.21
libxmlrpc_xmlparse.so.3.21
libxmlrpc_xmltok.so.3.21

В общем, думаю тема раскрыта.

Комментариев нет:

Отправить комментарий