pewna choroba .. rpathoza

Tomasz Kłoczko kloczek w rudy.mif.pg.gda.pl
Pon, 14 Paź 2002, 10:57:28 CEST


Wychodzi na to że toczy ona nie tylko nas ale niemal wszystkich.
Objawy: pojawianie się w nagłówku elfowym binarek w polach RPATH (objdump 
-x <elf_bin> | grep RPATH) ścierzek które są w liście ścieżek ld.so.conf, 
a także innych ścieżek które są czy to jakiś przypadkowy sposób 
specjalnie zaszyte czy też sa wynikamui braku relinkowania przy 
instalacji.
Przykładowo sprawdziłem sobie, że ta choroba nie dotyczy Debiana:

$ chrpath libqt.so.3.0.5 
libqt.so.3.0.5: no rpath or runpath tag found.

gdy tymczasem nasze:

$ chrpath /usr/X11R6/lib/libqt.so.3.0.5 
/usr/X11R6/lib/libqt.so.3.0.5: RPATH=/home/users/builder/rpm/BUILD/qt-x11-free-3.0.5/lib/

Kilka innych kawałków:

$ chrpath /bin/* 2>&1 | grep RPATH | wc -l 
      0

tu jest OK.

$ chrpath /lib/*so* 2>&1 | grep RPATH        
/lib/libhistory.so.4: RPATH=/usr/lib
/lib/libhistory.so.4.3: RPATH=/usr/lib
/lib/libpam_misc.so.0: RPATH=/home/users/builder/rpm/BUILD/pam-pld-0.77.0/libpam/.libs
/lib/libpam_misc.so.0.77.0: RPATH=/home/users/builder/rpm/BUILD/pam-pld-0.77.0/libpam/.libs
/lib/libreadline.so.4: RPATH=/usr/lib
/lib/libreadline.so.4.3: RPATH=/usr/lib

(Janek jest byk w pam)

$ chrpath /usr/lib/*so.* 2>&1 | grep RPATH
/usr/lib/libast.so.1: RPATH=/usr/X11R6/lib
/usr/lib/libast.so.1.0.3: RPATH=/usr/X11R6/lib
/usr/lib/libboundparam.so.1: RPATH=/home/users/builder/rpm/BUILD/unixODBC-2.1.1/DriverManager/.libs
/usr/lib/libboundparam.so.1.0.0: RPATH=/home/users/builder/rpm/BUILD/unixODBC-2.1.1/DriverManager/.libs
/usr/lib/libclanApp.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanApp.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanCore.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanCore.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanDisplay.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanDisplay.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanGL.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanGL.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanGUI.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanGUI.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanJPEG.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanJPEG.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanMagick.so.0: RPATH=/usr/lib/ClanLib
/usr/lib/libclanMagick.so.0.4.3: RPATH=/usr/lib/ClanLib
/usr/lib/libclanMikMod.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanMikMod.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanNetwork.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanNetwork.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanPNG.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanPNG.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanSmallJPEG.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanSmallJPEG.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanSound.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanSound.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanTTF.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanTTF.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanVorbis.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanVorbis.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libcupsimage.so.2: RPATH=/usr/lib
/usr/lib/libcups.so.2: RPATH=/usr/lib
/usr/lib/libguilereadline.so.0: RPATH=/usr/lib
/usr/lib/libguilereadline.so.0.0.1: RPATH=/usr/lib
/usr/lib/liblapack.so.3: RPATH=/home/users/builder/rpm/BUILD/LAPACK/BLAS/SRC/.libs
/usr/lib/liblapack.so.3.0.0: RPATH=/home/users/builder/rpm/BUILD/LAPACK/BLAS/SRC/.libs
/usr/lib/libmp3lame.so.0: RPATH=/usr/lib
/usr/lib/libmp3lame.so.0.0.0: RPATH=/usr/lib
/usr/lib/libodbccr.so.1: RPATH=/home/users/builder/rpm/BUILD/unixODBC-2.1.1/DriverManager/.libs
/usr/lib/libodbccr.so.1.0.0: RPATH=/home/users/builder/rpm/BUILD/unixODBC-2.1.1/DriverManager/.libs
/usr/lib/libsasl.so.7: RPATH=/usr/local/lib
/usr/lib/libsasl.so.7.1.10: RPATH=/usr/local/lib

Co ciekawsze /usr/lib/ClanLib to ścieżka .. dość z powietrza :>
w sasl /usr/local/lib w RPATH będzie powodować że o ile będzie tam kopia 
jakis bibliotek z którymi jest to zlinkowane to najpierw z tym bedzie to 
linkowane .. mówiąc inaczej powinien to być *dość prosty sposób na*
*podłożenie trojana* (+$%#@! KJM :->)

$ chrpath /usr/lib/*so.* 2>&1 | grep RPATH | grep -v X11R6 
/usr/lib/libboundparam.so.1: RPATH=/home/users/builder/rpm/BUILD/unixODBC-2.1.1/DriverManager/.libs
/usr/lib/libboundparam.so.1.0.0: RPATH=/home/users/builder/rpm/BUILD/unixODBC-2.1.1/DriverManager/.libs
/usr/lib/libclanApp.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanApp.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanCore.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanCore.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanDisplay.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanDisplay.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanGL.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanGL.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanGUI.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanGUI.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanJPEG.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanJPEG.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanMagick.so.0: RPATH=/usr/lib/ClanLib
/usr/lib/libclanMagick.so.0.4.3: RPATH=/usr/lib/ClanLib
/usr/lib/libclanMikMod.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanMikMod.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanNetwork.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanNetwork.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanPNG.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanPNG.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanSmallJPEG.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanSmallJPEG.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanSound.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanSound.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanTTF.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanTTF.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libclanVorbis.so.0.6.1: RPATH=/usr/lib/ClanLib
/usr/lib/libclanVorbis.so.2: RPATH=/usr/lib/ClanLib
/usr/lib/libcupsimage.so.2: RPATH=/usr/lib
/usr/lib/libcups.so.2: RPATH=/usr/lib
/usr/lib/libguilereadline.so.0: RPATH=/usr/lib
/usr/lib/libguilereadline.so.0.0.1: RPATH=/usr/lib
/usr/lib/liblapack.so.3: RPATH=/home/users/builder/rpm/BUILD/LAPACK/BLAS/SRC/.libs
/usr/lib/liblapack.so.3.0.0: RPATH=/home/users/builder/rpm/BUILD/LAPACK/BLAS/SRC/.libs
/usr/lib/libmp3lame.so.0: RPATH=/usr/lib
/usr/lib/libmp3lame.so.0.0.0: RPATH=/usr/lib
/usr/lib/libodbccr.so.1: RPATH=/home/users/builder/rpm/BUILD/unixODBC-2.1.1/DriverManager/.libs
/usr/lib/libodbccr.so.1.0.0: RPATH=/home/users/builder/rpm/BUILD/unixODBC-2.1.1/DriverManager/.libs

$ chrpath /usr/{,X11R6/}/bin/* 2>&1 | grep RPATH              
/usr//bin/aaxine: RPATH=/usr/lib:/usr/X11R6/lib
/usr//bin/bb: RPATH=/usr/lib
/usr//bin/botti: RPATH=/usr/lib/perl5/5.6.1/i686-pld-linux/CORE
/usr//bin/cjpeg: RPATH=/usr/lib
/usr//bin/djpeg: RPATH=/usr/lib
/usr//bin/irssi: RPATH=/usr/lib/perl5/5.`/usr//bin/isc-config.sh' probably isn't a 32-bit LSB-first ELF file.
/usr//bin/jpegtran: RPATH=/usr/lib
/usr//bin/jv-convert: RPATH=/usr/lib

W przypadku irssi jak widać w rpath trafia już kompletny kosmos :>
Kilak tego typu "odlotowych" RPATH jest na modułach w podkatalogach w 
%{_libdir}.
libperl.so mamy w %{_libdir} także /usr//bin/botti też ma niepotzrebnie 
rpath.

Jak widć jest tego conajmniej sporo. Poprawiać to usuwając wszędzie gdzie
się da -rpath z linkowania to byłaby mordęga.

Kjur: ano użyć w %install_post po stripowaniu kawałka skryptu który wywoła
"chrpath -d" po wszystkich znalezionych binarkach (czyli po tej samej
liście co lata strip).
Jakby ktoś się pytał po co to robić to efektem usunięcia wszystkich rpath
będzie szybsze ładowanie sie programów które miały do tej pory rpath.

Po przeróbce %install_post w sumie do 1.0 można olać RPATH o ile są na
/usr/lib czy /usr/X11R6/lib ale kilka innych w których ścieżki są z
powitrza brać z braku relinkowania przy make install dobzre byłoby puścić
do przebudowania, a na pewno cyrus-sasl jest do pzrepuszczenai jeszcze 
raz.

kloczek
-- 
-----------------------------------------------------------
*Ludzie nie mają problemów, tylko sobie sami je stwarzają*
-----------------------------------------------------------
Tomasz Kłoczko, sys adm @zie.pg.gda.pl|*e-mail: kloczek w rudy.mif.pg.gda.pl*



Więcej informacji o liście dyskusyjnej pld-devel-pl