[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