From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Date: Sat, 15 Apr 2006 02:42:33 +0400 From: Alexey Tourbin To: devel@altlinux.ru Message-ID: <20060414224233.GE11323@localhost> Mail-Followup-To: devel@altlinux.ru Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="4VrXvz3cwkc87Wze" Content-Disposition: inline Subject: [devel] rpmsoname: unmapped and multimapped sonames X-BeenThere: devel@lists.altlinux.org X-Mailman-Version: 2.1.7 Precedence: list Reply-To: ALT Devel discussion list List-Id: ALT Devel discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 14 Apr 2006 22:43:01 -0000 Archived-At: List-Archive: List-Post: --4VrXvz3cwkc87Wze Content-Type: multipart/mixed; boundary="19uQFt6ulqmgNgg1" Content-Disposition: inline --19uQFt6ulqmgNgg1 Content-Type: text/plain; charset=koi8-r Content-Disposition: inline Content-Transfer-Encoding: quoted-printable =EE=C5=CB=CF=D4=CF=D2=D9=C5 =D0=C1=CB=C5=D4=D9 =D0=D2=C5=C4=CF=D3=D4=C1=D7= =CC=D1=C0=D4 (provides) =CE=C5=DE=D4=CF =D0=CF=C8=CF=D6=C5=C5 =CE=C1 soname= '=D9; =D7 =D4=C1=CB=CF=CD =D3=CC=D5=DE=C1=C5 =C4=CF=CC=D6=C5=CE =D3=D5=DD=C5=D3= =D4=D7=CF=D7=C1=D4=D8 =C2=CF=CC=C5=C5 =C9=CC=C9 =CD=C5=CE=C5=C5 =CF=DE=C5= =D7=C9=C4=CE=D9=CA =D3=D0=CF=D3=CF=C2 =D3=CF=D0=CF=D3=D4=C1=D7=CC=C5=CE=C9=D1 soname'=C1 =C9 =D3=CF=CF=D4=D7=C5= =D4=D3=D4=D7=D5=C0=DD=C5=C7=CF =C6=C1=CA=CC=C1 =D7=CE=D5=D4=D2=C9 =D0=C1=CB= =C5=D4=C1. =E5=D3=CC=C9 =D6=C5 =CE=C5 =D5=C4=C1=C5=D4=D3=D1 =D0=CF soname'=D5 =CF=D0=D2=C5=C4=C5=CC= =C9=D4=D8 =C6=C1=CA=CC, =CB=CF=D4=CF=D2=D9=CA =DC=D4=CF=D4 soname =D0=D2=C5=C4=CF=D3=D4=C1=D7=CC=D1=C5=D4, =DC=D4=CF =CD=CF=D6=C5=D4 =C7=CF= =D7=CF=D2=C9=D4=D8 =CF=C2 =CF=DB=C9=C2=CB=C5. =F5=D4=CF=DE=CE=C5=CE=C9=D1: 1) basename =D5 =C6=C1=CA=CC=C1 =C4=CF=CC=D6= =C5=CE =D3=CF=D7=D0=C1=C4=C1=D4=D8 =D3 soname'=CF=CD (=DC=D4=CF =D7 =CE=C5=CB=CF=D4=CF=D2=CF=CD =D3=CD=D9=D3=CC=C5 =D1=D7=CC=D1=C5=D4=D3=D1 =CE= =C5=CF=C2=C8=CF=C4=C9=CD=D9=CD =C9 =C4=CF=D3=D4=C1=D4=CF=DE=CE=D9=CD =D5=D3= =CC=CF=D7=C9=C5=CD =C9=D3=D0=CF=CC=D8=DA=CF=D7=C1=CE=C9=D1 =D2=C1=DA=C4=C5=CC=D1=C5=CD=CF=CA = =C2=C9=C2=CC=C9=CF=D4=C5=CB=C9); 2) =D3=C9=CD=CC=C9=CE=CB=C9 =C4=CF=CC=D6= =CE=D9 =D2=C1=DA=D2=C5=DB=C1=D4=D8=D3=D1 =D7 =D0=D2=C5=C4=C5=CC=C1=C8 =D0=C1=CB=C5=D4=C1. =F7=CF=D4 =D3=D0=C9=D3=CF=CB =D0=C1=CB=C5=D4=CF=D7 =D3 =D0=CF=D4=C5=CE=C3= =C9=C1=CC=D8=CE=D9=CD=C9 =CF=DB=C9=C2=CB=C1=CD=C9. at@mash ~ $ time CMDCACHE_DISABLE=3D1 rpmsoname ~sisyphus/files/i586/RPMS >= /dev/null warning: ananas-engine-qt-0.9.2-alt1.i586.rpm: multimapped sonames: libananasplugin.so /usr/lib/libananasplugin.so libananasplugin.so /usr/lib/qt3/plugins/designer/libananasplugin.so warning: bzlib-devel-1.0.3-alt5.i586.rpm: unmapped sonames: libbz2.so warning: jpilot-Mail-0.0.6-alt4.i586.rpm: unmapped sonames: libmail.so.0 warning: libbluez-2.25-alt1.i586.rpm: unmapped sonames: libsdp.so.2 warning: libx264-devel-0.0-alt0.20060330.2.i586.rpm: unmapped sonames: libx264.so warning: linuxsampler-0.3.3-alt1.i586.rpm: unmapped sonames: liblinuxsampler.so.0 warning: unixODBC-2.2.11-alt2.1.i586.rpm: unmapped sonames: libodbc.so libodbcinst.so CMDCACHE_DISABLE=3D1 rpmsoname ~sisyphus/files/i586/RPMS > /dev/null 425.7= 0s user 84.80s system 93% cpu 9:05.14 total at@mash ~ $=20 (=E4=C1=CC=C5=C5 =D0=D2=C9=CC=CF=D6=C5=CE =D3=CF=C2=D3=D4=D7=C5=CE=CE=CF = =D3=CB=D2=C9=D0=D4.) --19uQFt6ulqmgNgg1 Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename=rpmsoname #!/bin/sh -ef export LC_ALL=C rpmsoname() { rpm -qp --qf '[%{PROVIDES}\n]' "$1" >prov || return grep -E '^lib[^/()]+[.]so\>[^/()]*$' prov >sonames || return 0 # Files map to themselves; symbolic links cause a headache. # Sample file entry: perl5.8.7 /usr/bin/perl5.8.7 # Sample link etnry: libperl.so.5.8 /usr/lib/libperl.so.5.8 libperl.so.5.8.7 rpm -qp --qf '[%{BASENAMES}\t%{FILENAMES}\t%{FILELINKTOS}\n]' "$1" >list awk -F'\t' '$NF==""{print$1"\t"$2}$NF{print>"/dev/fd/3"}' list >files 3>links # Make links absolute. Sample diff: # -perl5 /usr/bin/perl5 perl5.8.7 # +perl5 /usr/bin/perl5 /usr/bin/perl5.8.7 perl -MFile::Spec::Functions=rel2abs -MFile::Basename=dirname -ni -aF'\t' -le \ '$F[-1]=rel2abs$F[-1],dirname$F[-2];{$F[-1]=~s$/[^/]+/\.\./$/$&&redo}$,="\t",print@F' links # Now follow links (i.e. a->b,b->c => a->c,b->c). Sample diff: # -libpri.so /usr/lib/libpri.so /usr/lib/libpri.so.1 # +libpri.so /usr/lib/libpri.so /usr/lib/libpri.so.1.0 # libpri.so.1 /usr/lib/libpri.so.1 /usr/lib/libpri.so.1.0 while :; do sort -t$'\t' -o links1 -k3,3 links sort -t$'\t' -o links2 -k2,2 links join -t$'\t' -13 -22 -o '1.1 1.2 2.3' links1 links2 >elinks [ -s elinks ] || break sort -t$'\t' -o links -u -k1,2 elinks links done # Join links against files. sort -t$'\t' -o files -k2 files sort -t$'\t' -o links -k3 links join -t$'\t' -12 -23 -o '2.1 2.3' files links >filelinks join -t$'\t' -12 -23 -o '2.1 2.3' -v2 files links >externlinks # Now ready to join sonames on files+filelinks. sort -o sonames -u sonames sort -o map -u files filelinks join -t$'\t' -j 1 -o '2.1 2.2' sonames map >mapped join -t$'\t' -j 1 -o 0 -v1 sonames map >unmapped # The results. awk -F'\t' '{print$2"\t"$1}' mapped |sort -u # Now warnings. join -t$'\t' -j 1 -o '1.1 1.2 2.2' mapped mapped |awk -F'\t' \ '$2!=$3{print$1"\t"$2}' >multimapped if [ -s multimapped ]; then echo "warning: ${1##*/}: multimapped sonames:" sort -u multimapped fi >&2 if [ -s unmapped ]; then echo "warning: ${1##*/}: unmapped sonames:" # TODO: extra analysis based on externlinks sort -u unmapped fi >&2 } . cmdcache "" . rpmargs -c "cmdcache rpmsoname" "$@" : <<'__EOF__' =head1 NAME rpmsoname - list files that provide sonames in RPM package(s) =head1 SYNOPSIS B [B<-h>] [I] [I...] [I...] =head1 DESCRIPTION B produces two-column output (typically one line per each soname). Column one contains file path; column two contains corresponding soname. When processing a directory, an additional column is prepended to the output, which is typically RPM file basename. Note that the name B is probably a misnomer: the script does not deal with ELF C entries. What it does is try to map soname-like entries from RPM C list to regular files within the very same RPM package (using C, C, and C lists from RPM header). =head1 OPTIONS Options and arguments manage a set of RPM packages to be processed; they are those of rpmargs(1). =head1 AUTHOR Written by Alexey Tourbin . =head1 COPYING Copyright (c) 2006 Alexey Tourbin, ALT Linux Team. This is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. =head1 SEE ALSO rpmargs(1) =cut __EOF__ --19uQFt6ulqmgNgg1-- --4VrXvz3cwkc87Wze Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.1 (GNU/Linux) iD8DBQFEQCVZfBKgtDjnu0YRAl//AJ0bEJaxhZDU7/dn27Gyr5xWmr+lSgCfeOcj Qu+D5WDCI1Pkb1frxvj/mC4= =TFSf -----END PGP SIGNATURE----- --4VrXvz3cwkc87Wze--