[devel] zlib addicts
Alexey Tourbin
=?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Сб Окт 8 14:08:42 MSD 2005
On Fri, Oct 07, 2005 at 07:29:03PM +0400, Dmitry V. Levin wrote:
> On Mon, Sep 26, 2005 at 05:19:10AM +0400, Alexey Tourbin wrote:
> > Следующие пакеты (предположительно) таскают с собой zlib.
>
> $ grep -w zlibVersion def |grep -wv ^zlib
> erlang /usr/lib/erlang/erts-5.4/bin/beam.shared T zlibVersion
> erlang /usr/lib/erlang/erts-5.4/bin/beam T zlibVersion
> firefox /usr/lib/firefox-1.0.6/install/mozilla-installer-bin T zlibVersion
> firefox /usr/lib/firefox-1.0.6/mozilla-installer-bin T zlibVersion
> j2se1.3-sun /usr/lib/j2se1.3-sun/jre/lib/i386/libzip.so T zlibVersion
> openoffice.org /usr/lib/OpenOffice.org1.1.5/program/libmozz.so T zlibVersion
> R-base /usr/lib/R/bin/libR.so T zlibVersion
> R-base /usr/lib/R/bin/R.bin T zlibVersion
> scorched3d /usr/games/scorched3d T zlibVersion
> vnc-server /usr/bin/Xvnc T zlibVersion
> xmule /usr/bin/xmule T zlibVersion
>
> Просьба развесить баги.
Много чести zlib'у будет. Нужно искать все пакеты, которые таскают с
собой системные библиотеки. В первом приближении можно сделать вот что.
1) Выделить подмножество списка def: символы, которые прдоставляют
системные библиотеки.
$ awk -F'\t' '$2~"^(/usr(/X11R6)?)?/lib(64)?/lib[^/]+[.]so"' def >libdef
$ du -hs libdef def
85M libdef
211M def
$
2) Сделать join (libdef x def) по символам.
$ join -t$'\t' -j 4 -o '1.1 1.2 1.3 2.1 2.2 2.3 0' libdef def |head
libgcj3.3 /usr/lib/libgcj.so.4.0.0 B libgcj3.3 /usr/lib/libgcj.so.4.0.0 B A
libgcj3.3 /usr/lib/libgcj.so.4.0.0 B libgcj3.3-debug /usr/lib/debug/libgcj.so.4.0.0 B A
libgcj3.3 /usr/lib/libgcj.so.4.0.0 B libgcj3.4 /usr/lib/libgcj.so.5.0.0 B A
libgcj3.3 /usr/lib/libgcj.so.4.0.0 B libgcj3.4-debug /usr/lib/debug/libgcj.so.5.0.0 B A
libgcj3.4 /usr/lib/libgcj.so.5.0.0 B libgcj3.3 /usr/lib/libgcj.so.4.0.0 B A
libgcj3.4 /usr/lib/libgcj.so.5.0.0 B libgcj3.3-debug /usr/lib/debug/libgcj.so.4.0.0 B A
libgcj3.4 /usr/lib/libgcj.so.5.0.0 B libgcj3.4 /usr/lib/libgcj.so.5.0.0 B A
libgcj3.4 /usr/lib/libgcj.so.5.0.0 B libgcj3.4-debug /usr/lib/debug/libgcj.so.5.0.0 B A
libfaac /usr/lib/libfaac.so.0.0.0 T libfaac /usr/lib/libfaac.so.0.0.0 T AACQuantize
libfaac /usr/lib/libfaac.so.0.0.0 T libfaac /usr/lib/libfaac.so.0.0.0 T AACQuantizeEnd
$
Это прямое произведение, его даже бесполезно пробовать сохранять на
диске. Для серьезной работы с такими вещами нужны ленивые вычисления,
как минимум что-то вроде SQL views.
3) Из этого списка нужно убрать собственные совпадения, то есть
cовпадения (библиотека == библиотека). Ищем только совпадения
(библиотека == бинарь). Ищем также совпадения по типу сивола (здесь бы
нужно делать join по составному ключу тип+символ, но join(1) этого не
умеет). Это уже можно будет попробовать сохранить на диске.
$ join -t$'\t' -j 4 -o '1.1 1.2 1.3 2.1 2.2 2.3 0' libdef def |
awk -F'\t' '{OFS="\t"}$2!=$5&&$3==$6{print$1,$2,$4,$5,$6,$7}' >product
^C
$ du -hs product
915M product
$
Не удается сохранить на диск.
$ head product
libgcj3.3 /usr/lib/libgcj.so.4.0.0 libgcj3.3-debug /usr/lib/debug/libgcj.so.4.0.0 B A
libgcj3.3 /usr/lib/libgcj.so.4.0.0 libgcj3.4 /usr/lib/libgcj.so.5.0.0 B A
libgcj3.3 /usr/lib/libgcj.so.4.0.0 libgcj3.4-debug /usr/lib/debug/libgcj.so.5.0.0 B A
libgcj3.4 /usr/lib/libgcj.so.5.0.0 libgcj3.3 /usr/lib/libgcj.so.4.0.0 B A
libgcj3.4 /usr/lib/libgcj.so.5.0.0 libgcj3.3-debug /usr/lib/debug/libgcj.so.4.0.0 B A
libgcj3.4 /usr/lib/libgcj.so.5.0.0 libgcj3.4-debug /usr/lib/debug/libgcj.so.5.0.0 B A
libinn /usr/lib/libstorage.so.2.0.0 inn /usr/bin/nnrpd B ACTIVE
libinn /usr/lib/libstorage.so.2.0.0 inn /usr/bin/tdx-util B ACTIVE
libfreewrl /usr/lib/libFreeWRLFunc.so freewrl /usr/lib/perl5/vendor_perl/i386-linux/auto/VRML/VRMLFunc/VRMLFunc.so D AC_LastDuration
libfreewrl /usr/lib/libFreeWRLFunc.so freewrl /usr/lib/perl5/vendor_perl/i386-linux/auto/VRML/VRMLFunc/libFreeWRLFunc.so D AC_LastDuration
$
Ну ясно, что получается. Слева -- системная библиотека, справа --
бинарь (возможно, другая системная библиотека), которая предоставляет
такой же символ.
Нужно понять, что там "забилось".
$ cut -f5,6 product |uniq -c -f1 |sort -n |tail
169 A WX_2.6
182 T ODBCINSTGetProperties
253 A GLIBC_PRIVATE
278 A EXPORTED
327 T Mod_Init
510 A GLIBC_2.0
756 T MD5Final
756 T MD5Init
756 T MD5Update
9487118 A _DYNAMIC
$
3a) Ясно, пробуем ещё раз, исключив символы типа [A].
$ join -t$'\t' -j 4 -o '1.1 1.2 1.3 2.1 2.2 2.3 0' libdef def |
awk -F'\t' '{OFS="\t"}$2!=$5&&$3==$6&&$3!="A"{print$1,$2,$4,$5,$6,$7}' >product
^C
$ du -hs product
515M product
$
Опять забилось.
$ cut -f5,6 product |uniq -c -f1 |sort -n
...
24920 a _DYNAMIC
29465 W _ZNK17QValueListPrivateI7QStringE2atEj
56098 V _ZTI9QMemArrayIcE
56098 V _ZTS9QMemArrayIcE
56208 V _ZTV9QMemArrayIcE
56208 W _ZN9QMemArrayIcE6detachEv
56208 W _ZN9QMemArrayIcED0Ev
56208 W _ZN9QMemArrayIcED1Ev
57237 W _Z4endlR11kndbgstream
61386 W _Z4endlR10kdbgstream
105193 W _ZN7QWidget11setGeometryERK5QRect
107391 W _ZN10QValueListI7QStringE14detachInternalEv
107391 W _ZN17QValueListPrivateI7QStringE6insertE18QValueListIteratorIS0_ERKS0_
109473 W _ZN17QValueListPrivateI7QStringEC1ERKS1_
111298 W _ZN17QValueListPrivateI7QStringEC1Ev
124924 W _ZN7QWidget9setWFlagsEj
124924 W _ZN7QWidget9setWStateEj
139398 W _ZN17QValueListPrivateI7QStringED1Ev
331113 V _ZTI6QGList
331113 V _ZTS6QGList
337244 V _ZTV6QGList
337244 W _ZNK6QGList5countEv
$
3б) Okay, что делать с [VW], я не знаю. Проще всего перестроить список
libdef, оставив только символы [BDT] -- глобальные переменные и функции.
$ awk -F'\t' '$2~"^(/usr(/X11R6)?)?/lib(64)?/lib[^/]+[.]so"&&$3~/[BDT]/' def >libdef
$ du -hs libdef
56M libdef
$ join -t$'\t' -j 4 -o '1.1 1.2 1.3 2.1 2.2 2.3 0' libdef def |
awk -F'\t' '{OFS="\t"}$2!=$5&&$3==$6{print$1,$2,$4,$5,$6,$7}' >product
^C
$ du -hs product
352M product
$
Опять забивается, из-за символов "T _fini" и "T _init".
Самые частые символы нужно удалить из libdef.
3в) Перестраиваем libdef без символов _fini и _init.
$ awk -F'\t' '$2~"^(/usr(/X11R6)?)?/lib(64)?/lib[^/]+[.]so"&&$3~/[BDT]/&&$4!="_fini"&&$4!="_init"' def >libdef
$ join -t$'\t' -j 4 -o '1.1 1.2 1.3 2.1 2.2 2.3 0' libdef def |
awk -F'\t' '{OFS="\t"}$2!=$5&&$3==$6{print$1,$2,$4,$5,$6,$7}' >product
$ du -hs product
113M product
$
Во! Получилось.
$ tail product
libclamav /usr/lib/libclamav.so.1.0.16 zziplib /usr/lib/libzzip-0-64.so.13.0.38 T zzip_seterror
zziplib /usr/lib/libzzip-0-64.so.13.0.38 libclamav /usr/lib/libclamav.so.1.0.16 T zzip_seterror
libclamav /usr/lib/libclamav.so.1.0.16 zziplib /usr/lib/libzzip-0-64.so.13.0.38 T zzip_strerror
zziplib /usr/lib/libzzip-0-64.so.13.0.38 libclamav /usr/lib/libclamav.so.1.0.16 T zzip_strerror
libclamav /usr/lib/libclamav.so.1.0.16 zziplib /usr/lib/libzzip-0-64.so.13.0.38 T zzip_strerror_of
zziplib /usr/lib/libzzip-0-64.so.13.0.38 libclamav /usr/lib/libclamav.so.1.0.16 T zzip_strerror_of
libclamav /usr/lib/libclamav.so.1.0.16 zziplib /usr/lib/libzzip-0-64.so.13.0.38 T zzip_tell
zziplib /usr/lib/libzzip-0-64.so.13.0.38 libclamav /usr/lib/libclamav.so.1.0.16 T zzip_tell
libclamav /usr/lib/libclamav.so.1.0.16 zziplib /usr/lib/libzzip-0-64.so.13.0.38 T zzip_telldir
zziplib /usr/lib/libzzip-0-64.so.13.0.38 libclamav /usr/lib/libclamav.so.1.0.16 T zzip_telldir
$
Из этого видно, что библиотека libclamav, похоже, таскает с собой
библиотеку zziplib (или статически с ней слинкована).
Проверяем, где у нас zlibVersion.
$ grep -w zlibVersion product
zlib /lib/libz.so.1.2.3 R-base /usr/lib/R/bin/R.bin T zlibVersion
zlib /lib/libz.so.1.2.3 R-base /usr/lib/R/bin/libR.so T zlibVersion
zlib /lib/libz.so.1.2.3 erlang /usr/lib/erlang/erts-5.4/bin/beam T zlibVersion
zlib /lib/libz.so.1.2.3 erlang /usr/lib/erlang/erts-5.4/bin/beam.shared T zlibVersion
zlib /lib/libz.so.1.2.3 firefox /usr/lib/firefox-1.0.6/install/mozilla-installer-bin T zlibVersion
zlib /lib/libz.so.1.2.3 firefox /usr/lib/firefox-1.0.6/mozilla-installer-bin T zlibVersion
zlib /lib/libz.so.1.2.3 j2se1.3-sun /usr/lib/j2se1.3-sun/jre/lib/i386/libzip.so T zlibVersion
zlib /lib/libz.so.1.2.3 openoffice.org /usr/lib/OpenOffice.org1.1.4/program/libmozz.so T zlibVersion
zlib /lib/libz.so.1.2.3 scorched3d /usr/games/scorched3d T zlibVersion
zlib /lib/libz.so.1.2.3 vnc-server /usr/bin/Xvnc T zlibVersion
zlib /lib/libz.so.1.2.3 xmule /usr/bin/xmule T zlibVersion
$
Нужно теперь подумать, что делать с этим списком.
Я бы его кому-нибудь продал. Всего ничего, доллар за мегабайт. :)
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Тип : application/pgp-signature
Размер : 189 байтов
Описание: =?iso-8859-1?q?=CF=D4=D3=D5=D4=D3=D4=D7=D5=C5=D4?=
Url : <http://lists.altlinux.org/pipermail/devel/attachments/20051008/9b8a0eba/attachment-0001.bin>
Подробная информация о списке рассылки Devel