[devel] list of libraries within binaries [2] (for sale or rent!)
Alexey Tourbin
=?iso-8859-1?q?at_=CE=C1_altlinux=2Eru?=
Вс Окт 16 02:39:32 MSD 2005
On Sat, Oct 08, 2005 at 04:00:26PM +0400, Alexey Tourbin wrote:
> Теперь ничего не стоит получить список бинарей, которые подозреваются
> в том, что статически слинкованы с библиотеками.
>
> $ cut -f2,4 product |sort |uniq -cd >suspect
> $ du -hs suspect
> 816K suspect
> $ head suspect
> 51 /lib/libaal-1.0.so.5.0.0 /lib/libaal-minimal.so.0.0.0
> 2 /lib/libaal-1.0.so.5.0.0 /usr/lib/libgift.so.0.0.0
> 2 /lib/libaal-1.0.so.5.0.0 /usr/lib/libmpfc-1.3.5.so
> 51 /lib/libaal-minimal.so.0.0.0 /lib/libaal-1.0.so.5.0.0
> 4 /lib/libanl-2.3.5.so /usr/lib/debug/libanl-2.3.5.so
> 12 /lib/libattr.so.1.1.0 /lib/libc-2.3.5.so
> 12 /lib/libattr.so.1.1.0 /usr/lib/debug/libc-2.3.5.so
> 2 /lib/libattr.so.1.1.0 /usr/lib/libncurses.so.5.4
> 24 /lib/libbz2.so.1.0.3 /usr/lib/R/bin/R.bin
> 24 /lib/libbz2.so.1.0.3 /usr/lib/R/bin/libR.so
> $
>
> В первой колонке здесь число совпадающих символов, которые предоставляют
> два эти (во второй и тертьей колонке) бинаря. `uniq -d' исключает
> одиночные случайные совпадения.
Получен полный product (def x def). Кто в танке, можно смотреть:
/raid/at/qa/qa-robot/dup_elf_symbols
mash:~at/.qa-robot/dup_elf_symbols/product
mash:~at/.qa-robot/dup_elf_symbols/suspect
То есть теперь можно искать совпадения символов между двумя произвольно
взятыми elf'ами (здесь есть много тонкостей, но в целом утверждение
верно). Большое число совпадающих символов чаще всего означает
дублирование кода.
----------- следующая часть -----------
#!/bin/sh -ef
cd "${workdir:?}"
rpmelfsym -ap >sym
awk -F'\t' '$3~/[DT]/' sym >def
sort -t$'\t' -k4 -o def def
nelf=`sort -u -k2,2 def |wc -l`
cut -f4 def |uniq -cd >freq
awk -v n=$nelf '$1<sqrt(7*n){print$NF}' freq >defsym
sort -o defsym -u defsym
join -t$'\t' -14 -21 -o '1.1 1.2 1.3 1.4' def defsym >xdef
# product ::= pkg1 elf1 pkg2 elf2 symtype symname
join -t$'\t' -j 4 -o '1.1 1.2 1.3 2.1 2.2 2.3 0' xdef xdef |
awk -F'\t' 'function prio(f) {
if (f~"^/lib/lib[^/]+[.]so[^/]*$") return 1
if (f~"^/usr/lib/lib[^/]+[.]so[^/]*$") return 2
if (f~"^/usr/X11R./lib/lib[^/]+[.]so[^/]*$") return 3
if (f~"lib/lib[^/]+[.]so[^/]*$") return 4
if (f~"/lib[^/]+[.]so[^/]*$") return 5
if (f~"[^/][.]so[^/]*$") return 6
return 9
}
($2<$5 && $3==$6) {
OFS="\t"
pd = prio($2)-prio($5)
if (pd<0 || pd==0 && length($2)<=length($5))
print $1,$2,$4,$5,$6,$7
else
print $4,$5,$1,$2,$6,$7 }' >product
# suspect ::= pkg1 elf1 pkg2 elf2 symtype nsym
cut -f-5 product |sort |uniq -cd |sed 's/^ *\([0-9]\+\) \+\(.\+\)$/\2\t\1/' >suspect
sort -o suspect -u suspect
cat suspect
cd -
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя : =?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/20051015/9f9562ad/attachment-0001.bin>
Подробная информация о списке рассылки Devel