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 $ Нужно теперь подумать, что делать с этим списком. Я бы его кому-нибудь продал. Всего ничего, доллар за мегабайт. :)