[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